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

并创建一个生成格雷码的真正约翰逊计数器: