VHDL中的4位Johnson计数器

时间:2016-04-11 23:26:36

标签: logic vhdl

我正在为我的逻辑设计实验室在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

1 个答案:

答案 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;

我添加了一个测试平台,在模拟中显示了约翰逊计数器:

lab7_tb.png

注意没有在触发器上添加设置输入我使用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

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

lab7_tb_gray.png