2016-04-11 265 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