2013-12-16 51 views
0

我有簡單的寄存器並從5個狀態機(一次都有)獲取單個位值。這些值作爲std_logic_vector存儲在一個寄存器中,並且必須作爲另一個模塊的輸入。一旦這個寄存器的輸出在另一個模塊中被處理,寄存器中的索引就會發生變化(e,g 0到1),該索引處的值應該被重置(e,g 1到0),它應該對於那個特定的索引不需要進一步的輸入(但是有來自狀態機的持續輸入)。任何建議,應該怎麼做?重置VHDL寄存器中的值並停止進一步寫入

的註冊登記號爲:

entity fault_reg is 

port (
    clk   : in std_logic; 
    rst   : in std_logic; 
    reg_in  : in std_logic_vector(NUM_PORTS - 1 downto 0); 
    reg_out  : out std_logic_vector(NUM_PORTS - 1 downto 0)); 
end fault_reg; 

architecture Behavioral of fault_reg is 
begin 

reg_impl : process(clk, rst) 
begin 
    if rst = '1' then 
     reg_out <= (others => '0'); 
    elsif clk'event and clk='1' then 
     reg_out <= reg_in; 
    end if; 
end process reg_impl; 

end Behavioral; 

回答

1

我不能完全確定你的要求,但在我看來,你想要的東西,如:

  • 初始化你reg_out爲全
  • 然後在鍾控過程中做一個for循環遍歷所有輸入位並清除在輸入中設置的位

想要這樣:

reg_out <= reg_in; 
for i in reg_in'range loop 
    if reg_in(i) = '1' then 
     masked_bits(i) := '1'; 
    end if; 
    if masked_bits(i) = '1' then 
     reg_out(i) <= '0'; 
    end if; 
end loop; 
+0

不是這樣。最初的輸入值應該是這樣的寄存器輸出:'reg_out <= reg_in',之後它應該檢查'reg_in'的哪個索引是** 1 **,並且它應該總是使用** 0 **作爲該索引同時它不應該接受該輸入索引的更多值(因爲連續值將來自另一個模塊以避免重寫)。 – Digeek

+1

好的,在這種情況下,你需要另一箇中間人來跟蹤哪些位是活的,哪些不是... –

+0

好的,我明白了你的觀點。我添加了一個'select'輸入,當輸出爲'1'時爲'1',在這種情況下,它應該寫入常量'0'而不是**輸入**值。 – Digeek