2014-02-05 3 views
2

У меня возникли проблемы при проектировании 1-битного и 32-битного регистра в VHDL. Основные входы регистра включают в себя сигналы часов (clk), clear (clr), load/enable (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 битный выход, но по-видимому, что это просто несчастный случай.
  • Когда вы не перерегистрируете регистр, и мы не находимся на восходящем значении, вы безоговорочно устанавливаете вывод на '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; 
Смежные вопросы