Mudanças entre as edições de "Códigos VHDL para uso nas Aulas"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
(34 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
=Decodificador de BCD para 7 segementos=
+
=Decodificador de BCD para 7 segmentos=
Descrever usando lógica discreta um decodificador de BCD para 7 segmentos.  A interface externa do decodificador deve ter as entradas eA, eB, eC e eD, e as saídas os sete segmentos a, b, c, d, e, f, g.  Neste exemplo esta sendo considerada a logica negativa onde o segmento acesso corresponde a 0 e apagado -> 1.
+
Descrever usando lógica discreta um decodificador de BCD para 7 segmentos.  A interface externa do decodificador deve ter as entradas eA, eB, eC e eD, e as saídas os sete segmentos a, b, c, d, e, f, g.  Neste exemplo esta sendo considerada a logica negativa onde o segmento acesso corresponde a 0 e apagado -> 1. Entradas só são consideradas válidas de 0 (0000) até 9 (1001), ou seja o circuito não precisa tratar as entradas entre A (1010) e F(1111).
 +
<center>
 +
[[Arquivo:7Segment_24.svg.png|100px|Display de 7 segmentos]]
 +
</center>
 +
{{collapse top|Entidade - entradas e saídas}}
 +
[[Arquivo:Dec_7seg.png]]   
 +
{{collapse bottom}}
  
[[Arquivo:Dec_7seg.png]]
+
{{collapse top|Tabela Verdade}}
==Tabela Verdade==
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|+ Entradas e Segmentos
 
|+ Entradas e Segmentos
Linha 30: Linha 35:
 
| - || - || - || - || || x || x || x || x || x || x || x
 
| - || - || - || - || || x || x || x || x || x || x || x
 
|}
 
|}
 +
{{collapse bottom}}
  
 
+
{{collapse top|Código VHDL (lógica discreta)}}
==Código VHDL (lógica discreta)==
 
 
<syntaxhighlight lang=vhdl>
 
<syntaxhighlight lang=vhdl>
 
entity Dec_7seg is
 
entity Dec_7seg is
Linha 75: Linha 80:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
==Código TCL para teste do Hardware==
+
{{collapse bottom}}
<code>
+
 
 +
{{collapse top|Código TCL para teste do Hardware}}
 +
Use o código tcl abaixo para testar no ModelSim o circuito RTL gerado no Quartus II.
 +
 
 +
<syntaxhighlight lang=tcl>
 
vcom -93 -work work {/home/moecke/ano2012-1/7-SEGv1/Dec_7seg.vhd}
 
vcom -93 -work work {/home/moecke/ano2012-1/7-SEGv1/Dec_7seg.vhd}
 
vsim work.dec_7seg
 
vsim work.dec_7seg
Linha 119: Linha 128:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
==Circuito RTL a ser testado==
+
{{collapse bottom}}
 +
 
 +
{{collapse top|Circuito RTL a ser testado}}
 +
 
 
[[Arquivo:RTL_Dec_7seg.png|600px|RTL do Decodificador de 7 segmentos]]
 
[[Arquivo:RTL_Dec_7seg.png|600px|RTL do Decodificador de 7 segmentos]]
 +
 +
{{collapse bottom}}
 +
 +
;Atividade complementar:
 +
*Escreva um código VDHL que implemente a função do decodificador usando uma '''descrição comportamental''' do decodificador.
 +
: Para as entradas utilize um vetor "e" do tipo std logic com 4 bits.
 +
: Para as saídas utilize um vetor "s" do tipo std logic com 7 bits, onde o segmento a -> e(0) e g -> e(6).
 +
*Prazo de entrega: 2abr até as 23h59 enviar email para moecke@ifsc.edu.br com Assunto: Prj1-SST-2012-1-NOME DO ALUNO com o arquivo em anexo  Prj1-SST-2012-1-NOME_DO_ALUNO.qar.
 +
 +
=Multiplexador 2 entradas e 1 saída=
 +
 +
{{collapse top|Entidade - entradas e saídas}}
 +
Complete o código VHDL para que sintetize um multiplexador de 8 bits.
 +
 +
<syntaxhighlight lang=vhdl>
 +
---------------------------------------
 +
LIBRARY ieee;
 +
USE ____;
 +
---------------------------------------
 +
ENTITY ____ IS
 +
PORT (
 +
____ : in STD_LOGIC_VECTOR (7 DOWNTO 0);
 +
____ : in STD_LOGIC_VECTOR (7 DOWNTO 0);
 +
sel : IN ____ ;
 +
___ OUT STD_LOGIC_VECTOR ____
 +
    );
 +
END ____ ;
 +
---------------------------------------
 +
ARCHITECTURE example OF ____ IS
 +
BEGIN
 +
PROCESS (a, b, ____)
 +
BEGIN
 +
IF (sel = '0') THEN
 +
c <= a;
 +
ELSE
 +
____;
 +
END ____;
 +
END ____;
 +
END ____;
 +
---------------------------------------
 +
 +
</syntaxhighlight>
 +
{{collapse bottom}}
 +
 +
{{collapse top|Circuito RTL agrupado}}
 +
[[Arquivo:MUX21_8bits.png]]   
 +
{{collapse bottom}}
 +
 +
{{collapse top|Circuito RTL desagrupado}}
 +
[[Arquivo:MUX21_8bitsD.png]]   
 +
{{collapse bottom}}
 +
 +
{{collapse top|Tecnology Map}}
 +
[[Arquivo:MUX21_8bitsTM.png|400px]]
 +
[[Arquivo:MUX21_8bitsTMdetalhe.png |400px]]   
 +
{{collapse bottom}}
 +
 +
=Flip Flop D - de 1 a N bits=
 +
 +
{{collapse top|Entidade - FlipFlopD de 1 bit}}
 +
 +
<syntaxhighlight lang=vhdl>
 +
library ieee;
 +
use ieee.std_logic_1164.all;
 +
 +
entity FlipFlopD_v1 is
 +
port
 +
(
 +
a : in  std_logic;
 +
clk : in  std_logic;
 +
s : out std_logic
 +
);
 +
end FlipFlopD_v1;
 +
 +
architecture v1 of FlipFlopD_v1 is
 +
 +
begin
 +
 +
-- Update the register output on the clock's rising edge
 +
process (clk)
 +
begin
 +
if (rising_edge(clk)) then
 +
s <= a;
 +
end if;
 +
end process;
 +
end v1;
 +
</syntaxhighlight>
 +
{{Collapse bottom}}
 +
;Exercícios:
 +
* Utilizando como base o código acima crie em registrador com 4 FlipFlopsD, no qual as entradas são a0 a a3 e as saídas s0 a s3.
 +
*Torne o código do registrador genérico, de forma que o mesmo componente possa ser instanciado com qualquer número de bits, sem a necessidade de recompilar a entidade que contém o registrador.
 +
*Usando o diagrama esquemático do Quartus, instancie um registrador de 4 e um de 8 bits. (Utilize como dispositivo um Ciclone de 100 pinos). Verifique o resultado RTL.
 +
 +
{{collapse top|Circuito RTL desagrupado}}
 +
[[Arquivo:REG4_8.png]]   
 +
{{collapse bottom}}
 +
 +
*Usando o diagrama esquemático do Quartus, instancie um registrador de 32 e um de 64 bits. (Utilize como dispositivo um Ciclone que possua o número suficiente de pinos para o projeto).
 +
 +
{{collapse top|Diagrama Esquemático}}
 +
[[Arquivo:REG32_64BDF.png]]   
 +
{{collapse bottom}}
 +
 +
*Verifique o resultado RTL.
 +
 +
{{collapse top|Circuito RTL agrupado}}
 +
[[Arquivo:REG32_64.png]]   
 +
{{collapse bottom}}
 +
 +
*Verifique o código VHDL e Verilog gerado pelo Quartus para o atual diagrama esquemático. Note que há um erro na definiçao do componente genérico no VHDL. 
 +
 +
{{collapse top|Código VHDL}}
 +
<syntaxhighlight lang=vhdl>
 +
LIBRARY ieee;
 +
USE ieee.std_logic_1164.all;
 +
 +
LIBRARY work;  -- desnecessario
 +
 +
ENTITY FFD_32bits_64bits IS
 +
PORT
 +
(
 +
clk :  IN  STD_LOGIC;
 +
d :  IN  STD_LOGIC_VECTOR(63 DOWNTO 0);
 +
s :  OUT  STD_LOGIC_VECTOR(31 DOWNTO 0);
 +
w :  OUT  STD_LOGIC_VECTOR(63 DOWNTO 0)
 +
);
 +
END FFD_32bits_64bits;
 +
 +
ARCHITECTURE bdf_type OF FFD_32bits_64bits IS
 +
 +
COMPONENT flipflopd_v3
 +
GENERIC (N : INTEGER
 +
);
 +
PORT(clk : IN STD_LOGIC;
 +
a : IN STD_LOGIC_VECTOR(31 DOWNTO 0); -- trocar por (N-1 DOWNTO 0)
 +
s : OUT STD_LOGIC_VECTOR(31 DOWNTO 0) -- trocar por (N-1 DOWNTO 0)
 +
);
 +
END COMPONENT;
 +
 +
BEGIN
 +
 +
b2v_inst : flipflopd_v3
 +
GENERIC MAP(N => 32
 +
)
 +
PORT MAP(clk => clk,
 +
a => d(31 DOWNTO 0),
 +
s => s);
 +
 +
b2v_inst1 : flipflopd_v3
 +
GENERIC MAP(N => 64
 +
)
 +
PORT MAP(clk => clk,
 +
a => d,
 +
s => w);
 +
 +
END bdf_type;
 +
</syntaxhighlight> 
 +
{{collapse bottom}}
 +
 +
{{collapse top|Código Verilog}}
 +
<syntaxhighlight lang=vhdl>
 +
 +
module FFD_32bits_64bits(
 +
clk,
 +
d,
 +
s,
 +
w
 +
);
 +
 +
input wire clk;
 +
input wire [63:0] d;
 +
output wire [31:0] s;
 +
output wire [63:0] w;
 +
 +
FlipFlopD_v3 b2v_inst(
 +
.clk(clk),
 +
.a(d[31:0]),
 +
.s(s));
 +
defparam b2v_inst.N = 32;
 +
 +
FlipFlopD_v3 b2v_inst1(
 +
.clk(clk),
 +
.a(d),
 +
.s(w));
 +
defparam b2v_inst1.N = 64;
 +
 +
endmodule
 +
</syntaxhighlight>
 +
 
 +
{{collapse bottom}}
 +
 +
* Utilize o código VHDL para efetuar a simulação do circuito no ModelSim.
 +
 +
= Multiplexador de 4 entradas e 1 saída=
 +
No código VHDL a seguir são implementadas 3 arquiteturas de código concorrente do mux.  Verifique que as 3 arquiteturas produzem o mesmo resultado final no "Technology Map".  Verifique também o funcionamento da arquitetura simulando-a no ModelSim.
 +
 +
{{collapse top| Código VHDL}}
 +
<syntaxhighlight lang=vhdl>
 +
entity mux_novo is
 +
port
 +
(
 +
-- Input ports
 +
X: in  bit_vector (3 downto 0);
 +
                S : in bit_vector (1 downto 0);
 +
-- Output ports
 +
Y : out bit
 +
);
 +
end entity mux_novo;
 +
 +
-- Implementação com lógica pura
 +
architecture Logica_pura of mux_novo is
 +
 +
begin
 +
Y <= (X(0) and (not S(1)) and (not S(0))) or
 +
      (X(1) and (not S(1)) and (S(0))) or
 +
      (X(2) and (S(1)) and (not S(0))) or
 +
      (X(3) and (S(1)) and (S(0)));
 +
end architecture Logica_pura;
 +
 +
-- Implementação com WHEN ELSE
 +
architecture v_WHEN of mux_novo is
 +
 +
begin
 +
Y <= X(0) when S = "00" else
 +
      X(1) when S = "01" else
 +
      X(2) when S = "10" else
 +
      X(3);
 +
end architecture v_WHEN;
 +
 +
-- Implementação com WITH SELECT
 +
architecture v_WITH_SELECT of mux_novo is
 +
 +
begin
 +
with S select
 +
Y <= X(0) when "00",    -- note o uso da ,
 +
      X(1) when "01",
 +
      X(2) when "10",
 +
      X(3) when others;  -- note o uso de others, para todos os demais valores. 
 +
                        -- Não pode ser substituido por "11" mesmo que o signal seja bit_vector.
 +
end architecture v_WITH_SELECT;
 +
 +
-- Implementação com IF ELSE
 +
architecture v_IF_ELSE of mux_novo is
 +
 +
begin
 +
 +
 +
end architecture v_IF_ELSET;
 +
</syntaxhighlight>
 +
 +
 +
Para escolher a arquitetura que deve ser utilizada, pode ser deixada apenas uma arquitetura comentando as demais.
 +
Dentro do Quartus, pode ser também utilizando a instrução configuration:
 +
 +
<syntaxhighlight lang=vhdl>
 +
configuration cfg of mux_novo is  -- Configuration Declaration
 +
for Logica_pura -- Block Configuration
 +
-- for v_WHEN       -- Block Configuration
 +
-- for v_WITH_SELECT -- Block Configuration
 +
-- for v_IF_ELSE   -- Block Configuration
 +
end for;
 +
end cfg;
 +
</syntaxhighlight>
 +
{{collapse bottom}}
 +
 +
{{collapse top| Simulação MODELSIM}}
 +
<syntaxhighlight lang=tcl>
 +
#vcom -93 -work work {/home/moecke/ano2012-1/MUX/mux_novo.vhd}
 +
vsim work.mux_novo
 +
add wave \
 +
{sim:/mux_novo/x } \
 +
{sim:/mux_novo/s } \
 +
{sim:/mux_novo/y }
 +
 +
# testando entrada 0
 +
force -freeze sim:/mux_novo/s 00 0
 +
force -freeze sim:/mux_novo/x 0001 0
 +
run
 +
force -freeze sim:/mux_novo/x 1110 0
 +
run
 +
# testando entrada 1
 +
force -freeze sim:/mux_novo/s 01 0
 +
force -freeze sim:/mux_novo/x 0010 0
 +
run
 +
force -freeze sim:/mux_novo/x 1101 0
 +
run
 +
# testando entrada 2
 +
force -freeze sim:/mux_novo/s 10 0
 +
force -freeze sim:/mux_novo/x 0100 0
 +
run
 +
force -freeze sim:/mux_novo/x 1011 0
 +
run
 +
# testando entrada 3
 +
force -freeze sim:/mux_novo/s 11 0
 +
force -freeze sim:/mux_novo/x 1000 0
 +
run
 +
force -freeze sim:/mux_novo/x 0111 0
 +
run
 +
</syntaxhighlight>
 +
{{collapse bottom}}
 +
 +
{{collapse top| Resultado da Simulação no MODELSIM}}
 +
[[Arquivo:Mux_41_SIM.png]]
 +
{{collapse bottom}}
 +
 +
= Unidade de Lógica e Aritmética (ALU) =
 +
{{collapse top| Código VDHL}}
 +
A seguir é mostrado o código VHDL de uma unidade de lógica e aritmética (ALU), conforme mostrado na pagina 87 do livro do Pedroni.
 +
<syntaxhighlight lang=vhdl>
 +
LIBRARY ieee;
 +
USE ieee.std_logic_1164.all;
 +
USE ieee.std_logic_unsigned.all;
 +
 +
ENTITY ALU IS
 +
PORT (
 +
a, b: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
 +
sel: IN STD_LOGIC_VECTOR (3 DOWNTO 0);
 +
cin: IN STD_LOGIC;
 +
y: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
 +
);
 +
END ALU;
 +
 +
ARCHITECTURE dataflow OF ALU IS
 +
SIGNAL arith, logic: STD_LOGIC_VECTOR (7 DOWNTO 0);
 +
BEGIN
 +
 +
-- Arithmetic unit
 +
WITH sel(2 DOWNTO 0) SELECT
 +
arith <=
 +
a  WHEN "000",
 +
a+1 WHEN "001",
 +
a-1 WHEN "010",
 +
b  WHEN "011",
 +
b+1 WHEN "100",
 +
b-1 WHEN "101",
 +
a+b WHEN "110",
 +
a+b+cin WHEN OTHERS;
 +
 +
--Logic unit:
 +
WITH sel(2 DOWNTO 0) SELECT
 +
logic <=
 +
NOT a    WHEN "000",
 +
NOT b    WHEN "001",
 +
a AND b  WHEN "010",
 +
a OR b  WHEN "011",
 +
a NAND b WHEN "100",
 +
a NOR b  WHEN "101",
 +
a XOR b  WHEN "110",
 +
NOT (a XOR b) WHEN OTHERS;
 +
 +
-- Mux
 +
WITH sel(3) SELECT
 +
y <= arith WHEN '0',
 +
    logic WHEN OTHERS;
 +
END dataflow;
 +
</syntaxhighlight>
 +
{{collapse bottom}}
 +
 +
Baseado no exemplo do livro, especifique em arquivos separados as unidades de lógica ("logic.vhd"), unidade de aritmética ("arithm.vhd") e o multiplexador21 ("mux21.vhd").  Utilize o diagrama esquemático para obter a ALU e gerar o seu código VHDL (ou escreva diretamente em VDHL o código da ALU utilizando "logic.vhd", "arithm.vhd" e "mux21.vhd como componentes).
 +
 +
[[Arquivo:ALU_FUNCIONAL.png |700px | Tabela funcional da ALU]]
 +
 +
{{collapse top| Diagrama Esquemático da ALU}}
 +
[[Arquivo:ALU_BDF.png |700px]]
 +
{{collapse bottom}}
 +
 +
{{collapse top| Esboço do código VDHL}}
 +
 +
<syntaxhighlight lang=vhdl>
 +
LIBRARY ieee;
 +
USE ieee.std_logic_1164.all;
 +
ENTITY ALU IS
 +
PORT
 +
(
 +
cin :  IN  STD_LOGIC;
 +
a :  IN  STD_LOGIC_VECTOR(7 DOWNTO 0);
 +
b :  IN  STD_LOGIC_VECTOR(7 DOWNTO 0);
 +
sel :  IN  STD_LOGIC_VECTOR(3 DOWNTO 0);
 +
y :  OUT  STD_LOGIC_VECTOR(7 DOWNTO 0)
 +
);
 +
END ALU;
 +
 +
ARCHITECTURE v2 OF ALU IS
 +
 +
COMPONENT arithm
 +
...
 +
END COMPONENT;
 +
 +
COMPONENT logic
 +
...
 +
END COMPONENT;
 +
 +
COMPONENT mux21
 +
...
 +
END COMPONENT;
 +
 +
SIGNAL arithmetic :  STD_LOGIC_VECTOR(7 DOWNTO 0);
 +
SIGNAL logica :  STD_LOGIC_VECTOR(7 DOWNTO 0);
 +
 +
BEGIN
 +
 +
b2v_inst : arithm
 +
PORT MAP(...);
 +
 +
 +
b2v_inst2 : logic
 +
PORT MAP(...);
 +
 +
b2v_inst3 : mux21
 +
PORT MAP(...);
 +
END v2;
 +
</syntaxhighlight>
 +
{{collapse bottom}}
 +
 +
{{collapse top| Resultado da Simulação no MODELSIM}}
 +
[[Arquivo:ALU_SIM.png]]
 +
{{collapse bottom}}
 +
 +
= Conversão de BCD para sete segmentos usando uma memória ROM =
 +
Para a conversão de um código BCD para o código 7 segmentos, pode ser usada também uma LUT ou memoria ROM. A seguir é mostrado um código VHDL que implementa essa conversão (p.480 do livro do Pedroni).  Note que se o display usado for do tipo catodo comum é necessário inverter todos os bits de saída.
 +
 +
{{collapse top| Código VDHL}}
 +
<syntaxhighlight lang=vhdl>
 +
ENTITY BCD_7SEG IS
 +
PORT (
 +
address: IN INTEGER RANGE 0 TO 9;
 +
data: OUT BIT_VECTOR (6 DOWNTO 0));
 +
END BCD_7SEG;
 +
 +
ARCHITECTURE rom OF BCD_7SEG IS
 +
TYPE memory IS ARRAY (0 TO 9) OF BIT_VECTOR (6 DOWNTO 0);
 +
CONSTANT ssd: memory := (
 +
"1111110", -- 0
 +
"0110000", -- 1
 +
"1101101", -- 2
 +
"1111001", -- 3
 +
"0110011", -- 4
 +
"1011011", -- 5
 +
"1011111", -- 6
 +
"1110000", -- 7
 +
"1111111", -- 8
 +
"1111011"); -- 9
 +
BEGIN
 +
data <= ssd(address); -- Se o display for de anodo comum
 +
-- data <= not ssd(address); -- Se o display for da catodo comum
 +
END rom;
 +
 +
</syntaxhighlight>
 +
{{collapse bottom}}
 +
 +
{{collapse top| Arquivo de simulação .do}}
 +
Para realizar a simulação do funcionamento da memória no ModelSim, pode-se usar comandos de simulação  do Modelsim.
 +
 +
<syntaxhighlight lang=tcl>
 +
vsim work.bcd_7seg
 +
add wave -noupdate -divider {Entrada Codigo BCD} # inserção de uma linha divisória na tela do WAVE
 +
add wave -noupdate -color Blue /bcd_7seg/address # inserção do address na cor Blue
 +
add wave -noupdate -divider {Saida Codigo 7segmentos}
 +
add wave -noupdate -color Red -radix hexadecimal /bcd_7seg/data # inserção do data na cor Red e no formato hexadecimal
 +
 +
force -freeze sim:/bcd_7seg/address 0 0
 +
run # execução de 100 ps.
 +
force -freeze sim:/bcd_7seg/address 1 0
 +
run
 +
force -freeze sim:/bcd_7seg/address 2 0
 +
run
 +
force -freeze sim:/bcd_7seg/address 3 0
 +
run
 +
force -freeze sim:/bcd_7seg/address 4 0
 +
run
 +
force -freeze sim:/bcd_7seg/address 5 0
 +
run
 +
force -freeze sim:/bcd_7seg/address 6 0
 +
run
 +
force -freeze sim:/bcd_7seg/address 7 0
 +
run
 +
force -freeze sim:/bcd_7seg/address 8 0
 +
run
 +
force -freeze sim:/bcd_7seg/address 9 0
 +
run
 +
force -freeze sim:/bcd_7seg/address 0 0
 +
run
 +
 +
WaveRestoreZoom {0 ps} {1200 ps}  # mudança do display do wave entre 0 e 1200 ps.
 +
</syntaxhighlight>
 +
{{collapse bottom}}
 +
 +
{{collapse top| Resultado da Simulação no MODELSIM}}
 +
[[Arquivo:ROM_SIM.png | 800px]]
 +
{{collapse bottom}}

Edição das 15h36min de 17 de abril de 2012

Decodificador de BCD para 7 segmentos

Descrever usando lógica discreta um decodificador de BCD para 7 segmentos. A interface externa do decodificador deve ter as entradas eA, eB, eC e eD, e as saídas os sete segmentos a, b, c, d, e, f, g. Neste exemplo esta sendo considerada a logica negativa onde o segmento acesso corresponde a 0 e apagado -> 1. Entradas só são consideradas válidas de 0 (0000) até 9 (1001), ou seja o circuito não precisa tratar as entradas entre A (1010) e F(1111).

Display de 7 segmentos

Entidade - entradas e saídas

Dec 7seg.png

Tabela Verdade
Entradas e Segmentos
eD eC eB eA Mostrador a b c d e f g
0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 1 1 1 0 0 1 1 1 1
0 0 1 0 2 0 0 1 0 0 1 0
0 0 1 1 3 0 0 0 0 1 1 0
0 1 0 0 4 1 0 0 1 1 0 0
0 1 0 1 5 0 1 0 0 1 0 0
0 1 1 0 6 0 1 0 0 0 0 0
0 1 1 1 7 0 0 0 1 1 1 1
1 0 0 0 8 0 0 0 0 0 0 0
1 0 0 1 9 0 0 0 0 1 0 0
- - - - x x x x x x x
Código VHDL (lógica discreta)
entity Dec_7seg is
	port
	(
		eA,eB,eC,eD	: in  bit;
		a,b,c,d,e,f,g	: out bit
	);
end Dec_7seg;

architecture discret_logic of Dec_7seg is


begin
--lógica que implementa o segmento a de um display (0,1,2,3,4,5,6,7,8,9), sem minimização.
-- 0 -> aceso (ON),  1 -> apagado (OFF)

a <= (NOT eD AND NOT eC AND NOT eB AND eA) OR  
		(NOT eD AND eC AND NOT eB AND NOT eA);
--implemente a lógica dos demais segmentos do display (0,1,2,3,4,5,6,7,8,9), sem minimização.
b <= (NOT eD AND eC AND NOT eB AND eA) OR  
		(NOT eD AND eC AND eB AND NOT eA);
c <= (NOT eD AND NOT eC AND  eB AND eA);
d <= (NOT eD AND NOT eC AND NOT eB AND eA) OR  
		(NOT eD AND eC AND NOT eB AND NOT eA) OR
                (NOT eD AND eC AND eB AND  eA);
e <= (NOT eD AND NOT eC AND NOT eB AND  eA) OR  
		(NOT eD AND NOT eC AND  eB AND  eA) OR
                (NOT eD AND eC AND NOT eB AND NOT eA) OR  
		(NOT eD AND eC AND NOT eB AND eA) OR
                (NOT eD AND  eC AND  eB AND  eA) OR  
		( eD AND NOT eC AND NOT eB AND eA);
f <=            (NOT eD AND NOT eC AND NOT eB AND eA) OR  
		(NOT eD AND NOT eC AND  eB AND NOT eA) OR
                (NOT eD AND NOT eC AND eB AND  eA) OR  
		(NOT eD AND  eC AND  eB AND  eA);
g <=            (NOT eD AND NOT eC AND NOT eB AND NOT eA) OR  
		(NOT eD AND NOT eC AND NOT eB AND  eA) OR
                (NOT eD AND  eC AND  eB AND  eA);

end discret_logic;
Código TCL para teste do Hardware

Use o código tcl abaixo para testar no ModelSim o circuito RTL gerado no Quartus II.

vcom -93 -work work {/home/moecke/ano2012-1/7-SEGv1/Dec_7seg.vhd}
vsim work.dec_7seg
add wave \
{sim:/dec_7seg/ed } \
{sim:/dec_7seg/ec } \
{sim:/dec_7seg/eb } \
{sim:/dec_7seg/ea } \
{sim:/dec_7seg/g } \
{sim:/dec_7seg/f } \
{sim:/dec_7seg/e } \
{sim:/dec_7seg/d } \
{sim:/dec_7seg/c } \
{sim:/dec_7seg/b } \
{sim:/dec_7seg/a } 

force -freeze sim:/dec_7seg/ea 0 0
force -freeze sim:/dec_7seg/eb 0 0
force -freeze sim:/dec_7seg/ec 0 0
force -freeze sim:/dec_7seg/ed 0 0
# numero 0
run
force -freeze sim:/dec_7seg/ea 1 0
force -freeze sim:/dec_7seg/eb 0 0
force -freeze sim:/dec_7seg/ec 0 0
force -freeze sim:/dec_7seg/ed 0 0
# numero 1
run
force -freeze sim:/dec_7seg/ea 0 0
force -freeze sim:/dec_7seg/eb 1 0
force -freeze sim:/dec_7seg/ec 0 0
force -freeze sim:/dec_7seg/ed 0 0
# numero 2
run
force -freeze sim:/dec_7seg/ea 1 0
force -freeze sim:/dec_7seg/eb 1 0
force -freeze sim:/dec_7seg/ec 0 0
force -freeze sim:/dec_7seg/ed 0 0
# numero 3
run
# complete até 9
Circuito RTL a ser testado

RTL do Decodificador de 7 segmentos

Atividade complementar
  • Escreva um código VDHL que implemente a função do decodificador usando uma descrição comportamental do decodificador.
Para as entradas utilize um vetor "e" do tipo std logic com 4 bits.
Para as saídas utilize um vetor "s" do tipo std logic com 7 bits, onde o segmento a -> e(0) e g -> e(6).
  • Prazo de entrega: 2abr até as 23h59 enviar email para moecke@ifsc.edu.br com Assunto: Prj1-SST-2012-1-NOME DO ALUNO com o arquivo em anexo Prj1-SST-2012-1-NOME_DO_ALUNO.qar.

Multiplexador 2 entradas e 1 saída

Entidade - entradas e saídas

Complete o código VHDL para que sintetize um multiplexador de 8 bits.

---------------------------------------
LIBRARY ieee;
USE ____;
---------------------------------------
ENTITY ____ IS
PORT ( 
	____ : in STD_LOGIC_VECTOR (7 DOWNTO 0);
	____ : in STD_LOGIC_VECTOR (7 DOWNTO 0);
	sel : IN ____ ;
	___ OUT STD_LOGIC_VECTOR ____
     );
END ____ ;
---------------------------------------
ARCHITECTURE example OF ____ IS
BEGIN
	PROCESS (a, b, ____)
	BEGIN
		IF (sel = '0') THEN
			c <= a;
		ELSE
			____;
		END ____;
	END ____;
END ____;
---------------------------------------
Circuito RTL agrupado

MUX21 8bits.png

Circuito RTL desagrupado

MUX21 8bitsD.png

Tecnology Map

MUX21 8bitsTM.png MUX21 8bitsTMdetalhe.png

Flip Flop D - de 1 a N bits

Entidade - FlipFlopD de 1 bit
library ieee;
use ieee.std_logic_1164.all;

entity FlipFlopD_v1 is
	port
	(
		a	: in  std_logic;
		clk	: in  std_logic;
		s	: out std_logic
	);
end FlipFlopD_v1;

architecture v1 of FlipFlopD_v1 is

begin

-- Update the register output on the clock's rising edge
process (clk)
begin
	if (rising_edge(clk)) then
		s <= a;
	end if;
end process;
end v1;
Exercícios
  • Utilizando como base o código acima crie em registrador com 4 FlipFlopsD, no qual as entradas são a0 a a3 e as saídas s0 a s3.
  • Torne o código do registrador genérico, de forma que o mesmo componente possa ser instanciado com qualquer número de bits, sem a necessidade de recompilar a entidade que contém o registrador.
  • Usando o diagrama esquemático do Quartus, instancie um registrador de 4 e um de 8 bits. (Utilize como dispositivo um Ciclone de 100 pinos). Verifique o resultado RTL.
Circuito RTL desagrupado

REG4 8.png

  • Usando o diagrama esquemático do Quartus, instancie um registrador de 32 e um de 64 bits. (Utilize como dispositivo um Ciclone que possua o número suficiente de pinos para o projeto).
Diagrama Esquemático

REG32 64BDF.png

  • Verifique o resultado RTL.
Circuito RTL agrupado

REG32 64.png

  • Verifique o código VHDL e Verilog gerado pelo Quartus para o atual diagrama esquemático. Note que há um erro na definiçao do componente genérico no VHDL.
Código VHDL
LIBRARY ieee;
USE ieee.std_logic_1164.all; 

LIBRARY work;  -- desnecessario

ENTITY FFD_32bits_64bits IS 
	PORT
	(
		clk :  IN  STD_LOGIC;
		d :  IN  STD_LOGIC_VECTOR(63 DOWNTO 0);
		s :  OUT  STD_LOGIC_VECTOR(31 DOWNTO 0);
		w :  OUT  STD_LOGIC_VECTOR(63 DOWNTO 0)
	);
END FFD_32bits_64bits;

ARCHITECTURE bdf_type OF FFD_32bits_64bits IS 

COMPONENT flipflopd_v3
GENERIC (N : INTEGER
			);
	PORT(clk : IN STD_LOGIC;
		 a : IN STD_LOGIC_VECTOR(31 DOWNTO 0); -- trocar por (N-1 DOWNTO 0)
		 s : OUT STD_LOGIC_VECTOR(31 DOWNTO 0) -- trocar por (N-1 DOWNTO 0)
	);
END COMPONENT;

BEGIN 

b2v_inst : flipflopd_v3
GENERIC MAP(N => 32
			)
PORT MAP(clk => clk,
		 a => d(31 DOWNTO 0),
		 s => s);

b2v_inst1 : flipflopd_v3
GENERIC MAP(N => 64
			)
PORT MAP(clk => clk,
		 a => d,
		 s => w);

END bdf_type;
Código Verilog
module FFD_32bits_64bits(
	clk,
	d,
	s,
	w
);

input wire	clk;
input wire	[63:0] d;
output wire	[31:0] s;
output wire	[63:0] w;

FlipFlopD_v3	b2v_inst(
	.clk(clk),
	.a(d[31:0]),
	.s(s));
	defparam	b2v_inst.N = 32;

FlipFlopD_v3	b2v_inst1(
	.clk(clk),
	.a(d),
	.s(w));
	defparam	b2v_inst1.N = 64;

endmodule
  • Utilize o código VHDL para efetuar a simulação do circuito no ModelSim.

Multiplexador de 4 entradas e 1 saída

No código VHDL a seguir são implementadas 3 arquiteturas de código concorrente do mux. Verifique que as 3 arquiteturas produzem o mesmo resultado final no "Technology Map". Verifique também o funcionamento da arquitetura simulando-a no ModelSim.

Código VHDL
entity mux_novo is
	port
	(
		-- Input ports
		X: in  bit_vector (3 downto 0);
                S : in bit_vector (1 downto 0);
		-- Output ports
		Y : out bit
	);
end entity mux_novo;

-- Implementação com lógica pura
architecture Logica_pura of mux_novo is

begin
 Y <= (X(0) and (not S(1)) and (not S(0))) or
      (X(1) and (not S(1)) and (S(0))) or
      (X(2) and (S(1)) and (not S(0))) or
      (X(3) and (S(1)) and (S(0)));
end architecture Logica_pura;

-- Implementação com WHEN ELSE
architecture v_WHEN of mux_novo is

begin
 Y <= X(0) when S = "00" else
      X(1) when S = "01" else
      X(2) when S = "10" else
      X(3);
end architecture v_WHEN;

-- Implementação com WITH SELECT
architecture v_WITH_SELECT of mux_novo is

begin
 with S select
 Y <= X(0) when "00",    -- note o uso da ,
      X(1) when "01",
      X(2) when "10",
      X(3) when others;  -- note o uso de others, para todos os demais valores.  
                         -- Não pode ser substituido por "11" mesmo que o signal seja bit_vector.
end architecture v_WITH_SELECT;

-- Implementação com IF ELSE
architecture v_IF_ELSE of mux_novo is

begin
 

end architecture v_IF_ELSET;


Para escolher a arquitetura que deve ser utilizada, pode ser deixada apenas uma arquitetura comentando as demais. Dentro do Quartus, pode ser também utilizando a instrução configuration:

configuration cfg of mux_novo is  -- Configuration Declaration
	for Logica_pura 	-- Block Configuration
--	for v_WHEN 	      -- Block Configuration
--	for v_WITH_SELECT -- Block Configuration
--	for v_IF_ELSE 	   -- Block Configuration
	end for;
end cfg;
Simulação MODELSIM
#vcom -93 -work work {/home/moecke/ano2012-1/MUX/mux_novo.vhd}
vsim work.mux_novo
add wave \
{sim:/mux_novo/x } \
{sim:/mux_novo/s } \
{sim:/mux_novo/y } 

# testando entrada 0
force -freeze sim:/mux_novo/s 00 0
force -freeze sim:/mux_novo/x 0001 0
run
force -freeze sim:/mux_novo/x 1110 0
run
# testando entrada 1
force -freeze sim:/mux_novo/s 01 0
force -freeze sim:/mux_novo/x 0010 0
run
force -freeze sim:/mux_novo/x 1101 0
run
# testando entrada 2
force -freeze sim:/mux_novo/s 10 0
force -freeze sim:/mux_novo/x 0100 0
run
force -freeze sim:/mux_novo/x 1011 0
run
# testando entrada 3
force -freeze sim:/mux_novo/s 11 0
force -freeze sim:/mux_novo/x 1000 0
run
force -freeze sim:/mux_novo/x 0111 0
run
Resultado da Simulação no MODELSIM

Mux 41 SIM.png

Unidade de Lógica e Aritmética (ALU)

Código VDHL

A seguir é mostrado o código VHDL de uma unidade de lógica e aritmética (ALU), conforme mostrado na pagina 87 do livro do Pedroni.

LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;

ENTITY ALU IS
	PORT (
	a, b: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
	sel: IN STD_LOGIC_VECTOR (3 DOWNTO 0);
	cin: IN STD_LOGIC;
	y: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
	);
END ALU;

ARCHITECTURE dataflow OF ALU IS
	SIGNAL arith, logic: STD_LOGIC_VECTOR (7 DOWNTO 0);
BEGIN

-- Arithmetic unit
WITH sel(2 DOWNTO 0) SELECT
	arith <= 
		a   WHEN "000",
		a+1 WHEN "001",
		a-1 WHEN "010",
		b   WHEN "011",
		b+1 WHEN "100",
		b-1 WHEN "101",
		a+b WHEN "110",
		a+b+cin WHEN OTHERS;

--Logic unit: 
WITH sel(2 DOWNTO 0) SELECT
	logic <= 
		NOT a    WHEN "000",
		NOT b    WHEN "001",
		a AND b  WHEN "010",
		a OR b   WHEN "011",
		a NAND b WHEN "100",
		a NOR b  WHEN "101",
		a XOR b  WHEN "110",
		NOT (a XOR b) WHEN OTHERS;

-- Mux
WITH sel(3) SELECT
	y <= arith WHEN '0',
	     logic WHEN OTHERS;
END dataflow;

Baseado no exemplo do livro, especifique em arquivos separados as unidades de lógica ("logic.vhd"), unidade de aritmética ("arithm.vhd") e o multiplexador21 ("mux21.vhd"). Utilize o diagrama esquemático para obter a ALU e gerar o seu código VHDL (ou escreva diretamente em VDHL o código da ALU utilizando "logic.vhd", "arithm.vhd" e "mux21.vhd como componentes).

Tabela funcional da ALU

Diagrama Esquemático da ALU

ALU BDF.png

Esboço do código VDHL
LIBRARY ieee;
USE ieee.std_logic_1164.all; 
ENTITY ALU IS 
	PORT
	(
		cin :  IN  STD_LOGIC;
		a :  IN  STD_LOGIC_VECTOR(7 DOWNTO 0);
		b :  IN  STD_LOGIC_VECTOR(7 DOWNTO 0);
		sel :  IN  STD_LOGIC_VECTOR(3 DOWNTO 0);
		y :  OUT  STD_LOGIC_VECTOR(7 DOWNTO 0)
	);
END ALU;

ARCHITECTURE v2 OF ALU IS 

COMPONENT arithm
...
END COMPONENT;

COMPONENT logic
...
END COMPONENT;

COMPONENT mux21
...
END COMPONENT;

SIGNAL	arithmetic :  STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL	logica :  STD_LOGIC_VECTOR(7 DOWNTO 0);

BEGIN 

b2v_inst : arithm
PORT MAP(...);


b2v_inst2 : logic
PORT MAP(...);

b2v_inst3 : mux21
PORT MAP(...);
END v2;
Resultado da Simulação no MODELSIM

Arquivo:ALU SIM.png

Conversão de BCD para sete segmentos usando uma memória ROM

Para a conversão de um código BCD para o código 7 segmentos, pode ser usada também uma LUT ou memoria ROM. A seguir é mostrado um código VHDL que implementa essa conversão (p.480 do livro do Pedroni). Note que se o display usado for do tipo catodo comum é necessário inverter todos os bits de saída.

Código VDHL
ENTITY BCD_7SEG IS
	PORT ( 
		address: IN INTEGER RANGE 0 TO 9; 
		data: OUT BIT_VECTOR (6 DOWNTO 0)); 
END BCD_7SEG;

ARCHITECTURE rom OF BCD_7SEG IS
	TYPE memory IS ARRAY (0 TO 9) OF BIT_VECTOR (6 DOWNTO 0);
	CONSTANT ssd: memory := ( 
				"1111110", -- 0
				"0110000", -- 1
				"1101101", -- 2
				"1111001", -- 3
				"0110011", -- 4
				"1011011", -- 5
				"1011111", -- 6
				"1110000", -- 7
				"1111111", -- 8
				"1111011"); -- 9
BEGIN
	data <= ssd(address); -- Se o display for de anodo comum
--	data <= not ssd(address); -- Se o display for da catodo comum
END rom;
Arquivo de simulação .do

Para realizar a simulação do funcionamento da memória no ModelSim, pode-se usar comandos de simulação do Modelsim.

vsim work.bcd_7seg
add wave -noupdate -divider {Entrada Codigo BCD} # inserção de uma linha divisória na tela do WAVE
add wave -noupdate -color Blue /bcd_7seg/address # inserção do address na cor Blue
add wave -noupdate -divider {Saida Codigo 7segmentos}
add wave -noupdate -color Red -radix hexadecimal /bcd_7seg/data # inserção do data na cor Red e no formato hexadecimal

force -freeze sim:/bcd_7seg/address 0 0
run # execução de 100 ps.
force -freeze sim:/bcd_7seg/address 1 0
run
force -freeze sim:/bcd_7seg/address 2 0
run
force -freeze sim:/bcd_7seg/address 3 0
run
force -freeze sim:/bcd_7seg/address 4 0
run
force -freeze sim:/bcd_7seg/address 5 0
run
force -freeze sim:/bcd_7seg/address 6 0
run
force -freeze sim:/bcd_7seg/address 7 0
run
force -freeze sim:/bcd_7seg/address 8 0
run
force -freeze sim:/bcd_7seg/address 9 0
run
force -freeze sim:/bcd_7seg/address 0 0
run

WaveRestoreZoom {0 ps} {1200 ps}  # mudança do display do wave entre 0 e 1200 ps.
Resultado da Simulação no MODELSIM

ROM SIM.png