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
Linha 246: Linha 246:
 
{{collapse top|Código VHDL}}
 
{{collapse top|Código VHDL}}
 
<syntaxhighlight lang=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>   
 
</syntaxhighlight>   
 
{{collapse bottom}}
 
{{collapse bottom}}
  
 
{{collapse top|Código Verilog}}
 
{{collapse top|Código Verilog}}
<syntaxhighlight lang=verilog>
+
<syntaxhighlight lang=vhdl>
</syntaxhighlight>  
+
 
 +
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}}
 
{{collapse bottom}}

Edição das 21h07min de 3 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

  1. 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

  1. 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

  1. 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

  1. numero 3

run

  1. complete até 9

</syntaxhighlight>

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;
Atividades Complementares
  • 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.
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