我正在尝试使用结构描述在VHDL中设计一个32位二进制串行加法器。加法器应使用全加器和d锁存器。我的看法是:
全程加法器:
architecture Behavioral of FullAdder is
begin
s <= (x xor y) xor cin;
cout <= (x and y) or (y and cin) or (x and cin);
end Behavioral;
D-Latch:
architecture Behavioral of dLatch is
begin
state: process(clk)
begin
if(clk'event and clk = '1') then
q <= d;
end if;
end process;
end Behavioral;
串行加法器:
add: process ( clk )
variable count : integer range 0 to 31;
variable aux : STD_LOGIC;
variable aux2 : STD_LOGIC;
begin
if(clk'event and clk = '1') then
fa: FullAdder port map(x(count), y(count), aux, s(count), aux2);
dl: dLatch port map(clock, aux2, aux);
count := count + 1;
end if;
end process;
然而,它似乎不起作用。 另外,管道串行加法器的最简单方法是什么?
答案 0 :(得分:1)
&#34;它似乎无法正常工作&#34;很常见,但我看到的一个问题是你试图在进程中实例化组件fa: FullAdder
。想想组件实例化在硬件中意味着什么,你会发现在clk的rising_edge上实例化模块是没有意义的......
将实例化移出进程,它至少应该删除你应该看到的语法错误(&#34;非法顺序语句。&#34;在ModelSim中)。
答案 1 :(得分:0)
对于串行加法器的流水线操作,最好的方法是一个接一个地连接加法器和d个触发器。所以,你会让第一个加法器的cout成为触发器的输入。该触发器的输出将是下一个加法器的cin,依此类推。但是要小心,因为你还必须通过将几个d触发器连续放入一行来复制每个加法器的s以及输入的每个位,以便将它们复制到各个流水线阶段。