]> AND Private Git Repository - blast.git/blob - lib/implementations/multadd_ctrl.vhd
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
correct relative positionning of source/group
[blast.git] / lib / implementations / multadd_ctrl.vhd
1 -------------------------------------------------------------------------------
2 --
3 --  File          : multadd_ctrl.vhd
4 --  Related files : multadd.vhd
5 --
6 --  Author(s)     : stephane Domas (sdomas@univ-fcomte.fr)
7 --
8 --  Creation Date : 2015/04/27
9 --
10 --  Description   : This component is generated automatically.
11 --                  It contains processes to r/w registers defined for multadd
12 --                  via wishbone.
13 --
14 --  Note          : No notes
15 --
16 -------------------------------------------------------------------------------
17
18 library IEEE;
19 use IEEE.std_logic_1164.all;
20 use IEEE.numeric_std.all;
21
22 -------------------------------------------------------------------------------
23 --  wishbone registers
24 -------------------------------------------------------------------------------
25 --  name               bits            address  R/W         
26 --  wb_do_op           0               0x0000    W
27 --  wb_c               (15 downto 0)   0x0001    W
28 --  wb_d               (15 downto 0)   0x0002    R
29 --  wb_d               (31 downto 0)   0x0003    R
30 --
31 -------------------------------------------------------------------------------
32
33 entity multadd_ctrl is
34   generic (
35     wb_data_width : integer := 16;
36     wb_addr_width : integer := 2
37     );
38   port (
39     -- clk/rst from interconnector
40     rst : in std_logic;
41     clk : in std_logic;
42
43     -- addr/data from interconnector
44     addr_i : in  std_logic_vector(wb_addr_width-1 downto 0);
45     dat_i  : in  std_logic_vector(wb_data_width-1 downto 0);
46     dat_o  : out std_logic_vector(wb_data_width-1 downto 0);
47     cyc_i  : in  std_logic;
48     stb_i  : in  std_logic;
49     we_i   : in  std_logic;
50     ack_o  : out std_logic;
51
52     -- registers r/w via wishbone that are forwarded to the block
53     wb_do_op : out  std_logic;
54     wb_c     : out  std_logic_vector(wb_data_width-1 downto 0);
55     wb_d     : in std_logic_vector(2*wb_data_width-1 downto 0)
56
57     );
58 end multadd_ctrl;
59
60
61 architecture multadd_ctrl1 of multadd_ctrl is
62
63   -- signals : registers r/w via wishbone
64   signal wb_do_op_s : std_logic;
65   signal wb_c_s     : std_logic_vector(wb_data_width-1 downto 0);
66   signal wb_d_s     : std_logic_vector(2*wb_data_width-1 downto 0);
67
68   -- signals : wishbone related
69   signal read_data : std_logic_vector(wb_data_width-1 downto 0);
70   signal read_ack  : std_logic;
71   signal write_ack : std_logic;
72   signal write_rise : std_logic;
73
74 begin
75 -- ----------------------------------------------------------------------------
76 --  signals from/to ports
77 -- ----------------------------------------------------------------------------
78   wb_d_s <= wb_d;
79   wb_c <= wb_c_s;
80   wb_do_op <= wb_do_op_s;
81   
82 -- ----------------------------------------------------------------------------
83 --  write rising edge detection
84 -- ----------------------------------------------------------------------------
85   detection_front : process(gls_clk, gls_reset)
86     variable signal_old : std_logic;
87   begin
88     if (gls_reset = '1') then
89       signal_old := '0';
90       write_rise <= '0';
91     elsif rising_edge(gls_clk) then
92       if (signal_old = '0' and stb_i = '1' and cyc_i = '1' and we_i = '1') then
93         write_rise <= '1';
94       else
95         write_rise <= '0';
96       end if;
97       signal_old := we_i;
98     end if;
99   end process detection_front;
100
101 -- ----------------------------------------------------------------------------
102 --  Register reading process
103 -- ----------------------------------------------------------------------------
104   reading_reg : process(clk, rst)
105   begin
106     if(rst = '1') then
107       read_ack  <= '0';
108       read_data <= (others => '0');
109     elsif(rising_edge(clk)) then
110       read_ack <= '0';
111       if (stb_i = '1' and cyc_i = '1' and we_i = '0') then
112         read_ack <= '1';
113         if(addr_i = "10") then
114           read_data <= wb_d_s(15 downto 0);
115         elsif(addr_i = "11") then
116           read_data <= wb_d_s(31 downto 16);
117         else
118           read_data <= (others => '0');
119         end if;
120       end if;
121     end if;
122   end process reading_reg;
123
124 -- ----------------------------------------------------------------------------
125 --  Register writing process
126 -- ----------------------------------------------------------------------------
127   writing_reg : process(clk, rst)
128   begin
129     if(rst = '1') then
130       write_ack <= '0';
131       wb_do_op_s  <= '0';
132       wb_c_s      <= (others => '0');
133     elsif(rising_edge(clk)) then
134       write_ack <= '0';
135       wb_do_op_s  <= '0';
136       if (write_rise = '1') then
137         write_ack <= '1';
138         if (addr_i = "00") then
139           wb_do_op_s <= '1';
140         elsif (addr_i = "01") then
141           wb_c_s <= dat_i;
142         end if;
143       end if;
144     end if;
145   end process writing_reg;
146
147 -- ----------------------------------------------------------------------------
148 -- assignations for wishbone outputs
149 -- ----------------------------------------------------------------------------
150   ack_o <= read_ack or write_ack;
151   dat_o <= read_data when (stb_i = '1' and cyc_i = '1' and we_i = '0') else (others => '0');
152
153 end multadd_ctrl1;
154