{"id":22614342,"url":"https://github.com/melchisedech333/transistor-simulator","last_synced_at":"2025-06-21T06:05:47.241Z","repository":{"id":61078589,"uuid":"547599134","full_name":"melchisedech333/transistor-simulator","owner":"melchisedech333","description":":fire: This project performs a simulation of N and P-type MOSFET transistors. Next, the creation of logic gates is performed using the simulated transistors. Then, a Half-Adder mechanism is created with the logic gates, to later use it in a binary sum algorithm.","archived":false,"fork":false,"pushed_at":"2022-10-17T19:09:13.000Z","size":385,"stargazers_count":11,"open_issues_count":0,"forks_count":4,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-11T11:49:57.546Z","etag":null,"topics":["binary-calculations","binary-calculator","circuit","circuit-simulation","circuit-simulator","circuits","circuits-simulator","mosfet","mosfet-transistor","mosfets","semiconductor","semiconductors","transistor","transistor-level","transistor-modeling","transistor-switch","transistor-tester","transistors"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/melchisedech333.png","metadata":{"files":{"readme":"readme-pt.md","changelog":null,"contributing":null,"funding":null,"license":"license","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-10-08T00:38:41.000Z","updated_at":"2025-01-27T03:12:31.000Z","dependencies_parsed_at":"2022-10-09T20:01:55.464Z","dependency_job_id":null,"html_url":"https://github.com/melchisedech333/transistor-simulator","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/melchisedech333/transistor-simulator","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/melchisedech333%2Ftransistor-simulator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/melchisedech333%2Ftransistor-simulator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/melchisedech333%2Ftransistor-simulator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/melchisedech333%2Ftransistor-simulator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/melchisedech333","download_url":"https://codeload.github.com/melchisedech333/transistor-simulator/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/melchisedech333%2Ftransistor-simulator/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261073338,"owners_count":23105639,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["binary-calculations","binary-calculator","circuit","circuit-simulation","circuit-simulator","circuits","circuits-simulator","mosfet","mosfet-transistor","mosfets","semiconductor","semiconductors","transistor","transistor-level","transistor-modeling","transistor-switch","transistor-tester","transistors"],"created_at":"2024-12-08T18:09:25.313Z","updated_at":"2025-06-21T06:05:42.220Z","avatar_url":"https://github.com/melchisedech333.png","language":"C","funding_links":["https://github.com/sponsors/melchisedech333"],"categories":[],"sub_categories":[],"readme":"\n\u003cdiv align='center'\u003e\n\n\u003cimg src=\"images/banner.jpg\" width=\"100%\" \u003e\n\n\u003c/div\u003e\n\n\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/sponsors/melchisedech333\"\u003e\u003cimg src=\"https://img.shields.io/badge/patrocinar-30363D?style=for-the-badge\u0026logo=GitHub-Sponsors\u0026logoColor=#white\" \u003e\u003c/a\u003e\n    \u003cbr\u003e\u003cbr\u003e\n    \u003cimg src=\"https://badgen.net/badge/nível de amor/9 de 10/purple\" \u003e\n    \u003cimg src=\"https://img.shields.io/github/languages/count/melchisedech333/transistor-simulator?color=%23f34b7d\u0026label=linguagens\" \u003e\n    \u003cimg src=\"https://img.shields.io/github/languages/top/melchisedech333/transistor-simulator?color=%23f34b7d\" \u003e\n    \u003cimg src=\"https://img.shields.io/github/directory-file-count/melchisedech333/transistor-simulator?label=arquivos\" \u003e\n    \u003cimg src=\"https://img.shields.io/github/repo-size/melchisedech333/transistor-simulator?label=tamanho repo\" \u003e\n    \u003cimg src=\"https://img.shields.io/github/license/melchisedech333/transistor-simulator?label=licen%C3%A7a\" \u003e\n\u003c/p\u003e\n\nLanguage: \u003ca href=\"readme.md\"\u003eEN-US\u003c/a\u003e\n\nPrimeiramente é importante deixar claro que fiz este código para me divertir. Eu tenho muita vontade de desenvolver coisas utilizando transistores, por isso fiz este código. E também simplesmente me deu uma vontade muito grande de criar um código que fizesse soma binária utilizando portas lógicas, mas também que essas portas lógicas fossem construídas com transistores (o mais próximo possível do funcionamento de transistores reais).\n\nNo código eu crio os 2 tipos conhecidos de transistores MOSFET (N e P). Importante deixar claro que os transistores trabalham apenas com dois níveis de tensão, representados por 0 e 1, onde 0 significa nenhuma tensão aplicada (e nenhuma corrente elétrica passando pelos canais de Drain e Source), e 1 significa que há um valor X de tensão ou corrente elétrica aplicada nos respectivos canais.\n\nVale lembrar que o funcionamento básico de um transistor MOSFET é definido pela tensão (Volts) que se aplica no Gate, fazendo com que a corrente elétrica flua nos canais de Drain e Source.\n\n\u003cbr\u003e\n\n\u003cb\u003eN-TYPE:\u003c/b\u003e\n\nEm um transistor do tipo N, a corrente elétrica flui do Drain em direção ao Source. A tabela abaixo explica o funcionamento do transistor conforme ocorra alteração no Gate.\n\n```\n       -------------\u003e\nGATE | DRAIN | SOURCE \n---------------------\n0    | 0     | 0\n1    | 0     | 0\n0    | 1     | 0\n1    | 1     | 1\n```\n\nEm relação ao Gate, quando o mesmo possui o valor 0 (zero), significa que não há tensão aplicada nele. Seguindo a mesma lógica, quando há o valor 1, significa que há tensão suficiente aplicada no Gate, fazendo com que ele venha a funcionar como uma chave eletrônica, ou seja, permitindo que flua corrente elétrica do Drain ao Source.\n\nEm relação ao Drain e Source, quando o valor está como 0 (zero), significa que não há tensão e nem corrente elétrica. E quando há o valor 1, significa que há tensão e/ou corrente elétrica aplicada neles.\n\n\u003cbr\u003e\n\n\u003cb\u003eP-TYPE:\u003c/b\u003e\n\nEm um transistor do tipo P, a corrente elétrica flui do Source em direção ao Drain.\n\n```\n       -------------\u003e\nGATE | SOURCE | DRAIN\n---------------------\n0    | 0      | 0\n1    | 0      | 0\n0    | 1      | 1\n1    | 1      | 0\n```\n\n\u003cbr\u003e\n\nUtilizando os transistores com a lógica acima, é criado canais de comunicação entre eles, para que assim sejam criadas as portas lógicas. Ou seja, para realizar a comunicação eu criei os equivalentes aos fios que conectam os canais dos transistores, como demonstra o código abaixo na criação da porta lógica \u003cb\u003eNOT\u003c/b\u003e (para ver o código completo acesse \u003cb\u003e[gate-construction.c](source/gate-construction.c)\u003c/b\u003e).\n\n```c\n// Cria dois transistores, um do tipo P, outro do tipo N.\n// O primeiro da lista é o transistor do tipo P.\ngate-\u003etransistors = get_transistors(1, 1);\n\n// Adiciona os fios para realizar a comunicação\n// entre os canais dos transistores.\nadd_wire(GATE_PIN_VDD, 0, first_p(), PIN_TRANSISTOR_SOURCE);\nadd_wire(GATE_PIN_INPUT1, 0, first_p(), PIN_TRANSISTOR_GATE);\nadd_wire(first_p(), PIN_TRANSISTOR_DRAIN, GATE_PIN_OUTPUT, 0);\nadd_wire(GATE_PIN_INPUT1, 0, first_n(), PIN_TRANSISTOR_GATE);\nadd_wire(first_n(), PIN_TRANSISTOR_DRAIN, GATE_PIN_OUTPUT, 0);\nadd_wire(first_n(), PIN_TRANSISTOR_SOURCE, GATE_PIN_GROUND, 0);\n```\n\nObserve que o \u003cb\u003eVdd\u003c/b\u003e (que representa o positivo) é a origem do primeiro fio conectado, e o \u003cb\u003eGround\u003c/b\u003e é o último.\n\nO código acima realiza o seguinte esquema lógico:\n\n\u003ctable width=\"100%\"\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\" width=\"50%\" \u003e\n       \u003cb\u003eChave desligada\u003c/b\u003e\n       \u003cimg src=\"images/not-1.png\" width=\"100%\" \u003e\n    \u003c/td\u003e\n    \u003ctd valign=\"top\" width=\"50%\" \u003e\n       \u003cb\u003eChave ligada\u003c/b\u003e\n       \u003cimg src=\"images/not-2.png\" width=\"100%\" \u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003cb\u003eObs:\u003c/b\u003e o transistor do tipo N colocado na saída do CMOS (P e N) é apenas para demonstrar o funcionamento da porta lógica, fazendo com que ela acione um transistor que controla um LED. Como se pode notar, o LED liga e desliga conforme o estado de ligado/desligado da porta lógica.\n\nUtilizando as noções expostas acima, foi construído as seguintes portas:\n\n\u003ctable width=\"100%\"\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\" width=\"33%\" \u003e\n       \u003cb\u003eNOT\u003c/b\u003e\n       \u003cimg src=\"images/gate-not.png\" width=\"100%\" \u003e\n    \u003c/td\u003e\n    \u003ctd valign=\"top\" width=\"33%\" \u003e\n       \u003cb\u003eNAND\u003c/b\u003e\n       \u003cimg src=\"images/gate-nand.png\" width=\"100%\" \u003e\n    \u003c/td\u003e\n    \u003ctd valign=\"top\" width=\"33%\" \u003e\n       \u003cb\u003eAND (NAND + NOT)\u003c/b\u003e\n       \u003cimg src=\"images/gate-and.png\" width=\"100%\" \u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003ctable width=\"100%\"\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\" width=\"50%\" \u003e\n       \u003cb\u003eXOR (utilizando portas NAND)\u003c/b\u003e\n       \u003cimg src=\"images/gate-xor.png\" width=\"100%\" \u003e\n    \u003c/td\u003e\n    \u003ctd valign=\"top\" width=\"50%\" \u003e\n       \u003cb\u003eOR (utilizando portas NAND)\u003c/b\u003e\n       \u003cimg src=\"images/gate-or.png\" width=\"100%\" \u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003cbr\u003e\n\nO código responsável por realizar o processamento das portas lógicas e dos transistores é o [gate-machine.c](source/gate-machine.c).\n\n\u003cbr\u003e\n\n\u003cimg src=\"images/half-adder.png\" width=\"200px\" align=\"left\" \u003e\n\nUtilizando todas estas coisas foi possível construir um mecanismo \u003cb\u003eHalf Adder\u003c/b\u003e, semelhante a este demonstrado na imagem ao lado. Com a diferença que não foi utilizado apenas as portas \u003cb\u003eXOR\u003c/b\u003e e \u003cb\u003eAND\u003c/b\u003e, mas também as portas \u003cb\u003eOR\u003c/b\u003e e \u003cb\u003eNOT\u003c/b\u003e.\n\n\u003cbr\u003e\n\nPara maiores detalhes você pode analisar o algoritmo no arquivo [device-arithmetic.c](source/device-arithmetic.c), onde ali foi feito o mecanismo do \u003cb\u003eHalf Adder\u003c/b\u003e para ser utilizado no algoritmo da soma binária implementado na função \u003cb\u003eprocess_sum()\u003c/b\u003e.\n\n\u003cbr\u003e\n\nAqui está a saída do programa:\n\n```\nOperation: SUM (+)\n\n         BINARY     | DEC\n         ----------------\n                    |\n         0000000101 | 5\n         0000000011 | 3\n         ----------------\n         0000001000 | 8\n\n```\n\nEnfim, resumindo tudo, foi simulado os transistores MOSFET do tipo P e N, e com eles foi implementado portas lógicas, como AND, NOT, NAND e outras. Com as portas lógicas foi implementado o mecanismo Half Adder, e com ele foi desenvolvido um algoritmo de soma binária (para simular uma máquina de calcular). \n\n\u003cbr\u003e\n\n**Se você gostou deste código, ou ele te ajudou em algo, considere [ser um patrocinador](https://github.com/sponsors/melchisedech333) :blue_heart:** \n\n\u003cbr\u003e\n\nLembrando que para compilar o código, basta executar o script \u003cb\u003ebuild.sh\u003c/b\u003e. Ele irá gerar o arquivo \u003cb\u003emachine\u003c/b\u003e.\n\n```bash\n./build.sh\n./machine\n```\n\n\u003cbr\u003e\n\n:smiley: Autor\n---\n\nPatrocinar: [melchisedech333](https://github.com/sponsors/melchisedech333)\u003cbr\u003e\nTwitter: [Melchisedech333](https://twitter.com/Melchisedech333)\u003cbr\u003e\nLinkedIn: [Melchisedech Rex](https://www.linkedin.com/in/melchisedech-rex-724152235/)\u003cbr\u003e\nBlog: [melchisedech333.github.io](https://melchisedech333.github.io/)\u003cbr\u003e\n\n\u003ca href=\"https://github.com/melchisedech333\" \u003e\u003cimg src=\"https://github.com/melchisedech333.png?size=200\" height=\"100\" /\u003e\u003c/a\u003e\n\n\u003cbr\u003e\n\n:scroll: Licença\n---\n\n[ BSD-3-Clause license](./license)\n\n\u003cbr\u003e\u003cbr\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n## Lembre-se de deixar \u003cbr\u003e uma linda estrelinha :star_struck:\n\n\u003c/div\u003e\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmelchisedech333%2Ftransistor-simulator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmelchisedech333%2Ftransistor-simulator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmelchisedech333%2Ftransistor-simulator/lists"}