Mudanças entre as edições de "Códigos VHDL para uso nas Aulas"
Linha 385: | Linha 385: | ||
{{collapse top| Simulação MODELSIM}} | {{collapse top| Simulação MODELSIM}} | ||
<code> | <code> | ||
− | vcom -93 -work work {/home/moecke/ | + | vcom -93 -work work {/home/moecke/ano2012-1/MUX/mux_novo.vhd} |
− | vsim work. | + | vsim work.mux_novo |
add wave \ | add wave \ | ||
− | {sim:/ | + | {sim:/mux_novo/x } \ |
− | {sim:/ | + | {sim:/mux_novo/s } \ |
− | {sim:/ | + | {sim:/mux_novo/y } |
# testando entrada 0 | # testando entrada 0 | ||
− | force -freeze sim:/ | + | force -freeze sim:/mux_novo/s 00 0 |
− | force -freeze sim:/ | + | force -freeze sim:/mux_novo/x 0001 0 |
run | run | ||
− | force -freeze sim:/ | + | force -freeze sim:/mux_novo/x 1110 0 |
run | run | ||
# testando entrada 1 | # testando entrada 1 | ||
− | force -freeze sim:/ | + | force -freeze sim:/mux_novo/s 01 0 |
− | force -freeze sim:/ | + | force -freeze sim:/mux_novo/x 0010 0 |
run | run | ||
− | force -freeze sim:/ | + | force -freeze sim:/mux_novo/x 1101 0 |
run | run | ||
# testando entrada 2 | # testando entrada 2 | ||
− | force -freeze sim:/ | + | force -freeze sim:/mux_novo/s 10 0 |
− | force -freeze sim:/ | + | force -freeze sim:/mux_novo/x 0100 0 |
run | run | ||
− | force -freeze sim:/ | + | force -freeze sim:/mux_novo/x 1011 0 |
run | run | ||
# testando entrada 3 | # testando entrada 3 | ||
− | force -freeze sim:/ | + | force -freeze sim:/mux_novo/s 11 0 |
− | force -freeze sim:/ | + | force -freeze sim:/mux_novo/x 1000 0 |
run | run | ||
− | force -freeze sim:/ | + | force -freeze sim:/mux_novo/x 0111 0 |
run | run | ||
</syntaxhighlight> | </syntaxhighlight> | ||
{{collapse bottom}} | {{collapse bottom}} |
Edição das 16h15min de 10 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).
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.
|
- 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 ____;
---------------------------------------
|
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.
- 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).
- Verifique o resultado RTL.
- 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.
Descrição do hardware de um multiplexador de 4 para 1
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;
|
Simulação MODELSIM |
---|
|