2016-04-11 94 views
1

我正在为我的逻辑设计实验室在VHDL中的Altera DE2电路板上实现4位约翰逊计数器。代码按照它的编写进行编译,但是当我将其编程到主板上时,什么也没有发生。我的实验室合作伙伴和我无法弄清楚,TA也没有任何人能够帮助VHDL知识比我更了解的人将不胜感激!继承人的代码...VHDL中的4位Johnson计数器

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

LEDG没有在驱动体系结构LogicFunc 7.是否SW(3)发生抖动?如果你检查你的综合报告,你会发现你的设计已被吃掉。添加一个并发赋值语句'LEDG <=(Q3,Q2,Q1,Q0);'你还需要在计数器中有一个'1',否则你只会移动'0'。 – user1155120

+1

它模拟正确吗? –

回答

2

有两件事是错误的(没有接近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; 

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

lab7_tb.png

注意不增加了输入集到触发器我用一个AND门检测一个状态(全0)和一个或门将其馈送到触发器1的D输入以及触发器4的输出。假设你打算使用Overbeck环形计数器(将Q3连接到flipflop1的D输入端)。

从单个触发器Q输出还有一个LEDG分配给LEDG。

因为你你的问题中提到约翰逊,你可以修改我的价值:

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