Трубопроводный множитель VHDL - PullRequest
1 голос
/ 30 ноября 2011

Может кто-нибудь объяснить мне, как именно множитель конвейера работает в VHDL?Я понимаю, что он умножается последовательно, но я не могу понять логику.

Например, когда я умножаю 1101 и 1010, произведение должно быть 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 ]

3 голосов
/ 01 декабря 2011

ОК - похоже, вам нужно нарисовать таблицу истинности для пэ.

Я подозреваю, что происходит, что он выполняет проводные смены и добавляет:

[a3 a2 a1a0 * 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.Обратите внимание, что каждый перенос переносится с предыдущего этапа.

Это может объяснить очень структурную природу кода - который я признаю, что не хочу глубоко анализировать.

3 голосов
/ 01 декабря 2011

Уф!Это потребовало некоторого разгрома.Возьми большую рыбу и 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-го года я не трогал систолический множитель.

1 голос
/ 01 декабря 2011

Вы можете развернуть циклы генерации и вывести канал, но без архитектуры для самого компонента pe это не будет иметь никакого смысла.

В этом коде много проблем:

  • z - один бит
  • z удаляется с нулевой ступени трубы, а не с последней
  • w является недревесным и является входом в финальную стадию

Я думаю, вы должны сделать это и переоценить.

...