182 lines
4.4 KiB
VHDL
182 lines
4.4 KiB
VHDL
|
|
library ieee;
|
||
|
|
use ieee.std_logic_1164.all;
|
||
|
|
|
||
|
|
package diq_pkg is
|
||
|
|
|
||
|
|
|
||
|
|
component Add_Synth
|
||
|
|
generic (n: integer);
|
||
|
|
port (a,b: in std_logic_vector (n-1 downto 0);
|
||
|
|
cin: in std_logic;
|
||
|
|
comp : out std_logic;
|
||
|
|
sum : out std_logic_vector (n-1 downto 0) );
|
||
|
|
end component;
|
||
|
|
|
||
|
|
component Inc_Synth
|
||
|
|
generic (n: integer);
|
||
|
|
port (a: in std_logic_vector (n-1 downto 0);
|
||
|
|
sum : out std_logic_vector (n-1 downto 0) );
|
||
|
|
end component;
|
||
|
|
|
||
|
|
end package;
|
||
|
|
|
||
|
|
library ieee;
|
||
|
|
use ieee.std_logic_1164.all;
|
||
|
|
use work.diq_pkg.all;
|
||
|
|
|
||
|
|
entity diq_array is
|
||
|
|
generic (width: integer := 8; size: integer := 7);
|
||
|
|
port (clk,reset: in std_logic;
|
||
|
|
din,bin,xin: in std_logic_vector (width-1 downto 0);
|
||
|
|
lin: in std_logic_vector (2 downto 0);
|
||
|
|
lout: out std_logic_vector (2 downto 0);
|
||
|
|
dout,bout,xout: out std_logic_vector (width-1 downto 0) );
|
||
|
|
end diq_array;
|
||
|
|
|
||
|
|
architecture systolic of diq_array is
|
||
|
|
|
||
|
|
component diq
|
||
|
|
generic (n: integer );
|
||
|
|
port (clk,reset: in std_logic;
|
||
|
|
lin: in std_logic_vector (2 downto 0);
|
||
|
|
din,bin,xin: in std_logic_vector (n-1 downto 0);
|
||
|
|
lout: out std_logic_vector (2 downto 0);
|
||
|
|
dout,bout,xout: out std_logic_vector (n-1 downto 0) );
|
||
|
|
end component;
|
||
|
|
|
||
|
|
type path is array (0 to size) of std_logic_vector (width-1 downto 0);
|
||
|
|
type l_path is array (0 to size) of std_logic_vector (2 downto 0);
|
||
|
|
signal x_path, d_path, b_path: path;
|
||
|
|
signal l_int: l_path;
|
||
|
|
begin
|
||
|
|
gen_arrays: for i in 0 to size-1 generate
|
||
|
|
each_array: diq generic map (n => width)
|
||
|
|
port map (clk => clk, din => d_path(i), bin => b_path(i), reset => reset,
|
||
|
|
xin => x_path(i), lin => l_int(i),
|
||
|
|
dout => d_path(i+1), bout => b_path(i+1),
|
||
|
|
xout => x_path(i+1), lout => l_int(i+1) );
|
||
|
|
end generate;
|
||
|
|
d_path(0) <= din;
|
||
|
|
b_path(0) <= bin;
|
||
|
|
x_path(0) <= xin;
|
||
|
|
l_int(0) <= lin;
|
||
|
|
dout <= d_path(size);
|
||
|
|
bout <= b_path(size);
|
||
|
|
xout <= x_path(size);
|
||
|
|
lout <= l_int(size);
|
||
|
|
end systolic;
|
||
|
|
|
||
|
|
library ieee;
|
||
|
|
use ieee.std_logic_1164.all;
|
||
|
|
use work.diq_pkg.all;
|
||
|
|
|
||
|
|
entity diq is
|
||
|
|
generic (n: integer := 8);
|
||
|
|
port (clk, reset: in std_logic;
|
||
|
|
din,bin,xin: in std_logic_vector (n-1 downto 0);
|
||
|
|
lin: in std_logic_vector (2 downto 0);
|
||
|
|
dout,bout,xout: out std_logic_vector (n-1 downto 0);
|
||
|
|
lout: out std_logic_vector (2 downto 0) );
|
||
|
|
end diq;
|
||
|
|
|
||
|
|
architecture diq_wordlevel of diq is
|
||
|
|
|
||
|
|
|
||
|
|
signal b_int, d_int, x_int, x_inv: std_logic_vector (n-1 downto 0);
|
||
|
|
signal l_int, l_inc: std_logic_vector (2 downto 0);
|
||
|
|
signal sel: std_logic;
|
||
|
|
signal zero,uno: std_logic;
|
||
|
|
begin
|
||
|
|
d_reg: process(clk,reset)
|
||
|
|
begin
|
||
|
|
if reset = '1' then
|
||
|
|
d_int <= (others => '0');
|
||
|
|
elsif (clk'event and clk = '1') then
|
||
|
|
d_int <= din;
|
||
|
|
end if;
|
||
|
|
end process;
|
||
|
|
|
||
|
|
l_reg: process(clk,reset)
|
||
|
|
begin
|
||
|
|
if reset = '1' then
|
||
|
|
l_int <= (others => '0');
|
||
|
|
elsif (clk'event and clk = '1') then
|
||
|
|
l_int <= lin;
|
||
|
|
end if;
|
||
|
|
end process;
|
||
|
|
|
||
|
|
|
||
|
|
b_reg: process(clk,reset)
|
||
|
|
begin
|
||
|
|
if reset = '1' then
|
||
|
|
b_int <= (others => '0');
|
||
|
|
elsif (clk'event and clk = '1') then
|
||
|
|
b_int <= bin;
|
||
|
|
end if;
|
||
|
|
end process;
|
||
|
|
|
||
|
|
x_reg: process(clk,reset)
|
||
|
|
begin
|
||
|
|
if reset = '1' then
|
||
|
|
x_int <= (others => '0');
|
||
|
|
elsif (clk'event and clk = '1') then
|
||
|
|
x_int <= xin;
|
||
|
|
end if;
|
||
|
|
end process;
|
||
|
|
|
||
|
|
|
||
|
|
zero <= '0';
|
||
|
|
uno <= '1';
|
||
|
|
addition: Add_Synth generic map (n => n)
|
||
|
|
port map (a => b_int, b => d_int, cin => zero, comp => open, sum => bout);
|
||
|
|
x_inv <= not x_int;
|
||
|
|
comparison: Add_Synth generic map (n => n)
|
||
|
|
port map (a => b_int, b => x_inv, cin => uno, comp => sel, sum => open);
|
||
|
|
incrementer: Inc_Synth generic map (n => 3)
|
||
|
|
port map (a => l_int, sum => l_inc);
|
||
|
|
-- outputs
|
||
|
|
lout <= l_inc when (sel = '1') else l_int;
|
||
|
|
dout <= d_int;
|
||
|
|
xout <= x_int;
|
||
|
|
end diq_wordlevel;
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
library ieee;
|
||
|
|
use ieee.std_logic_1164.all;
|
||
|
|
use ieee.std_logic_unsigned.all;
|
||
|
|
|
||
|
|
entity Inc_Synth is
|
||
|
|
generic (n: integer := 8);
|
||
|
|
port (a: in std_logic_vector (n-1 downto 0);
|
||
|
|
sum: out std_logic_vector (n-1 downto 0)
|
||
|
|
);
|
||
|
|
end Inc_Synth;
|
||
|
|
|
||
|
|
architecture compact_inc of Inc_Synth is
|
||
|
|
signal cx: std_logic_vector (n downto 0);
|
||
|
|
begin
|
||
|
|
cx <= ('0' & a) + '1';
|
||
|
|
sum <= cx (n-1 downto 0);
|
||
|
|
end compact_inc;
|
||
|
|
|
||
|
|
library ieee;
|
||
|
|
use ieee.std_logic_1164.all;
|
||
|
|
use ieee.std_logic_unsigned.all;
|
||
|
|
|
||
|
|
entity Add_Synth is
|
||
|
|
generic (n: integer := 8);
|
||
|
|
port (a, b: in std_logic_vector (n-1 downto 0);
|
||
|
|
sum: out std_logic_vector (n-1 downto 0);
|
||
|
|
cin: in std_logic;
|
||
|
|
comp: out std_logic );
|
||
|
|
end Add_Synth;
|
||
|
|
|
||
|
|
architecture compact of Add_Synth is
|
||
|
|
signal cx: std_logic_vector (n downto 0);
|
||
|
|
begin
|
||
|
|
cx <= ('0' & a) + ('0' & b) + cin;
|
||
|
|
sum <= cx (n-1 downto 0);
|
||
|
|
comp <= cx(n-1);
|
||
|
|
end compact;
|