实验要求:在之前的浮点型乘法器的基础上,向输入信号加上一个寄存器,修改代码并使之正确运行。
Modify the VHDL to add registers to the inputs and verify it still behaves correctly.
通用的寄存器(即 FF/flipflop 或 register)的代码:
LIBRARY ieee;
USE IEEE.std_logic_1164.all;
USE IEEE.std_logic_arith.all;
ENTITY registers is
port(
D: in std_logic_vector(31 downto 0);
Q: out std_logic_vector(31 downto 0);
rst: in std_logic;
clk: in std_logic
);
END registers;
Architecture behavior of registers is
BEGIN
process(clk)
begin
if(rst<='0') then
Q<=(others=>'0');
elsif(rising_edge(clk)) then
Q<=D;
end if;
end process;
END behavior;
这里要特别注意 register 实体的命名,由于 register 名称占用,需要用 registers 或者其他可用单词代替,否则总是会出现提示实体缺失。
这里因为增加了component registers,则top level需要做一些改变,首先由于registers中增加了一个rst信号,即reset信号,需要在Reg_FPmul的接口中增加一个std_logic信号rst:
ENTITY Reg_FPmul IS
PORT(
FP_A : IN std_logic_vector (31 DOWNTO 0);
FP_B : IN std_logic_vector (31 DOWNTO 0);
clk : IN std_logic;
rst : IN std_logic;
FP_Z : OUT std_logic_vector (31 DOWNTO 0)
);
END Reg_FPmul ;
其次FP_A,FP_B可以直接赋值给registers,那么需要新增Q_A和Q_B信号将32位数据传递给FPmul_stage1:
SIGNAL Q_A : std_logic_vector(31 DOWNTO 0);
SIGNAL Q_B : std_logic_vector(31 DOWNTO 0);
那么COMPONENT FPmul_stage1接收的信号需要改变为Q_A和Q_B:
I1 : FPmul_stage1
PORT MAP (
FP_A => Q_A,
FP_B => Q_B,
另外configuration部分不要忘记加上registers的work.registers