二进制串行加法器 - VHDL

时间:2013-06-05 04:13:35

标签: vhdl

我正在尝试使用结构描述在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;

然而,它似乎不起作用。 另外,管道串行加法器的最简单方法是什么?

2 个答案:

答案 0 :(得分:1)

&#34;它似乎无法正常工作&#34;很常见,但我看到的一个问题是你试图在进程中实例化组件fa: FullAdder。想想组件实例化在硬件中意味着什么,你会发现在clk的rising_edge上实例化模块是没有意义的......

将实例化移出进程,它至少应该删除你应该看到的语法错误(&#34;非法顺序语句。&#34;在ModelSim中)。

答案 1 :(得分:0)

对于串行加法器的流水线操作,最好的方法是一个接一个地连接加法器和d个触发器。所以,你会让第一个加法器的cout成为触发器的输入。该触发器的输出将是下一个加法器的cin,依此类推。但是要小心,因为你还必须通过将几个d触发器连续放入一行来复制每个加法器的s以及输入的每个位,以便将它们复制到各个流水线阶段。