Может кто-нибудь объяснить мне, как именно множитель конвейера работает в 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;