XOR - rogerioag/gcg GitHub Wiki

XOR Gate

Description

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

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

Building XOR Gate component in gcg

Para criar componentes básicos, como neste exemplo uma porta XOR, pode ser utilizado o comando make new. Note que denominamos o projeto de xor2 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=xor2 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 xor2 foi criado, sendo necessário somente colocarmos o tipo das variáveis e a expressão lógica (z <= x xor y) que gera o resultado descrito na tabela verdade.

<a name="cod_xor2"/a>

-- Projeto gerado via script.
-- Data: Qua,20/07/2011-13:51:40
-- Autor: rogerio
-- Comentario: Descrição da Entidade: xor2.
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity xor2 is
	port(a,b:in std_logic; y:out std_logic);
end xor2;

architecture logica of xor2 is
begin
	y <= a xor b;
end logica;

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

<a name="cod_xor2_tb"/a>

-- Testebench gerado via script.
-- Data: Qua,20/07/2011-13:51:42
-- Autor: rogerio
-- Comentario: Teste da entidade xor2.

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity xor2_tb is
end xor2_tb;

architecture logica of xor2_tb is
  --  Declaração do componente.
  component xor2
    	port (a,b: in std_logic; y: out std_logic);
  end component;
  --  Especifica qual a entidade está vinculada com o componente.
  for xor2_0: xor2 use entity work.xor2;
      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>>)
	  xor2_0: xor2 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 são aplicados (injetados) às entradas.
				type pattern_array is array (natural range <>) of pattern_type;
				constant patterns : pattern_array :=
					(
						('0', '0', '0'),
						('0', '1', '1'),
						('1', '0', '1'),
						('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 xor2 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 xor2.

make compile TESTBENCH=xor2_tb
make run TESTBENCH=xor2_tb
make view TESTBENCH=xor2_tb
make all TESTBENCH=xor2_tb

O diagrama do resultado pode ser visualizado na Figura.

<a name="fig_gtw_xor2"/a>

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