VHDL 中的 4 位约翰逊计数器
4-Bit Johnson Counter in VHDL
我正在为我的逻辑设计实验室使用 VHDL 在 Altera DE2 板上实现一个 4 位约翰逊计数器。代码在编写时编译,但是当我将它编程到板上时什么也没有发生。我和我的实验室伙伴无法弄清楚,助教也无法弄清楚,所以如果有比我更了解 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
有两处错误(没有考虑 SW(3) 是否去抖动)。
第一个 LEDG 未连接到四个触发器的 Q 输出,第二个 Johnson 计数器不包含“1”。
这两个都在这里解决:
-- 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;
我添加了一个在模拟中显示约翰逊计数器的测试平台:
注意,在没有向触发器添加设置输入的情况下,我使用了一个检测状态(全为“0”)的与门和一个将其馈送到触发器 1 的 D 输入以及触发器 4 的输出的或门。这假定您打算使用 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
并创建一个生成格雷码的真正约翰逊计数器:
我正在为我的逻辑设计实验室使用 VHDL 在 Altera DE2 板上实现一个 4 位约翰逊计数器。代码在编写时编译,但是当我将它编程到板上时什么也没有发生。我和我的实验室伙伴无法弄清楚,助教也无法弄清楚,所以如果有比我更了解 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
有两处错误(没有考虑 SW(3) 是否去抖动)。
第一个 LEDG 未连接到四个触发器的 Q 输出,第二个 Johnson 计数器不包含“1”。
这两个都在这里解决:
-- 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;
我添加了一个在模拟中显示约翰逊计数器的测试平台:
注意,在没有向触发器添加设置输入的情况下,我使用了一个检测状态(全为“0”)的与门和一个将其馈送到触发器 1 的 D 输入以及触发器 4 的输出的或门。这假定您打算使用 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
并创建一个生成格雷码的真正约翰逊计数器: