2016-09-17 32 views
0

我想在VHDL中實現一個3位計數器,該計數器的電路原理圖如圖所示。VHDL 3位計數器:錯誤消息3363,1408

http://i.stack.imgur.com/OoD7F.jpg

當我執行我得到了下面的錯誤消息的代碼:

--Actual與正規模式OUT信號「Q」相關聯的可能不是一個類型轉換或函數調用

- 操作不能與模式OUT的正式關聯。

我得到了這三個錯誤信息,用於關聯D觸發器和信號的輸出。

在FF1 Q =>不Q0

在FF2 Q =>不Q1

在FF3 Q =>不Q2

這裏

爲3比特計數器的VHDL代碼:

對於d觸發器
library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity counter_3bit_alt is 
    Port (clk : in STD_LOGIC; 
      clr : in STD_LOGIC; 
      Qout : out STD_LOGIC_VECTOR (2 downto 0)); 
end counter_3bit_alt; 

architecture Behavioral of counter_3bit_alt is 

    component D_FlipFlop is 
    Port (clk : in STD_LOGIC; 
      clr : in STD_LOGIC; 
      D : in STD_LOGIC; 
      Q : out STD_LOGIC); 
end component; 

signal q0, q1, q2 : std_logic; 

begin 

    FF1 : D_FlipFlop 
     port map(
      clk => clk, 
      clr => clr, 
      D => q0, 
      Q => not q0 
     ); 

    FF2 : D_FlipFlop 
     port map(
      clk => q0, 
      clr => clr, 
      D => q1, 
      Q => not q1 ); 

    FF3 : D_FlipFlop 
     port map(
      clk => q1, 
      clr => clr, 
      D => q2, 
      Q => not q2 
     ); 

     Qout <= q2&q1&q0; 
end Behavioral; 

VHDL代碼是

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity D_FlipFlop is 
    Port (clk : in STD_LOGIC; 
      clr : in STD_LOGIC; 
      D : in STD_LOGIC; 
      Q : out STD_LOGIC); 
end D_FlipFlop; 

architecture Behavioral of D_FlipFlop is 
begin 
    process(clk, clr) 
     begin 
      if (clr = '1') then 
       q <= '0'; 
      elsif(rising_edge(clk)) then 
       q <= D; 
      end if; 
    end process; 

end Behavioral; 
+0

示意圖觸發器提供2個輸出,該觸發器VHDL提供唯一的一個。錯誤信息最終是這個錯誤的後果。 –

回答

0

D_FlipFlop端口Q是輸出。輸出應該被分配給一個信號,而不是一個語句。將輸出分配給信號,然後將其反轉爲端口D的輸入。

這裏是一個建議

signal q0, q1, q2 : std_logic; 
signal not_q0, not_q1, not_q2 : std_logic; 

begin 

FF1 : D_FlipFlop 
    port map(
     clk => clk, 
     clr => clr, 
     D => not_q0, 
     Q => q0 
    ); 
not_q0 <= not q0; 

FF2 : D_FlipFlop 
    port map(
     clk => q0, 
     clr => clr, 
     D => not_q1, 
     Q => q1 
    ); 
not_q1 <= not q1; 

FF3 : D_FlipFlop 
    port map(
     clk => q1, 
     clr => clr, 
     D => not_q2, 
     Q => q2 
    ); 
not_q2 <= not q2; 

Qout <= q2 & q1 & q0; 
end Behavioral; 
+0

你是對的,除了以下:not_q0 <=不是q0。 not_q1 <=不是q1 not_q2 <=不是q2 – user2699101

+0

您可以執行'D =>(不是q0)',因爲'D'是一個輸入端口。 – Thanushan