source: PlatformSupport/CustomPeripherals/pcores/sw_intr_util_v1_00_a/hdl/verilog/user_logic.v

Last change on this file was 6304, checked in by murphpo, 6 years ago

New pcore to realize software-generated interrupts in MB+axi_intc designs

File size: 17.5 KB
Line 
1//----------------------------------------------------------------------------
2// user_logic.v - module
3//----------------------------------------------------------------------------
4//
5// ***************************************************************************
6// ** Copyright (c) 1995-2012 Xilinx, Inc.  All rights reserved.            **
7// **                                                                       **
8// ** Xilinx, Inc.                                                          **
9// ** XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS"         **
10// ** AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND       **
11// ** SOLUTIONS FOR XILINX DEVICES.  BY PROVIDING THIS DESIGN, CODE,        **
12// ** OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE,        **
13// ** APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION           **
14// ** THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT,     **
15// ** AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE      **
16// ** FOR YOUR IMPLEMENTATION.  XILINX EXPRESSLY DISCLAIMS ANY              **
17// ** WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE               **
18// ** IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR        **
19// ** REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF       **
20// ** INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS       **
21// ** FOR A PARTICULAR PURPOSE.                                             **
22// **                                                                       **
23// ***************************************************************************
24//
25//----------------------------------------------------------------------------
26// Filename:          user_logic.v
27// Version:           1.00.a
28// Description:       User logic module.
29// Date:              Tue Oct 30 09:50:47 2018 (by Create and Import Peripheral Wizard)
30// Verilog Standard:  Verilog-2001
31//----------------------------------------------------------------------------
32// Naming Conventions:
33//   active low signals:                    "*_n"
34//   clock signals:                         "clk", "clk_div#", "clk_#x"
35//   reset signals:                         "rst", "rst_n"
36//   generics:                              "C_*"
37//   user defined types:                    "*_TYPE"
38//   state machine next state:              "*_ns"
39//   state machine current state:           "*_cs"
40//   combinatorial signals:                 "*_com"
41//   pipelined or register delay signals:   "*_d#"
42//   counter signals:                       "*cnt*"
43//   clock enable signals:                  "*_ce"
44//   internal version of output port:       "*_i"
45//   device pins:                           "*_pin"
46//   ports:                                 "- Names begin with Uppercase"
47//   processes:                             "*_PROCESS"
48//   component instantiations:              "<ENTITY_>I_<#|FUNC>"
49//----------------------------------------------------------------------------
50
51`uselib lib=unisims_ver
52`uselib lib=proc_common_v3_00_a
53
54module user_logic
55(
56  // -- ADD USER PORTS BELOW THIS LINE ---------------
57  intrA_out,
58  intrB_out,
59  // --USER ports added here
60  // -- ADD USER PORTS ABOVE THIS LINE ---------------
61
62  // -- DO NOT EDIT BELOW THIS LINE ------------------
63  // -- Bus protocol ports, do not add to or delete
64  Bus2IP_Clk,                     // Bus to IP clock
65  Bus2IP_Resetn,                  // Bus to IP reset
66  Bus2IP_Data,                    // Bus to IP data bus
67  Bus2IP_BE,                      // Bus to IP byte enables
68  Bus2IP_RdCE,                    // Bus to IP read chip enable
69  Bus2IP_WrCE,                    // Bus to IP write chip enable
70  IP2Bus_Data,                    // IP to Bus data bus
71  IP2Bus_RdAck,                   // IP to Bus read transfer acknowledgement
72  IP2Bus_WrAck,                   // IP to Bus write transfer acknowledgement
73  IP2Bus_Error                    // IP to Bus error response
74  // -- DO NOT EDIT ABOVE THIS LINE ------------------
75); // user_logic
76
77// -- ADD USER PARAMETERS BELOW THIS LINE ------------
78// --USER parameters added here
79// -- ADD USER PARAMETERS ABOVE THIS LINE ------------
80
81// -- DO NOT EDIT BELOW THIS LINE --------------------
82// -- Bus protocol parameters, do not add to or delete
83parameter C_NUM_REG                      = 16;
84parameter C_SLV_DWIDTH                   = 32;
85// -- DO NOT EDIT ABOVE THIS LINE --------------------
86
87// -- ADD USER PORTS BELOW THIS LINE -----------------
88
89output reg intrA_out = 0;
90output reg intrB_out = 0;
91
92// --USER ports added here
93// -- ADD USER PORTS ABOVE THIS LINE -----------------
94
95// -- DO NOT EDIT BELOW THIS LINE --------------------
96// -- Bus protocol ports, do not add to or delete
97input                                     Bus2IP_Clk;
98input                                     Bus2IP_Resetn;
99input      [C_SLV_DWIDTH-1 : 0]           Bus2IP_Data;
100input      [C_SLV_DWIDTH/8-1 : 0]         Bus2IP_BE;
101input      [C_NUM_REG-1 : 0]              Bus2IP_RdCE;
102input      [C_NUM_REG-1 : 0]              Bus2IP_WrCE;
103output     [C_SLV_DWIDTH-1 : 0]           IP2Bus_Data;
104output                                    IP2Bus_RdAck;
105output                                    IP2Bus_WrAck;
106output                                    IP2Bus_Error;
107// -- DO NOT EDIT ABOVE THIS LINE --------------------
108
109//----------------------------------------------------------------------------
110// Implementation
111//----------------------------------------------------------------------------
112
113  // --USER nets declarations added here, as needed for user logic
114
115  wire [31:0] sw_state0;
116  wire [31:0] sw_state1;
117
118  wire [31:0] sw_state0_maskA;
119  wire [31:0] sw_state1_maskA;
120
121  wire [31:0] sw_state0_maskB;
122  wire [31:0] sw_state1_maskB;
123
124  wire intrA_en, intrB_en;
125 
126  wire [31:0] reg0_rd;
127 
128  // Nets for user logic slave model s/w accessible register example
129  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg0 = 0;
130  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg1 = 0;
131  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg2 = 0;
132  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg3 = 0;
133  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg4 = 0;
134  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg5 = 0;
135  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg6 = 0;
136  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg7 = 0;
137  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg8 = 0;
138  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg9 = 0;
139  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg10 = 0;
140  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg11 = 0;
141  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg12 = 0;
142  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg13 = 0;
143  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg14 = 0;
144  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg15 = 0;
145  wire       [15 : 0]                       slv_reg_write_sel;
146  wire       [15 : 0]                       slv_reg_read_sel;
147  reg        [C_SLV_DWIDTH-1 : 0]           slv_ip2bus_data = 0;
148  wire                                      slv_read_ack;
149  wire                                      slv_write_ack;
150  integer                                   byte_index, bit_index;
151
152  // USER logic implementation added here
153
154    /* Address map:
155        HDL is coded [MSB:LSB] = [31:0], per Xilinx's convention for AXI peripherals
156        regX[31] maps to 0x80000000 in C driver
157        regX[ 0] maps to 0x00000001 in C driver
158
159    0: RO/RW: Control/status register
160        [    0] = Enable (active high) for intrA output
161        [    1] = Enable (active high) for intrB output
162        [   28] = (RO) current intrA_out value
163        [   29] = (RO) current intrB_out value
164       
165    1: RW: Software state register 0
166    2: RW: Software state register 1
167
168    3: RW: Bitmask for sw state reg 0 asserting intrA
169    4: RW: Bitmask for sw state reg 1 asserting intrA
170    5: RW: Bitmask for sw state reg 0 asserting intrB
171    6: RW: Bitmask for sw state reg 1 asserting intrB
172   
173*/ 
174 
175  assign reg0_rd[31:0] = {2'b0, intrB_out, intrA_out, 26'b0, intrB_en, intrA_en};
176
177  assign intrA_en = slv_reg0[0];
178  assign intrB_en = slv_reg0[1];
179 
180  assign sw_state0[31:0] = slv_reg1;
181  assign sw_state1[31:0] = slv_reg2;
182
183  assign sw_state0_maskA[31:0] = slv_reg3;
184  assign sw_state1_maskA[31:0] = slv_reg4;
185  assign sw_state0_maskB[31:0] = slv_reg5;
186  assign sw_state1_maskB[31:0] = slv_reg6;
187
188  reg sw_intA = 0;
189  reg sw_intB = 0;
190 
191  always @(posedge Bus2IP_Clk)
192  begin
193    sw_intA <= (|(sw_state0 & sw_state0_maskA)) | (|(sw_state1 & sw_state1_maskA));
194    sw_intB <= (|(sw_state0 & sw_state0_maskB)) | (|(sw_state1 & sw_state1_maskB));
195   
196    intrA_out <= sw_intA;
197    intrB_out <= sw_intB;
198  end
199   
200  // ------------------------------------------------------
201  // Example code to read/write user logic slave model s/w accessible registers
202  //
203  // Note:
204  // The example code presented here is to show you one way of reading/writing
205  // software accessible registers implemented in the user logic slave model.
206  // Each bit of the Bus2IP_WrCE/Bus2IP_RdCE signals is configured to correspond
207  // to one software accessible register by the top level template. For example,
208  // if you have four 32 bit software accessible registers in the user logic,
209  // you are basically operating on the following memory mapped registers:
210  //
211  //    Bus2IP_WrCE/Bus2IP_RdCE   Memory Mapped Register
212  //                     "1000"   C_BASEADDR + 0x0
213  //                     "0100"   C_BASEADDR + 0x4
214  //                     "0010"   C_BASEADDR + 0x8
215  //                     "0001"   C_BASEADDR + 0xC
216  //
217  // ------------------------------------------------------
218
219  assign
220    slv_reg_write_sel = Bus2IP_WrCE[15:0],
221    slv_reg_read_sel  = Bus2IP_RdCE[15:0],
222    slv_write_ack     = Bus2IP_WrCE[0] || Bus2IP_WrCE[1] || Bus2IP_WrCE[2] || Bus2IP_WrCE[3] || Bus2IP_WrCE[4] || Bus2IP_WrCE[5] || Bus2IP_WrCE[6] || Bus2IP_WrCE[7] || Bus2IP_WrCE[8] || Bus2IP_WrCE[9] || Bus2IP_WrCE[10] || Bus2IP_WrCE[11] || Bus2IP_WrCE[12] || Bus2IP_WrCE[13] || Bus2IP_WrCE[14] || Bus2IP_WrCE[15],
223    slv_read_ack      = Bus2IP_RdCE[0] || Bus2IP_RdCE[1] || Bus2IP_RdCE[2] || Bus2IP_RdCE[3] || Bus2IP_RdCE[4] || Bus2IP_RdCE[5] || Bus2IP_RdCE[6] || Bus2IP_RdCE[7] || Bus2IP_RdCE[8] || Bus2IP_RdCE[9] || Bus2IP_RdCE[10] || Bus2IP_RdCE[11] || Bus2IP_RdCE[12] || Bus2IP_RdCE[13] || Bus2IP_RdCE[14] || Bus2IP_RdCE[15];
224
225  // implement slave model register(s)
226  always @( posedge Bus2IP_Clk )
227    begin
228
229      if ( Bus2IP_Resetn == 1'b0 )
230        begin
231          slv_reg0 <= 0;
232          slv_reg1 <= 0;
233          slv_reg2 <= 0;
234          slv_reg3 <= 0;
235          slv_reg4 <= 0;
236          slv_reg5 <= 0;
237          slv_reg6 <= 0;
238          slv_reg7 <= 0;
239          slv_reg8 <= 0;
240          slv_reg9 <= 0;
241          slv_reg10 <= 0;
242          slv_reg11 <= 0;
243          slv_reg12 <= 0;
244          slv_reg13 <= 0;
245          slv_reg14 <= 0;
246          slv_reg15 <= 0;
247        end
248      else
249        case ( slv_reg_write_sel )
250          16'b1000000000000000 :
251            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
252              if ( Bus2IP_BE[byte_index] == 1 )
253                slv_reg0[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
254          16'b0100000000000000 :
255            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
256              if ( Bus2IP_BE[byte_index] == 1 )
257                slv_reg1[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
258          16'b0010000000000000 :
259            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
260              if ( Bus2IP_BE[byte_index] == 1 )
261                slv_reg2[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
262          16'b0001000000000000 :
263            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
264              if ( Bus2IP_BE[byte_index] == 1 )
265                slv_reg3[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
266          16'b0000100000000000 :
267            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
268              if ( Bus2IP_BE[byte_index] == 1 )
269                slv_reg4[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
270          16'b0000010000000000 :
271            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
272              if ( Bus2IP_BE[byte_index] == 1 )
273                slv_reg5[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
274          16'b0000001000000000 :
275            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
276              if ( Bus2IP_BE[byte_index] == 1 )
277                slv_reg6[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
278          16'b0000000100000000 :
279            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
280              if ( Bus2IP_BE[byte_index] == 1 )
281                slv_reg7[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
282          16'b0000000010000000 :
283            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
284              if ( Bus2IP_BE[byte_index] == 1 )
285                slv_reg8[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
286          16'b0000000001000000 :
287            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
288              if ( Bus2IP_BE[byte_index] == 1 )
289                slv_reg9[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
290          16'b0000000000100000 :
291            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
292              if ( Bus2IP_BE[byte_index] == 1 )
293                slv_reg10[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
294          16'b0000000000010000 :
295            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
296              if ( Bus2IP_BE[byte_index] == 1 )
297                slv_reg11[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
298          16'b0000000000001000 :
299            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
300              if ( Bus2IP_BE[byte_index] == 1 )
301                slv_reg12[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
302          16'b0000000000000100 :
303            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
304              if ( Bus2IP_BE[byte_index] == 1 )
305                slv_reg13[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
306          16'b0000000000000010 :
307            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
308              if ( Bus2IP_BE[byte_index] == 1 )
309                slv_reg14[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
310          16'b0000000000000001 :
311            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
312              if ( Bus2IP_BE[byte_index] == 1 )
313                slv_reg15[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
314          default : begin
315            slv_reg0 <= slv_reg0;
316            slv_reg1 <= slv_reg1;
317            slv_reg2 <= slv_reg2;
318            slv_reg3 <= slv_reg3;
319            slv_reg4 <= slv_reg4;
320            slv_reg5 <= slv_reg5;
321            slv_reg6 <= slv_reg6;
322            slv_reg7 <= slv_reg7;
323            slv_reg8 <= slv_reg8;
324            slv_reg9 <= slv_reg9;
325            slv_reg10 <= slv_reg10;
326            slv_reg11 <= slv_reg11;
327            slv_reg12 <= slv_reg12;
328            slv_reg13 <= slv_reg13;
329            slv_reg14 <= slv_reg14;
330            slv_reg15 <= slv_reg15;
331                    end
332        endcase
333
334    end // SLAVE_REG_WRITE_PROC
335
336  // implement slave model register read mux
337  always @( slv_reg_read_sel or slv_reg0 or slv_reg1 or slv_reg2 or slv_reg3 or slv_reg4 or slv_reg5 or slv_reg6 or slv_reg7 or slv_reg8 or slv_reg9 or slv_reg10 or slv_reg11 or slv_reg12 or slv_reg13 or slv_reg14 or slv_reg15 )
338    begin 
339
340      case ( slv_reg_read_sel )
341        16'b1000000000000000 : slv_ip2bus_data <= reg0_rd;
342        16'b0100000000000000 : slv_ip2bus_data <= slv_reg1;
343        16'b0010000000000000 : slv_ip2bus_data <= slv_reg2;
344        16'b0001000000000000 : slv_ip2bus_data <= slv_reg3;
345        16'b0000100000000000 : slv_ip2bus_data <= slv_reg4;
346        16'b0000010000000000 : slv_ip2bus_data <= slv_reg5;
347        16'b0000001000000000 : slv_ip2bus_data <= slv_reg6;
348        16'b0000000100000000 : slv_ip2bus_data <= slv_reg7;
349        16'b0000000010000000 : slv_ip2bus_data <= slv_reg8;
350        16'b0000000001000000 : slv_ip2bus_data <= slv_reg9;
351        16'b0000000000100000 : slv_ip2bus_data <= slv_reg10;
352        16'b0000000000010000 : slv_ip2bus_data <= slv_reg11;
353        16'b0000000000001000 : slv_ip2bus_data <= slv_reg12;
354        16'b0000000000000100 : slv_ip2bus_data <= slv_reg13;
355        16'b0000000000000010 : slv_ip2bus_data <= slv_reg14;
356        16'b0000000000000001 : slv_ip2bus_data <= slv_reg15;
357        default : slv_ip2bus_data <= 0;
358      endcase
359
360    end // SLAVE_REG_READ_PROC
361
362  // ------------------------------------------------------------
363  // Example code to drive IP to Bus signals
364  // ------------------------------------------------------------
365
366assign IP2Bus_Data = (slv_read_ack == 1'b1) ? slv_ip2bus_data :  0 ;
367  assign IP2Bus_WrAck = slv_write_ack;
368  assign IP2Bus_RdAck = slv_read_ack;
369  assign IP2Bus_Error = 0;
370
371endmodule
Note: See TracBrowser for help on using the repository browser.