Line 120... |
Line 120... |
signal ramdatai_s : STD_LOGIC_VECTOR(RAMDATA_W-1 downto 0);
|
signal ramdatai_s : STD_LOGIC_VECTOR(RAMDATA_W-1 downto 0);
|
signal ramwe_s : STD_LOGIC;
|
signal ramwe_s : STD_LOGIC;
|
signal latch_done_reg : STD_LOGIC;
|
signal latch_done_reg : STD_LOGIC;
|
signal requestwr_reg : STD_LOGIC;
|
signal requestwr_reg : STD_LOGIC;
|
signal releasewr_reg : STD_LOGIC;
|
signal releasewr_reg : STD_LOGIC;
|
signal ready_prev_reg : STD_LOGIC;
|
|
signal completed_reg : STD_LOGIC;
|
signal completed_reg : STD_LOGIC;
|
signal col_tmp_reg : UNSIGNED(RAMADRR_W/2-1 downto 0);
|
signal col_tmp_reg : UNSIGNED(RAMADRR_W/2-1 downto 0);
|
begin
|
begin
|
|
|
ready_sg:
|
ready_sg:
|
Line 157... |
Line 156... |
ready_reg <= '0';
|
ready_reg <= '0';
|
latchbuf_reg <= (others => (others => '0'));
|
latchbuf_reg <= (others => (others => '0'));
|
istate_reg <= IDLE_I;
|
istate_reg <= IDLE_I;
|
latch_done_reg <= '0';
|
latch_done_reg <= '0';
|
requestwr_reg <= '0';
|
requestwr_reg <= '0';
|
ready_prev_reg <= '0';
|
|
elsif clk = '1' and clk'event then
|
elsif clk = '1' and clk'event then
|
|
|
ready_prev_reg <= ready_reg;
|
|
|
|
case istate_reg is
|
case istate_reg is
|
|
|
when IDLE_I =>
|
when IDLE_I =>
|
if idv = '1' then
|
if idv = '1' then
|
requestwr_reg <= '1';
|
requestwr_reg <= '1';
|
Line 231... |
Line 227... |
col_reg <= (others => '0');
|
col_reg <= (others => '0');
|
row_reg <= (others => '0');
|
row_reg <= (others => '0');
|
state_reg <= IDLE;
|
state_reg <= IDLE;
|
cnt_reg <= (others => '0');
|
cnt_reg <= (others => '0');
|
databuf_reg <= (others => (others => '0'));
|
databuf_reg <= (others => (others => '0'));
|
romeaddro0 <= (others => '0');
|
|
romeaddro1 <= (others => '0');
|
|
romeaddro2 <= (others => '0');
|
|
romeaddro3 <= (others => '0');
|
|
romeaddro4 <= (others => '0');
|
|
romeaddro5 <= (others => '0');
|
|
romeaddro6 <= (others => '0');
|
|
romeaddro7 <= (others => '0');
|
|
romeaddro8 <= (others => '0');
|
|
romoaddro0 <= (others => '0');
|
|
romoaddro1 <= (others => '0');
|
|
romoaddro2 <= (others => '0');
|
|
romoaddro3 <= (others => '0');
|
|
romoaddro4 <= (others => '0');
|
|
romoaddro5 <= (others => '0');
|
|
romoaddro6 <= (others => '0');
|
|
romoaddro7 <= (others => '0');
|
|
romoaddro8 <= (others => '0');
|
|
ramwaddro <= (others => '0');
|
ramwaddro <= (others => '0');
|
ramdatai_s <= (others => '0');
|
ramdatai_s <= (others => '0');
|
ramwe_s <= '0';
|
ramwe_s <= '0';
|
releasewr_reg <= '0';
|
releasewr_reg <= '0';
|
completed_reg <= '0';
|
completed_reg <= '0';
|
Line 289... |
Line 267... |
----------------------
|
----------------------
|
when GET_ROM =>
|
when GET_ROM =>
|
|
|
ramwe_s <='0';
|
ramwe_s <='0';
|
|
|
-- read precomputed MAC results from LUT
|
|
romeaddro0 <= STD_LOGIC_VECTOR(col_reg(RAMADRR_W/2-1 downto 1)) &
|
|
databuf_reg(0)(0) &
|
|
databuf_reg(1)(0) &
|
|
databuf_reg(2)(0) &
|
|
databuf_reg(3)(0);
|
|
romeaddro1 <= STD_LOGIC_VECTOR(col_reg(RAMADRR_W/2-1 downto 1)) &
|
|
databuf_reg(0)(1) &
|
|
databuf_reg(1)(1) &
|
|
databuf_reg(2)(1) &
|
|
databuf_reg(3)(1);
|
|
romeaddro2 <= STD_LOGIC_VECTOR(col_reg(RAMADRR_W/2-1 downto 1)) &
|
|
databuf_reg(0)(2) &
|
|
databuf_reg(1)(2) &
|
|
databuf_reg(2)(2) &
|
|
databuf_reg(3)(2);
|
|
romeaddro3 <= STD_LOGIC_VECTOR(col_reg(RAMADRR_W/2-1 downto 1)) &
|
|
databuf_reg(0)(3) &
|
|
databuf_reg(1)(3) &
|
|
databuf_reg(2)(3) &
|
|
databuf_reg(3)(3);
|
|
romeaddro4 <= STD_LOGIC_VECTOR(col_reg(RAMADRR_W/2-1 downto 1)) &
|
|
databuf_reg(0)(4) &
|
|
databuf_reg(1)(4) &
|
|
databuf_reg(2)(4) &
|
|
databuf_reg(3)(4);
|
|
romeaddro5 <= STD_LOGIC_VECTOR(col_reg(RAMADRR_W/2-1 downto 1)) &
|
|
databuf_reg(0)(5) &
|
|
databuf_reg(1)(5) &
|
|
databuf_reg(2)(5) &
|
|
databuf_reg(3)(5);
|
|
romeaddro6 <= STD_LOGIC_VECTOR(col_reg(RAMADRR_W/2-1 downto 1)) &
|
|
databuf_reg(0)(6) &
|
|
databuf_reg(1)(6) &
|
|
databuf_reg(2)(6) &
|
|
databuf_reg(3)(6);
|
|
romeaddro7 <= STD_LOGIC_VECTOR(col_reg(RAMADRR_W/2-1 downto 1)) &
|
|
databuf_reg(0)(7) &
|
|
databuf_reg(1)(7) &
|
|
databuf_reg(2)(7) &
|
|
databuf_reg(3)(7);
|
|
romeaddro8 <= STD_LOGIC_VECTOR(col_reg(RAMADRR_W/2-1 downto 1)) &
|
|
databuf_reg(0)(8) &
|
|
databuf_reg(1)(8) &
|
|
databuf_reg(2)(8) &
|
|
databuf_reg(3)(8);
|
|
|
|
state_reg <= SUM;
|
state_reg <= SUM;
|
|
|
---------------------
|
---------------------
|
-- do distributed arithmetic sum on even part,
|
-- do distributed arithmetic sum on even part,
|
-- write even part to RAM
|
-- write even part to RAM
|
Line 363... |
Line 294... |
ramwaddro <= STD_LOGIC_VECTOR(col_reg & row_reg);
|
ramwaddro <= STD_LOGIC_VECTOR(col_reg & row_reg);
|
|
|
col_reg <= col_reg + 1;
|
col_reg <= col_reg + 1;
|
col_tmp_reg <= col_reg + 2;
|
col_tmp_reg <= col_reg + 2;
|
|
|
romoaddro0 <= STD_LOGIC_VECTOR(col_reg(RAMADRR_W/2-1 downto 1)) &
|
|
databuf_reg(4)(0) &
|
|
databuf_reg(5)(0) &
|
|
databuf_reg(6)(0) &
|
|
databuf_reg(7)(0);
|
|
romoaddro1 <= STD_LOGIC_VECTOR(col_reg(RAMADRR_W/2-1 downto 1)) &
|
|
databuf_reg(4)(1) &
|
|
databuf_reg(5)(1) &
|
|
databuf_reg(6)(1) &
|
|
databuf_reg(7)(1);
|
|
romoaddro2 <= STD_LOGIC_VECTOR(col_reg(RAMADRR_W/2-1 downto 1)) &
|
|
databuf_reg(4)(2) &
|
|
databuf_reg(5)(2) &
|
|
databuf_reg(6)(2) &
|
|
databuf_reg(7)(2);
|
|
romoaddro3 <= STD_LOGIC_VECTOR(col_reg(RAMADRR_W/2-1 downto 1)) &
|
|
databuf_reg(4)(3) &
|
|
databuf_reg(5)(3) &
|
|
databuf_reg(6)(3) &
|
|
databuf_reg(7)(3);
|
|
romoaddro4 <= STD_LOGIC_VECTOR(col_reg(RAMADRR_W/2-1 downto 1)) &
|
|
databuf_reg(4)(4) &
|
|
databuf_reg(5)(4) &
|
|
databuf_reg(6)(4) &
|
|
databuf_reg(7)(4);
|
|
romoaddro5 <= STD_LOGIC_VECTOR(col_reg(RAMADRR_W/2-1 downto 1)) &
|
|
databuf_reg(4)(5) &
|
|
databuf_reg(5)(5) &
|
|
databuf_reg(6)(5) &
|
|
databuf_reg(7)(5);
|
|
romoaddro6 <= STD_LOGIC_VECTOR(col_reg(RAMADRR_W/2-1 downto 1)) &
|
|
databuf_reg(4)(6) &
|
|
databuf_reg(5)(6) &
|
|
databuf_reg(6)(6) &
|
|
databuf_reg(7)(6);
|
|
romoaddro7 <= STD_LOGIC_VECTOR(col_reg(RAMADRR_W/2-1 downto 1)) &
|
|
databuf_reg(4)(7) &
|
|
databuf_reg(5)(7) &
|
|
databuf_reg(6)(7) &
|
|
databuf_reg(7)(7);
|
|
romoaddro8 <= STD_LOGIC_VECTOR(col_reg(RAMADRR_W/2-1 downto 1)) &
|
|
databuf_reg(4)(8) &
|
|
databuf_reg(5)(8) &
|
|
databuf_reg(6)(8) &
|
|
databuf_reg(7)(8);
|
|
state_reg <= WRITE_ODD;
|
state_reg <= WRITE_ODD;
|
|
|
---------------------
|
---------------------
|
-- do distributed arithmetic sum on odd part,
|
-- do distributed arithmetic sum on odd part,
|
-- write odd part to RAM
|
-- write odd part to RAM
|
Line 437... |
Line 324... |
-- reverse col/row order for transposition purpose
|
-- reverse col/row order for transposition purpose
|
ramwaddro <= STD_LOGIC_VECTOR(col_reg & row_reg);
|
ramwaddro <= STD_LOGIC_VECTOR(col_reg & row_reg);
|
|
|
-- move to next column
|
-- move to next column
|
col_reg <= col_reg + 1;
|
col_reg <= col_reg + 1;
|
|
col_tmp_reg <= col_reg + 1;
|
|
|
-- finished processing one input row
|
-- finished processing one input row
|
if col_reg = N - 1 then
|
if col_reg = N - 1 then
|
row_reg <= row_reg + 1;
|
row_reg <= row_reg + 1;
|
col_reg <= (others => '0');
|
col_reg <= (others => '0');
|
|
col_tmp_reg <= (others => '0');
|
if row_reg = N - 1 then
|
if row_reg = N - 1 then
|
releasewr_reg <= '1';
|
releasewr_reg <= '1';
|
completed_reg <= '1';
|
completed_reg <= '1';
|
end if;
|
end if;
|
state_reg <= IDLE;
|
state_reg <= IDLE;
|
else
|
else
|
|
|
|
state_reg <= SUM;
|
|
|
|
end if;
|
|
--------------------------------
|
|
-- OTHERS
|
|
--------------------------------
|
|
when others =>
|
|
state_reg <= IDLE;
|
|
end case;
|
|
end if;
|
|
end process;
|
|
|
-- read precomputed MAC results from LUT
|
-- read precomputed MAC results from LUT
|
romeaddro0 <= STD_LOGIC_VECTOR(col_tmp_reg(RAMADRR_W/2-1 downto 1)) &
|
romeaddro0 <= STD_LOGIC_VECTOR(col_tmp_reg(RAMADRR_W/2-1 downto 1)) &
|
databuf_reg(0)(0) &
|
databuf_reg(0)(0) &
|
databuf_reg(1)(0) &
|
databuf_reg(1)(0) &
|
databuf_reg(2)(0) &
|
databuf_reg(2)(0) &
|
Line 496... |
Line 397... |
databuf_reg(0)(8) &
|
databuf_reg(0)(8) &
|
databuf_reg(1)(8) &
|
databuf_reg(1)(8) &
|
databuf_reg(2)(8) &
|
databuf_reg(2)(8) &
|
databuf_reg(3)(8);
|
databuf_reg(3)(8);
|
|
|
state_reg <= SUM;
|
|
|
|
end if;
|
-- odd
|
--------------------------------
|
romoaddro0 <= STD_LOGIC_VECTOR(col_reg(RAMADRR_W/2-1 downto 1)) &
|
-- OTHERS
|
databuf_reg(4)(0) &
|
--------------------------------
|
databuf_reg(5)(0) &
|
when others =>
|
databuf_reg(6)(0) &
|
state_reg <= IDLE;
|
databuf_reg(7)(0);
|
end case;
|
romoaddro1 <= STD_LOGIC_VECTOR(col_reg(RAMADRR_W/2-1 downto 1)) &
|
end if;
|
databuf_reg(4)(1) &
|
end process;
|
databuf_reg(5)(1) &
|
|
databuf_reg(6)(1) &
|
|
databuf_reg(7)(1);
|
|
romoaddro2 <= STD_LOGIC_VECTOR(col_reg(RAMADRR_W/2-1 downto 1)) &
|
|
databuf_reg(4)(2) &
|
|
databuf_reg(5)(2) &
|
|
databuf_reg(6)(2) &
|
|
databuf_reg(7)(2);
|
|
romoaddro3 <= STD_LOGIC_VECTOR(col_reg(RAMADRR_W/2-1 downto 1)) &
|
|
databuf_reg(4)(3) &
|
|
databuf_reg(5)(3) &
|
|
databuf_reg(6)(3) &
|
|
databuf_reg(7)(3);
|
|
romoaddro4 <= STD_LOGIC_VECTOR(col_reg(RAMADRR_W/2-1 downto 1)) &
|
|
databuf_reg(4)(4) &
|
|
databuf_reg(5)(4) &
|
|
databuf_reg(6)(4) &
|
|
databuf_reg(7)(4);
|
|
romoaddro5 <= STD_LOGIC_VECTOR(col_reg(RAMADRR_W/2-1 downto 1)) &
|
|
databuf_reg(4)(5) &
|
|
databuf_reg(5)(5) &
|
|
databuf_reg(6)(5) &
|
|
databuf_reg(7)(5);
|
|
romoaddro6 <= STD_LOGIC_VECTOR(col_reg(RAMADRR_W/2-1 downto 1)) &
|
|
databuf_reg(4)(6) &
|
|
databuf_reg(5)(6) &
|
|
databuf_reg(6)(6) &
|
|
databuf_reg(7)(6);
|
|
romoaddro7 <= STD_LOGIC_VECTOR(col_reg(RAMADRR_W/2-1 downto 1)) &
|
|
databuf_reg(4)(7) &
|
|
databuf_reg(5)(7) &
|
|
databuf_reg(6)(7) &
|
|
databuf_reg(7)(7);
|
|
romoaddro8 <= STD_LOGIC_VECTOR(col_reg(RAMADRR_W/2-1 downto 1)) &
|
|
databuf_reg(4)(8) &
|
|
databuf_reg(5)(8) &
|
|
databuf_reg(6)(8) &
|
|
databuf_reg(7)(8);
|
|
|
end RTL;
|
end RTL;
|
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
|
|
No newline at end of file
|
No newline at end of file
|