2014-11-06 108 views
0

所以我一直在使用VHDL創建一個寄存器,如果LOAD爲1,它將在輸入X中加載,並以串行方式輸出數據,基本上是並行串行輸出寄存器。輸入X是一個4位(3 Downto 0)輸入,當寄存器成功輸出輸入中的所有btis時,我想讓程序執行的操作始終輸出0。VHDL移位寄存器使用信號和變量編程不同的結果

將「count」定義爲信號時有效,但是,如果將count定義爲變量,則無論負載是否爲1,輸出都爲常量0。我的代碼如下所示:

entity qn14 is 
    Port (clk : in STD_LOGIC; 
     reset : in STD_LOGIC; 
     LOAD : in STD_LOGIC; 
     X : in STD_LOGIC_VECTOR (3 downto 0); 
     output : out STD_LOGIC); 
end qn14; 

architecture qn14_beh of qn14 is 
    type states is (IDLE , SHIFT); 
    signal state : states; 
    signal count: STD_LOGIC_VECTOR(1 downto 0); 
begin 

    process(clk , reset) 
    variable temp: STD_LOGIC; 
    variable data: STD_LOGIC_VECTOR(3 downto 0); 
    begin 
    if reset = '1' then 
     state <= IDLE; 
     count <= "00"; 
     output <= '0'; 
    elsif clk'event and clk = '1' then 
     case state is 
     when IDLE => 
      if LOAD = '1' then 
      data := X; 
      output <= '0'; 
      state <= SHIFT; 
      elsif LOAD = '0' then 
      output <= '0'; 
      end if; 

     when SHIFT => 
      if LOAD ='1' then 
      output <= '0'; 
      elsif LOAD = '0' then 
      output <= data(conv_integer(count)); 
      count <= count + 1; 
      if (count >= 3) then 
       state <= IDLE ; 
      end if; 
      end if; 
     end case; 
    end if; 
    end process; 

end qn14_beh; 

希望能夠就此澄清。

謝謝。

+0

***它將「count」定義爲信號時有效,但是,如果將count定義爲變量,則無論負載是否爲「1」,輸出都爲常量0。 ,但你的問題是什麼?您不會將'count'作爲變量顯示版本,並且您的代碼不是[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。賦值給變量是立即的,新值可以立即在表達式中求值。計劃分配的信號值,預測的輸出波形和未來模擬週期中可用的值。 – user1155120 2014-11-06 18:59:09

回答

0

這可能不完全回答你的問題,但我會涵蓋我看到的幾個問題。

elsif LOAD = '0' then可能只是else,除非您嘗試覆蓋其他狀態(X,U ...),但您仍然想要else來覆蓋這些狀態。

count = 3count >= 3更清楚。 count是2位的載體,所以它永遠不能大於3

雖然你的輸出0LOAD而在SHIFT狀態,你實際上並沒有加載新的值被認定。你打算?

更改計數的變量,而不改變分配的位置會導致你的第一個X - >output序列終止早週期(你增加count你測試對3之前)。這將導致後續X - >output序列去 「X(3)X(0)X(1)X(2)

變量temp從未使用過。變量data可以像信號一樣工作。這個用法不需要​​變量的屬性。這也提出了你爲什麼試圖將count作爲變量的問題;除非您需要即時分配變量,否則使用信號通常會更好,因爲信號在(大多數)模擬​​器中更容易查看,而且更難以出錯。我希望你不要試圖以count作爲變量,但只是有一個學術好奇心,爲什麼它不起作用。

你在模擬器中看過嗎?你正在改變國家嗎?所有輸入的所有位都強制驅動到一個定義的值('1''0')?

我沒有看到任何會導致您所描述的失敗僅僅是從信號中將count更改爲變量的內容,但是這種更改會導致上述不希望的行爲。我最好的猜測是你的症狀來自你如何推動你的投入的問題。