OR - rogerioag/gcg GitHub Wiki

OR Gate

Description

The OR 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 1

Building OR Gate component in gcg

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

<a name="cod_or2"/a>

-- Projeto gerado via script.
-- Data: Sex,30/12/2011-14:41:09
-- Autor: rogerio
-- Comentario: Descrição da Entidade: or2.
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;

entity or2 is
	port (x,y: in std_logic; z: out std_logic);
end or2;
 
architecture logica of or2 is
begin
	z<=x or y;
end logica;

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

<a name="cod_or2_tb"/a>

-- Testebench gerado via script.
-- Data: Sex,30/12/2011-14:41:09
-- Autor: rogerio
-- Comentario: Teste da entidade or2.
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity or2_tb is
end or2_tb;

architecture logic of or2_tb is
  --  Declaração do componente.
  component or2
  port (x, y: in std_logic; z: out std_logic);
  end component;
  --  Especifica qual a entidade está vinculada com o componente.
  for or2_0: or2 use entity work.or2;
      signal s_t_x, s_t_y, s_t_z: std_logic;
  begin
    --  Instanciação do Componente.
  --  port map (<<p_in_1>> => <<s_t_in_1>>)
  or2_0: or2 port map ( x=>s_t_x, y=>s_t_y, z=>s_t_z);

    --  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_x, vi_y: std_logic;
      -- saídas.
       vo_z: 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', '0'),
      ('0', '1', '1'),
      ('1', '0', '1'),
      ('1', '1', '1')
    );
    begin
    --  Checagem de padrões.
    for i in patterns'range loop
      --  Injeta as entradas.
      s_t_x <= patterns(i).vi_x;
      s_t_y <= patterns(i).vi_y;
      
      --  Aguarda os resultados.
      wait for 1 ns;
      --  Checa o resultado com a saída esperada no padrão.
      assert s_t_z = patterns(i).vo_z report "Valor de s_t_z 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 logic;

Compiling, Running and Viewing results

Executando os comandos make apresentado no Código, se tudo estiver correto, a entidade or2 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 or2.

make compile TESTBENCH=or2_tb
make run TESTBENCH=or2_tb
make view TESTBENCH=or2_tb
make all TESTBENCH=or2_tb

O diagrama do resultado pode ser visualizado na Figura.

<a name="fig_gtw_or2"/a>

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