在VHDL中注册设计

时间:2014-02-05 15:35:56

标签: vhdl

我在用VHDL设计1位和32位寄存器时遇到了一些麻烦。寄存器的主要输入包括时钟(clk),清除(clr),加载/使能(ld)信号和n位数据(d)。 n位输出用(q)表示。到目前为止,我相信已经制作了一个1位寄存器,这是我的代码:

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位寄存器。一些帮助将不胜感激。

1 个答案:

答案 0 :(得分:16)

因此,让我们首先看一下代码中的一些问题:

  • 你有一个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;