OpenCores
URL https://opencores.org/ocsvn/highload/highload/trunk

Subversion Repositories highload

[/] [highload/] [trunk/] [lc_use.vhd] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 alexadmin
-- High load test project.
2
-- Alexey Fedorov, 2014
3
-- email: FPGA@nerudo.com
4
--
5
-- It implements 256 LUT/DFFs per one row (NUM_ROWS parameter) 
6
-- with default other parameters
7
 
8
library ieee;
9
use ieee.std_logic_1164.all;
10
use ieee.numeric_std.all;
11
 
12
 
13
entity lc_use is
14
        generic (
15 4 alexadmin
            RECURSION_IDX : positive := 1; -- 1 = stop recursion
16 2 alexadmin
                DATA_WIDTH : positive := 128;
17
                ARITH_SIZE : positive := 16; -- Should be divider of DATA_WIDTH
18 3 alexadmin
                NUM_ROWS: positive := 6;        -- Input pins
19
                ADD_PIPL_FF : boolean := false
20 2 alexadmin
                );
21
        port
22
        (
23
                clk     : in  std_logic;
24
                inputs: in std_logic_vector(DATA_WIDTH-1 downto 0);
25
                dataout: out std_logic_vector(DATA_WIDTH-1 downto 0)
26
        );
27
end lc_use;
28
 
29
 
30
architecture rtl of lc_use is
31
type TArr is array (natural range <>) of unsigned(127 downto 0);
32 3 alexadmin
signal arr : TArr(0 to 3*NUM_ROWS) := (others => (others => '0'));
33 4 alexadmin
signal dataout_i: std_logic_vector(DATA_WIDTH-1 downto 0);
34 2 alexadmin
 
35 4 alexadmin
 
36 2 alexadmin
begin
37
 
38
assert DATA_WIDTH mod ARITH_SIZE = 0 report "ARITH_SIZE should be divider of DATA_WIDTH" severity error;
39
 
40
process(clk)
41
begin
42
if rising_edge(clk) then
43
        arr(0)(DATA_WIDTH-1 downto 0) <= unsigned(inputs);
44
        for i in 0 to NUM_ROWS-1 loop
45 3 alexadmin
                arr(3*i+1) <= arr(3*i) xor (arr(3*i) rol 1) xor (arr(3*i) rol 2) xor (arr(3*i) rol 3);
46 2 alexadmin
                for j in 0 to DATA_WIDTH/ARITH_SIZE-1 loop
47 3 alexadmin
                        arr(3*i+2)((j+1)*ARITH_SIZE - 1 downto j*ARITH_SIZE) <=
48
                                arr(3*i+0)((j+1)*ARITH_SIZE - 1 downto j*ARITH_SIZE) +
49
                                arr(3*i+1)((j+1)*ARITH_SIZE - 1 downto j*ARITH_SIZE);
50 2 alexadmin
                end loop;
51 3 alexadmin
                if ADD_PIPL_FF then
52
                  arr(3*i+3) <= arr(3*i+2);
53
                end if;
54 2 alexadmin
        end loop;
55
 
56 4 alexadmin
        dataout_i <= std_logic_vector(arr(3*NUM_ROWS));
57 2 alexadmin
 
58
end if;
59
 
60
end process;
61
 
62 3 alexadmin
no_ff_gen: if not ADD_PIPL_FF generate
63
    ff_loop_gen: for i in 0 to NUM_ROWS-1 generate
64
        arr(3*i+3) <= arr(3*i+2);
65
    end generate;
66
end generate;
67
 
68 4 alexadmin
gen_rec1: if RECURSION_IDX = 1 generate
69
    dataout <= dataout_i;
70
end generate;
71 3 alexadmin
 
72 4 alexadmin
gen_recN: if RECURSION_IDX > 1 generate
73
lc_i: entity work.lc_use
74
        generic map (
75
            RECURSION_IDX => RECURSION_IDX-1,
76
                DATA_WIDTH => 128,
77
                ARITH_SIZE => 16, -- Should be divider of DATA_WIDTH
78
                NUM_ROWS         => 6,  -- Input pins
79
                ADD_PIPL_FF => true
80
                )
81
        port map
82
        (
83
                clk              => clk,
84
                inputs => dataout_i,
85
                dataout=> dataout
86
        );
87
end generate;
88
 
89 2 alexadmin
end rtl;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.