2014-02-05 112 views
2

我在設計VHDL中的1位和32位寄存器時遇到了一些麻煩。寄存器的主要輸入包括時鐘(clk),清零(clr),加載/使能(ld)信號和n位數據(d)。 n位輸出由(q)表示。到目前爲止,我相信已經做出了1位寄存器,這裏是我的代碼:VHDL寄存器設計

LIBRARY ieee; 
USE ieee.std_logic_1164.ALL; 
USE ieee.std_logic_arith.ALL; 
USE ieee.std_logic_unsigned.ALL; 
ENTITY register32 IS 
PORT(
d : IN STD_LOGIC_VECTOR(31 DOWNTO 0); -- input. 
ld : IN STD_LOGIC; -- load/enable. 
clr : IN STD_LOGIC; -- async. clear. 
clk : IN STD_LOGIC; -- clock. 
q : OUT STD_LOGIC; -- output. 
END register32; 
ARCHITECTURE description OF register32 IS 

BEGIN 

process(clk, clr, ld) 
    begin 
     if clr = '1' then 
     q <= '0'; 
     elsif d = '1' and ld = 1 and clk'event and clk='1' then 
     q <= '1'; 
     elsif d = '0' and ld = 1 and clk'event and clk='1' then 
     q <= '0'; 
     else 
     q <= '0'; 
     end if; 
    end process; 
END description; 

如果這是一個1位寄存器正確的,我怎麼會讓它變成一個32位的一個。一些幫助將不勝感激。

回答

8

因此,讓我們先來看看在你的代碼的一些問題:

  • 你有一個32位輸入,1個輸出,但據推測這只是一個意外。
  • 如果您沒有重置寄存器,並且我們不在rising_edge上,則無條件地將輸出設置爲'0'。這不是建模寄存器,所以讓我們刪除它。
  • 我們還可以通過在適當的時間將d指定到q來簡化您的內部邏輯。 (這也使得32位邏輯更簡單)。
  • 我們可以將clk'event and clk='1'寫爲rising_edge(clk)
  • 您的端口聲明中有一些小的語法問題。需要注意的是最後一個成員不以分號結束,端口聲明本身在);

因此結束,這使我們有一個位寄存器:

ENTITY register1 IS PORT(
    d : IN STD_LOGIC; 
    ld : IN STD_LOGIC; -- load/enable. 
    clr : IN STD_LOGIC; -- async. clear. 
    clk : IN STD_LOGIC; -- clock. 
    q : OUT STD_LOGIC -- output. 
); 
END register1; 

ARCHITECTURE description OF register1 IS 

BEGIN 
    process(clk, clr) 
    begin 
     if clr = '1' then 
      q <= '0'; 
     elsif rising_edge(clk) then 
      if ld = '1' then 
       q <= d; 
      end if; 
     end if; 
    end process; 
END description; 

如果我們想把它擴展到32位:

ENTITY register32 IS PORT(
    d : IN STD_LOGIC_VECTOR(31 DOWNTO 0); 
    ld : IN STD_LOGIC; -- load/enable. 
    clr : IN STD_LOGIC; -- async. clear. 
    clk : IN STD_LOGIC; -- clock. 
    q : OUT STD_LOGIC_VECTOR(31 DOWNTO 0) -- output 
); 
END register32; 

ARCHITECTURE description OF register32 IS 

BEGIN 
    process(clk, clr) 
    begin 
     if clr = '1' then 
      q <= x"00000000"; 
     elsif rising_edge(clk) then 
      if ld = '1' then 
       q <= d; 
      end if; 
     end if; 
    end process; 
END description;