我正在为我的逻辑设计实验室在VHDL上的Altera DE2板上实现一个4位Johnson计数器。代码在编写时编译,但是当我将其编程到电路板上时没有任何反应。我的实验室合作伙伴和我无法理解,TA也不能这样对VHDL的知识比我更有帮助的人会非常感激!!继承人代码......
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity lab7 is
port (
LEDG : out bit_vector(3 downto 0);
SW: in bit_vector(3 downto 0)
);
end lab7;
architecture LogicFunc of lab7 is
signal Q0 : bit;
signal Q1 : bit;
signal Q2 : bit;
signal Q3 : bit;
signal K : bit;
component flipflop
port(D,Clock : in bit;
Q: out bit);
end component;
begin
K <= SW(3);
flipflop1: flipflop port map(Q3, K, Q0);
flipflop2: flipflop port map(Q0, K, Q1);
flipflop3: flipflop port map(Q1, K, Q2);
flipflop4: flipflop port map(Q2, K, Q3);
end;
-- D flipflop
entity flipflop is
port(D : in bit;
Clock : in bit;
Q : out bit);
end flipflop;
architecture behavior of flipflop is
begin
process(Clock)
begin
if Clock'event and Clock = '1' then
Q <= D;
end if;
end process;
end behavior;
--port map: D, Clock, Q
答案 0 :(得分:2)
有两件事是错的(没有接近SW(3)是否被去抖动。)
第一个LEDG没有连接到四个触发器的Q输出,第二个LED计数器没有包含一个&#39;
。这两个问题都在这里解决:
-- D flipflop
entity flipflop is
port(D : in bit;
Clock : in bit;
Q : out bit);
end flipflop;
architecture behavior of flipflop is
begin
process(Clock)
begin
if Clock'event and Clock = '1' then
Q <= D;
end if;
end process;
end behavior;
-- library IEEE;
-- use IEEE.STD_LOGIC_1164.ALL;
-- use IEEE.NUMERIC_STD.ALL;
entity lab7 is
port (
LEDG : out bit_vector(3 downto 0);
SW: in bit_vector(3 downto 0)
);
end lab7;
architecture LogicFunc of lab7 is
signal Q0 : bit;
signal Q1 : bit;
signal Q2 : bit;
signal Q3 : bit;
signal K : bit;
signal I: bit;
component flipflop
port(D,Clock : in bit;
Q: out bit);
end component;
begin
K <= SW(3);
flipflop1: flipflop port map( I, K, Q0); -- was (Q3, ..)
flipflop2: flipflop port map(Q0, K, Q1);
flipflop3: flipflop port map(Q1, K, Q2);
flipflop4: flipflop port map(Q2, K, Q3);
LEDG <= (Q3,Q2,Q1,Q0); -- added
I <= (not Q0 and not Q1 and not Q2 and not Q3) or Q3; -- added
end;
-- D flipflop
entity flipflop is
port(D : in bit;
Clock : in bit;
Q : out bit);
end flipflop;
architecture behavior of flipflop is
begin
process(Clock)
begin
if Clock'event and Clock = '1' then
Q <= D;
end if;
end process;
end behavior;
--port map: D, Clock, Q
entity lab7_tb is
end entity;
architecture foo of lab7_tb is
signal LEDG: bit_vector (3 downto 0);
signal SW: bit_vector (3 downto 0);
begin
DUT:
entity work.lab7
port map (
LEDG => LEDG,
SW => SW
);
STIMULUS:
process
begin
wait for 1 sec;
SW(3) <= not sw(3);
if now > 30 sec then
wait;
end if;
end process;
end architecture;
我添加了一个测试平台,在模拟中显示了约翰逊计数器:
注意没有在触发器上添加设置输入我使用AND门检测状态(所有&#39; 0s)和OR门将其输入到flipflop1的D输入以及flipflop4的输出。这假设您打算使用Overbeck环形计数器(将Q3连接到flipflop1&D的输入)。
还有来自各个触发器Q输出的LEDG的附加分配。
因为您的问题提及Johnson,您可以修改I的值:
LEDG <= (Q3,Q2,Q1,Q0); -- added
I <= not Q3; --added
-- I <= (not Q0 and not Q1 and not Q2 and not Q3) or Q3; -- added
创建一个真正的约翰逊计数器,生成格雷码: