2013-06-05 30 views
-1

我想用VHDL设计一个32位二进制串行加法器,使用结构化描述。加法器应该使用一个完整的加法器和一个d-latch。我看到它的方式是:二进制串行加法器 - VHDL

全加器:

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-锁:

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

因为您已经使用信号到端口的postional映射,所以在没有实体声明的情况下检查有点困难。我建议使用命名的端口映射(pinname => signal_name)。你建立了一个模拟?如果不这样做。如果你有,用它来向我们解释“这似乎不起作用”的意思 - 你期望看到什么?你究竟看到了什么? –

回答

0

“它似乎没有工作”是非常普遍的,但我看到的一个问题是,您正试图在进程中实例化组件fa: FullAdder。想想硬件中的组件实例是什么意思,你会意识到,在clk的rising_edge上实例化模块是没有意义的...

将实例化移出进程,并且它应该至少删除语法您应该看到错误(ModelSim中的“非法顺序语句”)。

0

对于流水线串行加法器,最好的方法是将加法器和触发器依次连接起来。所以,你应该将第一个加法器的输出作为触发器的输入。该触发器的输出将是下一个加法器的cin,依此类推。但要小心,因为你必须将每个加法器的s以及输入的每一位都流水,通过将几个d触发器放在一行中来复制它们通过不同的流水线阶段。