管道乘法器VHDL

时间:2011-11-30 19:46:13

标签: logic vhdl

有人可以解释一下管道乘法器在VHDL中的确切运作方式吗?我明白了 串行加倍,但我似乎无法将逻辑降低。

例如,当我乘以11011010时,产品应为8位二进制数字,但我们将4位数乘以1位数,那么我们究竟如何得到结束结果?我附上了我的代码,但我不明白它是如何运作的。我很感激帮助学习代码背后的逻辑。

如果问题看起来很模糊,我道歉。谢谢你的帮助!

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
--use IEEE.NUMERIC_STD.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;



entity pipe_mult is
generic (N: natural := 4);
port( x : in  std_logic_vector(N-1 downto 0);
      y: in std_logic;
      z : out  std_logic;
      ck, reset: in std_logic);
end pipe_mult;


architecture struc of pipe_mult is

component pe
port( x_i,y_i,c_in,ps_in: in std_logic;
y_out,c_out,ps_out: out std_logic;
ck, reset: in std_logic);
end component;

component DFF
port( x, reset, ck: in std_logic;
Q: out std_logic);
end component;

-- wires declaration
signal yy, c, ps: std_logic_vector(n-1 downto 0);
signal w: std_logic;
type debounce_state is (rdy, pulse, not_rdy);
signal d_n_s : debounce_state;
signal en: std_logic;


begin
D: DFF port map(w, reset, ck, ps(n-1));

g1: for i in 0 to n-1 generate
g2: if i=0 generate
cell: pe port map(x(i), yy(i), c(i), ps(i), yy(i+1), c(i+1), z, ck, reset);
end generate g2;
g3: if i > 0 and i < n-1 generate
cell: pe port map(x(i), yy(i), c(i), ps(i), yy(i+1), c(i+1), ps(i-1), ck, reset);
end generate g3;
g4: if i=n-1 generate
cell: pe port map(x(i), yy(i), c(i), ps(i), open, w,ps(i-1),ck,reset);
end generate g4;
end generate g1;


-- Wire Input Ports

yy(0) <= y;
c(0) <= '0';


end struc;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
--use IEEE.NUMERIC_STD.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;


entity pe is
port(    x_i,y_i,c_in,ps_in: in std_logic;
         y_out,c_out,ps_out: out std_logic;
                           ck, reset: in std_logic);
end pe;

Architecture beh of pe is
signal tmp1, tmp2, tmp3,a,sum,carry: std_logic;
begin
-- synchronous state storages
process(ck)
begin
if ck='1' and ck'event then
   if reset='1' then tmp1 <= '0'; tmp2 <= '0'; tmp3 <= '0';
     else
       tmp1 <= Y_i;
       tmp2 <= carry;
       tmp3 <= sum;
   end if;
end if;
end process;

-- concurrrent statements for wiring
carry <= (c_in and a) or (a and ps_in) or (ps_in and c_in);
sum <= ps_in xor c_in xor a;
a <= x_i and y_i;
y_out <= tmp1;
c_out <= tmp2;
ps_out <= tmp3;
end beh;

3 个答案:

答案 0 :(得分:3)

好的 - 看起来你必须为pe绘制一个真值表。

我怀疑它正在进行有线转移并添加:

[a3 a2 a1 a0 * b3 b2 b1 b0]将是这样的:

                                 a3.b0   a2.b0   a1.b0   a0.b0
+                        a3.b1   a2.b1   a1.b1   a0.b1    '0'
+                a3.b2   a2.b2   a1.b2   a0.b2    '0'     '0'
+        a3.b3   a2.b3   a1.b3   a0.b3   ' 0'     '0'     '0'
+         c5      c4      c3      c2      c1      c0    
--------------------------------------------------------------
   c6  &  p6   &  p5   &  p4   &  p3   &  p2   &  p1   & a0.b0 

哪里'。'是一个AND。请注意,每个进位都是从前一阶段传播的。

这可以解释代码的高度结构性 - 我承认不想深入分析。

答案 1 :(得分:3)

唷!这需要一些解决。拿一条大鱼, SLAP 谁用它编写代码。 (听起来不像是你)

看起来pe在y_out和Y_i之间有一个寄存器,所以整个块期望这些值在运行所需的N(= 4)个时钟周期内呈现给它。

x(3 downto 0), y(3)
x(3 downto 0), y(2)
x(3 downto 0), y(1)
x(3 downto 0), y(0)

这是“收缩阵列倍增器”的一个例子(收缩期指的是围绕阵列泵送的数据,就像心脏泵出身体周围的血液一样)。由于门数较低,它们在90年代非常流行,它们避免了长链条的问题。由于低性能(获得结果的N个时钟)和功耗(每个周期锁存新值的寄存器),收缩阵列在今天并不流行。今天,我们更有可能想要表现并花大门进行前瞻。自95年以来,我没有接触过收缩期乘数。

答案 2 :(得分:1)

您可以展开生成循环并绘制管道,但如果没有pe组件本身的架构,它将没有任何意义。

此代码中存在许多问题:

  • z是一位
  • z被驱逐出管道的第0阶段,而不是最后一个
  • w未被驱逐,是最后阶段的输入

我认为你应该把它画出来并重新评估它。