我在用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位寄存器。一些帮助将不胜感激。
答案 0 :(得分:16)
因此,让我们首先看一下代码中的一些问题:
'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;