NOR - rogerioag/gcg GitHub Wiki

NOR Gate

Description

The AND gate implements the function described in truth table, considering inputs (x, y) and output (z):

x y z
0 0 1
0 1 0
1 0 0
1 1 0

Building AND Gate component in gcg

Para criar componentes básicos, como neste exemplo uma porta NOR, pode ser utilizado o comando make new. Note que denominamos o projeto de nor2 pelo fato do componente ter duas entradas, valor esse passado para o make na variável PROJECT e a arquitetura para esse elemento básico foi definida como lógica, por meio da variável ARCH.

Make command to build AND gate

make new PROJECT=nor2 ARCH=logic IN=x,y OUT=z

Verificando a estrutura do projeto, pode-se ver que foram criados o arquivo da entidade no diretório src e do teste no diretório testbench. O Código VHDL gerado para a entidade nor2 foi criado, sendo necessário somente colocarmos o tipo das variáveis e a expressão lógica (z <= x nor y) que gera o resultado descrito na tabela verdade.

<a name="cod_nor2"/a>

-- Projeto gerado via script.
-- Data: Sáb,31/12/2011-01:19:07
-- Autor: rogerio
-- Comentario: Descrição da Entidade: nor2.
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
 
entity nor2 is
	port (a, b: in std_logic; y: out std_logic);
end nor2;
 
architecture logica of nor2 is
  
  
begin
  -- Comandos.
  y <= a nor b;  
end logica;

No diretorio testbench foi criado o arquivo nor2_tb.vhd que é o testbench para a entidade nor2, conforme podemos ver no Código, novamente alteramos type para std_logic e criamos os casos de teste.

<a name="cod_nor2_tb"/a>

-- Testebench gerado via script.
-- Data: Sáb,31/12/2011-01:19:07
-- Autor: rogerio
-- Comentario: Teste da entidade nor2.
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity nor2_tb is
end nor2_tb;

architecture logica of nor2_tb is
  --  Declaração do componente.
  component nor2
	port (a, b: in std_logic; y: out std_logic);
  end component;
  --  Especifica qual a entidade está vinculada com o componente.
  for nor2_0: nor2 use entity work.nor2;
      signal s_t_a, s_t_b, s_t_y: std_logic;
  begin
    --  Instanciação do Componente.
	--  port map (<<p_in_1>> => <<s_t_in_1>>)
	nor2_0: nor2 port map ( a=>s_t_a, b=>s_t_b, y=>s_t_y);

    --  Processo que faz o trabalho.
    process
		-- Um registro é criado com as entradas e saídas da entidade.
		-- (<<entrada1>>, <<entradaN>>, <<saida1>>, <<saidaN>>)
		type pattern_type is record
			-- entradas.
			 vi_a, vi_b: std_logic;
			-- saídas.
			 vo_y: std_logic;
		end record;

		--  Os padrões de entrada que são aplicados (injetados) às entradas.
		type pattern_array is array (natural range <>) of pattern_type;
		-- Casos de teste.
		constant patterns : pattern_array :=
		(
			('0', '0', '1'),
			('0', '1', '0'),
			('1', '0', '0'),
			('1', '1', '0')
		);
		begin
		--  Checagem de padrões.
		for i in patterns'range loop
			--  Injeta as entradas.
			s_t_a <= patterns(i).vi_a;
			s_t_b <= patterns(i).vi_b;
			
			--  Aguarda os resultados.
			wait for 1 ns;
			--  Checa o resultado com a saída esperada no padrão.
			assert s_t_y = patterns(i).vo_y	report "Valor de s_t_y não confere com o resultado esperado." severity error;
			
		end loop;
		assert false report "Fim do teste." severity note;
		--  Wait forever; Isto finaliza a simulação.
		wait;
	end process;
end logica;

Compiling, Running and Viewing results

Executando os comandos make apresentado no Código, se tudo estiver correto, a entidade nor2 será analisada e compilada e o teste será executado e no final será apresentado a tela do gtkwave com o diagrama de tempo (forma de onda).

Comando para executar o testbench da entidade nor2.

make compile TESTBENCH=nor2_tb
make run TESTBENCH=nor2_tb
make view TESTBENCH=nor2_tb
make all TESTBENCH=nor2_tb

O diagrama do resultado pode ser visualizado na Figura.

<a name="fig_gtw_nor2"/a>

⚠️ **GitHub.com Fallback** ⚠️