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

Last change on this file was 4389, checked in by murphpo, 9 years ago

removing unnecessary IOB constraint from userio core

File size: 25.9 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:              Fri Nov 09 20:37:15 2012 (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    //I/O tied to top-level pins, connected to devices on board
58    output [6:0]    hexdisp_left,
59    output          hexdisp_left_dp,
60    output [6:0]    hexdisp_right,
61    output          hexdisp_right_dp,
62
63    output [3:0]    leds_red,
64    output [3:0]    leds_green,
65    output          rfa_led_red,
66    output          rfa_led_green,
67    output          rfb_led_red,
68    output          rfb_led_green,
69
70    input [3:0]     dipsw,
71    input           pb_u,
72    input           pb_m,
73    input           pb_d,
74
75    //I/O optionally connected to internal signals for non-software access to user I/O
76    input [6:0]     usr_hexdisp_left,
77    input           usr_hexdisp_left_dp,
78    input [6:0]     usr_hexdisp_right,
79    input           usr_hexdisp_right_dp,
80
81    input [3:0]     usr_leds_red,
82    input [3:0]     usr_leds_green,
83
84    input           usr_rfa_led_red,
85    input           usr_rfa_led_green,
86    input           usr_rfb_led_red,
87    input           usr_rfb_led_green,
88
89    output [3:0]    usr_dipsw,
90    output          usr_pb_u,
91    output          usr_pb_m,
92    output          usr_pb_d,
93
94    //Clock signal for DNA_PORT.CLK port (must be <100MHz)
95    input           DNA_Port_Clk,
96  // -- ADD USER PORTS ABOVE THIS LINE ---------------
97
98  // -- DO NOT EDIT BELOW THIS LINE ------------------
99  // -- Bus protocol ports, do not add to or delete
100input                                     Bus2IP_Clk,
101input                                     Bus2IP_Resetn,
102input      [C_SLV_DWIDTH-1 : 0]           Bus2IP_Data,
103input      [C_SLV_DWIDTH/8-1 : 0]         Bus2IP_BE,
104input      [C_NUM_REG-1 : 0]              Bus2IP_RdCE,
105input      [C_NUM_REG-1 : 0]              Bus2IP_WrCE,
106output     [C_SLV_DWIDTH-1 : 0]           IP2Bus_Data,
107output                                    IP2Bus_RdAck,
108output                                    IP2Bus_WrAck,
109output                                    IP2Bus_Error
110  // -- DO NOT EDIT ABOVE THIS LINE ------------------
111); // user_logic
112
113// -- ADD USER PARAMETERS BELOW THIS LINE ------------
114parameter HEXDISP_ACTIVE_HIGH = 0;
115parameter INCLUDE_DNA_READ_LOGIC = 1;
116// -- ADD USER PARAMETERS ABOVE THIS LINE ------------
117
118// -- DO NOT EDIT BELOW THIS LINE --------------------
119// -- Bus protocol parameters, do not add to or delete
120parameter C_NUM_REG                      = 13;
121parameter C_SLV_DWIDTH                   = 32;
122// -- DO NOT EDIT ABOVE THIS LINE --------------------
123
124//----------------------------------------------------------------------------
125// Implementation
126//----------------------------------------------------------------------------
127
128  // --USER nets declarations added here, as needed for user logic
129
130  // Nets for user logic slave model s/w accessible register example
131  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg0;
132  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg1;
133  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg2;
134  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg3;
135  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg4;
136  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg5;
137  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg6;
138  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg7;
139  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg8;
140  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg9;
141  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg10;
142  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg11;
143  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg12;
144  wire       [12 : 0]                       slv_reg_write_sel;
145  wire       [12 : 0]                       slv_reg_read_sel;
146  reg        [C_SLV_DWIDTH-1 : 0]           slv_ip2bus_data;
147  wire                                      slv_read_ack;
148  wire                                      slv_write_ack;
149  integer                                   byte_index, bit_index;
150
151  // USER logic implementation added here
152
153  // ------------------------------------------------------
154  // Example code to read/write user logic slave model s/w accessible registers
155  //
156  // Note:
157  // The example code presented here is to show you one way of reading/writing
158  // software accessible registers implemented in the user logic slave model.
159  // Each bit of the Bus2IP_WrCE/Bus2IP_RdCE signals is configured to correspond
160  // to one software accessible register by the top level template. For example,
161  // if you have four 32 bit software accessible registers in the user logic,
162  // you are basically operating on the following memory mapped registers:
163  //
164  //    Bus2IP_WrCE/Bus2IP_RdCE   Memory Mapped Register
165  //                     "1000"   C_BASEADDR + 0x0
166  //                     "0100"   C_BASEADDR + 0x4
167  //                     "0010"   C_BASEADDR + 0x8
168  //                     "0001"   C_BASEADDR + 0xC
169  //
170  // ------------------------------------------------------
171
172  assign
173    slv_reg_write_sel = Bus2IP_WrCE[12:0],
174    slv_reg_read_sel  = Bus2IP_RdCE[12:0],
175    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],
176    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];
177
178  // implement slave model register(s)
179  always @( posedge Bus2IP_Clk )
180    begin
181
182      if ( Bus2IP_Resetn == 1'b0 )
183        begin
184          slv_reg0 <= 32'h3F000000; //Defaults: hex map mode on for both displays, RF LEDs controlled by usr_ ports
185          slv_reg1 <= 0;
186          slv_reg2 <= 0;
187          slv_reg3 <= 0;
188          slv_reg4 <= 0;
189          slv_reg5 <= 0;
190          slv_reg6 <= 0;
191          slv_reg7 <= 0;
192          slv_reg8 <= 0;
193          slv_reg9 <= 0;
194          slv_reg10 <= 0;
195          slv_reg11 <= 0;
196          slv_reg12 <= 0;
197        end
198      else
199        case ( slv_reg_write_sel )
200          13'b1000000000000 :
201            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
202              if ( Bus2IP_BE[byte_index] == 1 )
203                slv_reg0[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
204          13'b0100000000000 :
205            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
206              if ( Bus2IP_BE[byte_index] == 1 )
207                slv_reg1[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
208          13'b0010000000000 :
209            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
210              if ( Bus2IP_BE[byte_index] == 1 )
211                slv_reg2[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
212          13'b0001000000000 :
213            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
214              if ( Bus2IP_BE[byte_index] == 1 )
215                slv_reg3[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
216          13'b0000100000000 :
217            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
218              if ( Bus2IP_BE[byte_index] == 1 )
219                slv_reg4[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
220          13'b0000010000000 :
221            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
222              if ( Bus2IP_BE[byte_index] == 1 )
223                slv_reg5[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
224          13'b0000001000000 :
225            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
226              if ( Bus2IP_BE[byte_index] == 1 )
227                slv_reg6[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
228          13'b0000000100000 :
229            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
230              if ( Bus2IP_BE[byte_index] == 1 )
231                slv_reg7[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
232          13'b0000000010000 :
233            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
234              if ( Bus2IP_BE[byte_index] == 1 )
235                slv_reg8[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
236          13'b0000000001000 :
237            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
238              if ( Bus2IP_BE[byte_index] == 1 )
239                slv_reg9[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
240          13'b0000000000100 :
241            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
242              if ( Bus2IP_BE[byte_index] == 1 )
243                slv_reg10[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
244          13'b0000000000010 :
245            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
246              if ( Bus2IP_BE[byte_index] == 1 )
247                slv_reg11[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
248          13'b0000000000001 :
249            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
250              if ( Bus2IP_BE[byte_index] == 1 )
251                slv_reg12[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
252          default : begin
253            slv_reg0 <= slv_reg0;
254            slv_reg1 <= slv_reg1;
255            slv_reg2 <= slv_reg2;
256            slv_reg3 <= slv_reg3;
257            slv_reg4 <= slv_reg4;
258            slv_reg5 <= slv_reg5;
259            slv_reg6 <= slv_reg6;
260            slv_reg7 <= slv_reg7;
261            slv_reg8 <= slv_reg8;
262            slv_reg9 <= slv_reg9;
263            slv_reg10 <= slv_reg10;
264            slv_reg11 <= slv_reg11;
265            slv_reg12 <= slv_reg12;
266                    end
267        endcase
268
269    end // SLAVE_REG_WRITE_PROC
270
271    wire pb_u_db;
272    wire pb_m_db;
273    wire pb_d_db;
274    wire [3:0] dipsw_db;
275    reg [56:0] fpga_dna_value = 57'b0;
276
277  // implement slave model register read mux
278  always @*
279    begin 
280
281      case ( slv_reg_read_sel )
282        13'b1000000000000 : slv_ip2bus_data <= slv_reg0;
283        13'b0100000000000 : slv_ip2bus_data <= slv_reg1;
284        13'b0010000000000 : slv_ip2bus_data <= slv_reg2;
285        13'b0001000000000 : slv_ip2bus_data <= slv_reg3;
286        13'b0000100000000 : slv_ip2bus_data <= slv_reg4;
287        13'b0000010000000 : slv_ip2bus_data <= slv_reg5;
288        13'b0000001000000 : slv_ip2bus_data <= {25'b0, pb_u_db, pb_m_db, pb_d_db, dipsw_db};
289        13'b0000000100000 : slv_ip2bus_data <= slv_reg7;
290        13'b0000000010000 : slv_ip2bus_data <= slv_reg8;
291        13'b0000000001000 : slv_ip2bus_data <= slv_reg9;
292        13'b0000000000100 : slv_ip2bus_data <= slv_reg10;
293        13'b0000000000010 : slv_ip2bus_data <= fpga_dna_value[56:25];//25:56]; //32 LSB
294        13'b0000000000001 : slv_ip2bus_data <= {7'b0, fpga_dna_value[24:0]};//0:24]}; //25 MSB
295        default : slv_ip2bus_data <= 0;
296      endcase
297
298    end // SLAVE_REG_READ_PROC
299
300  // ------------------------------------------------------------
301  // Example code to drive IP to Bus signals
302  // ------------------------------------------------------------
303
304assign IP2Bus_Data = (slv_read_ack == 1'b1) ? slv_ip2bus_data :  0 ;
305  assign IP2Bus_WrAck = slv_write_ack;
306  assign IP2Bus_RdAck = slv_read_ack;
307  assign IP2Bus_Error = 0;
308
309//User IO Implementation
310    /* Address map:
311        HDL is coded [31:0], adopting Xilinx's convention for AXI IPIF cores
312        All registers are 32-bits
313            regX[31]  maps to 0x80000000 in C driver
314            regX[0]   maps to 0x00000001 in C driver
315
316    0: Control RW
317        [31:30] = Reserved
318        [   29] = Left hex data mode (0=user supplies bit-per-segment; 1=user supplies 4-bit hex)   0x20000000
319        [   28] = Right hex data mode (0=user supplies bit-per-segment; 1=user supplies 4-bit hex)  0x10000000
320      Control source for LEDs: 0=software controlled, 1=usr_ port controlled
321        [27:24] = {rfb_red rfb_green rfa_red rfa_green} 0x0F000000
322        [23:16] = {leds_red leds_green}                 0x00FF0000
323        [15: 8] = {hexdisp_left{a b c d e f g dp}}      0x0000FF00
324        [ 7: 0] = {hexdisp_right{a b c d e f g dp}}     0x000000FF
325    1: Left hex display RW
326        [31: 9] = reserved
327        [    8] = DP (controlled directly; doesn't depend on data mode) 0x100
328        [ 6: 0] = Data value ([6:4] ignored when data mode = 1)         0x03F
329    2: Right hex display RW
330        [31: 9] = reserved
331        [    8] = DP (controlled directly; doesn't depend on data mode) 0x100
332        [ 6: 0] = Data value ([6:4] ignored when data mode = 1)         0x03F
333    3: Red user LEDs RW
334        [31: 4] = reserved
335        [ 3: 0] = Data value (1=LED illuminated) 0xF, with 0x1 mapped to lowest LED
336    4: Green user LEDs RW
337        [31: 4] = reserved
338        [ 3: 0] = Data value (1=LED illuminated) 0xF, with 0x1 mapped to lowest LED
339    5: RF LEDs RW
340        [31: 4] = reserved
341        [    3] = rfb_red   0x8
342        [    2] = rfb_green 0x4
343        [    1] = rfa_red   0x2
344        [    0] = rfa_green 0x1
345    6: Switch/button inputs RO
346        [31: 7] = reserved
347        [    6] = pb_up         0x40
348        [    5] = pb_mid        0x20
349        [    4] = pb_down       0x10
350        [ 3: 0] = DIP switch    0x0F (with 0x1 mapped to right-most switch)
351
352    7: PWM Gen Param: PWM period RW
353        [31:16] = PWN period
354        [15: 0] = PWM output deassert thresh
355
356    8: PWM Gen Param: PWM output deassert thresh RW
357        [31:29] = reserved
358        [28: 0] =
359       
360    9: PWM Gen Param: PWM ramp step RW
361        [31]    = ramp enabled
362        [30:16] = pwm_param_ramp_min
363        [15: 0] = pwm_param_ramp_max
364
365    10: HW Output control sel RW
366        [31:28] = Reserved
367      HW Control source for LEDs: 0=usr_ ports, 1=pwm gen (same ctrlSrc masks as reg0)
368        [27:24] = {rfb_red rfb_green rfa_red rfa_green} 0x0F000000
369        [23:16] = {leds_red leds_green}                 0x00FF0000
370        [15: 8] = {hexdisp_left{a b c d e f g dp}}      0x0000FF00
371        [ 7: 0] = {hexdisp_right{a b c d e f g dp}}     0x000000FF
372
373    11: FPGA DNA LSB
374        [31: 0] = 32LSB of FPGA DNA
375
376    12: FPGA DNA MSB
377        [31:25] = reserved
378        [24: 0] = FPGA DNA 25MSB
379       
380
381        */
382    integer ii;
383
384    wire [27:0] all_outputs_ctrl_source;
385    wire [27:0] all_outputs_hw_ctrl_source;
386    wire [27:0] all_outputs_sw_val;
387    wire [27:0] all_outputs_hw_val;
388    reg  [27:0] all_outputs;
389    reg  [27:0] all_outputs_d1;
390
391    reg  [27:0] all_outputs_d2;     
392
393    wire [6:0] leftHex_mapped;
394    wire [6:0] rightHex_mapped;
395
396    wire [6:0] leftHex_sw_val;
397    wire [6:0] rightHex_sw_val;
398
399    reg [7:0] pb_u_d = 0;
400    reg [7:0] pb_m_d = 0;
401    reg [7:0] pb_d_d = 0;
402    reg [7:0] dipsw_d0 = 0;
403    reg [7:0] dipsw_d1 = 0;
404    reg [7:0] dipsw_d2 = 0;
405    reg [7:0] dipsw_d3 = 0;
406
407
408    //PWM generator
409    reg [9:0] pwm_clock_counter = 0;
410    wire      pwm_clock_en;
411    assign pwm_clock_en = (pwm_clock_counter == 0);
412   
413    wire [15:0] pwm_param_period;
414    wire [15:0] pwm_param_thresh_sw;
415    wire [15:0] pwm_param_thresh;
416    reg  [15:0] pwm_param_thresh_d;
417
418    wire        pwm_param_ramp_en;
419
420    wire [14:0] pwm_param_ramp_min;
421    wire [15:0] pwm_param_ramp_max;
422
423    wire        pwm_ramp_count_dir_toggle;
424    reg pwm_ramp_count_dir_toggle_d = 0;
425
426    reg         pwm_ramp_count_dir = 0;
427   
428    assign pwm_ramp_count_dir_toggle = (((pwm_ramp_counter > pwm_param_ramp_max) | (pwm_ramp_counter < pwm_param_ramp_min)));
429   
430    assign pwm_param_period     = slv_reg7[31:16];
431    assign pwm_param_thresh_sw  = slv_reg7[15:0];
432
433    assign pwm_param_ramp_en    = slv_reg9[31];
434    assign pwm_param_ramp_min   = slv_reg9[30:16];
435    assign pwm_param_ramp_max   = slv_reg9[15:0];
436   
437    assign pwm_param_thresh = pwm_param_ramp_en ? pwm_ramp_counter : pwm_param_thresh_sw;
438   
439    reg [15:0] pwm_period_counter = 0;
440    reg [15:0] pwm_ramp_counter = 0;
441
442    reg pwm_out = 0;
443   
444    always @(posedge Bus2IP_Clk)
445    begin
446        pwm_clock_counter <= pwm_clock_counter + 1;
447
448        if(pwm_period_counter >= pwm_param_period)
449            pwm_period_counter <= 0;
450        else if(pwm_clock_en)
451            pwm_period_counter <= pwm_period_counter + 1;
452
453        pwm_param_thresh_d <= pwm_param_thresh;
454       
455        pwm_out <= (pwm_period_counter < pwm_param_thresh_d);
456    end
457
458    always @(posedge Bus2IP_Clk)
459    begin
460        pwm_ramp_count_dir_toggle_d <= pwm_ramp_count_dir_toggle;
461
462        //pwm_ramp_count_dir=0 counts up
463        if(~pwm_param_ramp_en)
464            pwm_ramp_counter <= {1'b0,pwm_param_ramp_min};
465        else if(pwm_clock_en & (pwm_period_counter==0))
466            if(pwm_ramp_count_dir)
467                pwm_ramp_counter <= pwm_ramp_counter + 16'hFFFE;
468            else
469                pwm_ramp_counter <= pwm_ramp_counter + 1'b1;
470
471        if(~pwm_param_ramp_en)
472            pwm_ramp_count_dir <= 0;
473        else if(pwm_ramp_count_dir_toggle & ~pwm_ramp_count_dir_toggle_d)
474            pwm_ramp_count_dir <= ~pwm_ramp_count_dir;
475
476    end
477
478   
479    //Shift registers for debouncing mechanical inputs
480    always @(posedge Bus2IP_Clk)
481    begin
482        pb_u_d[7:0] <= {pb_u_d[6:0], pb_u};
483        pb_m_d[7:0] <= {pb_m_d[6:0], pb_m};
484        pb_d_d[7:0] <= {pb_d_d[6:0], pb_d};
485        dipsw_d0[7:0] <= {dipsw_d0[6:0], dipsw[0]};
486        dipsw_d1[7:0] <= {dipsw_d1[6:0], dipsw[1]};
487        dipsw_d2[7:0] <= {dipsw_d2[6:0], dipsw[2]};
488        dipsw_d3[7:0] <= {dipsw_d3[6:0], dipsw[3]};
489    end
490   
491    //Assert debounced signals only if inputs are high 8 consecutive cycles
492    assign pb_u_db = (pb_u_d == 8'hff);
493    assign pb_m_db = (pb_m_d == 8'hff);
494    assign pb_d_db = (pb_d_d == 8'hff);
495
496    //Swap MSB:LSB here, to undo endian swaps relative to schematic labels
497    assign dipsw_db = {(dipsw_d0==8'hff), (dipsw_d1==8'hff), (dipsw_d2==8'hff), (dipsw_d3==8'hff)};
498   
499    //Logic to map 4-bit hex value to 7-bit value for hex display
500    sevenSegmentMap leftHexMap  (.data(slv_reg1[3:0]), .disp(leftHex_mapped));
501    sevenSegmentMap rightHexMap (.data(slv_reg2[3:0]), .disp(rightHex_mapped));
502
503    //Select which 7-bit value is used as the software-supplied value for hex displays
504    // User either supplies 4-bit value to be interpretted as hex value
505    //  or raw 7-bit (bit-per-diode) value
506    assign leftHex_sw_val =  slv_reg0[29] ? leftHex_mapped :  slv_reg1[6:0];
507    assign rightHex_sw_val = slv_reg0[28] ? rightHex_mapped : slv_reg2[6:0];
508
509    //Extract the mux control values from the software register
510    assign all_outputs_ctrl_source    = slv_reg0[27:0];
511    assign all_outputs_hw_ctrl_source = slv_reg10[27:0];
512
513    //Extract and concatenate the software-controlled output values
514    assign all_outputs_sw_val[27:0] = {
515        slv_reg5[3],            //[27]      rgb_red LED
516        slv_reg5[2],            //[26]      rgb_green LED
517        slv_reg5[1],            //[25]      rga_red LED
518        slv_reg5[0],            //[24]      rga_green LED
519        slv_reg4[3:0],          //[23:20]   green LEDs
520        slv_reg3[3:0],          //[19:16]   red LEDs
521        slv_reg2[8],            //[15]      right hex DP
522        rightHex_sw_val[6:0],   //[14:8]    right hex mapped
523        slv_reg1[8],            //[7]       left hex DP
524        leftHex_sw_val[6:0]     //[6:0]     left hex mapped
525    };
526
527    //Concatenate the top-level inputs for hardware-controlled output values
528    assign all_outputs_hw_val[27:24] = {usr_rfb_led_red, usr_rfb_led_green, usr_rfa_led_red, usr_rfa_led_green};
529    assign all_outputs_hw_val[23:16] = {usr_leds_green, usr_leds_red};
530    assign all_outputs_hw_val[15:8] = {usr_hexdisp_right_dp, usr_hexdisp_right};
531    assign all_outputs_hw_val[7:0] = {usr_hexdisp_left_dp, usr_hexdisp_left};
532
533    //Mux between hardware and software control for each output
534    // Source control = 0 -> Software register bit controls output
535    // Source control = 1 -> Hardware control
536    //   Hardware control mode = 0 -> usr_ port controls
537    //   Hardware control mode = 1 -> pwm module controls
538    always @*
539    begin
540    for(ii=0; ii<28; ii=ii+1)
541        all_outputs[ii] = all_outputs_ctrl_source[ii] ? (all_outputs_hw_ctrl_source[ii] ? pwm_out : all_outputs_hw_val[ii]) : all_outputs_sw_val[ii];
542    end
543
544    always @(posedge Bus2IP_Clk)
545    begin
546        all_outputs_d1 <= all_outputs;
547       
548        // HDL parameter HEXDISP_ACTIVE_HIGH defines the type at build-time
549        // User values are always interpreted as 1==illuminated
550        // Mux on active high/low here so _d2 DFFs can be packed into IOBs
551        all_outputs_d2[15:0] <= HEXDISP_ACTIVE_HIGH ? all_outputs_d1[15:0] : ~all_outputs_d1[15:0];
552        all_outputs_d2[27:16] <= all_outputs_d1[27:16];
553    end
554   
555    //Map the mux outputs to the top-level outputs
556    assign {rfb_led_red, rfb_led_green, rfa_led_red, rfa_led_green} = all_outputs_d2[27:24];
557
558    assign leds_green[3:0] = all_outputs_d2[23:20];
559    assign leds_red[3:0] =   all_outputs_d2[19:16];
560
561    assign hexdisp_left_dp   = all_outputs_d2[7];
562    assign hexdisp_left[6:0] = all_outputs_d2[6:0];
563
564    assign hexdisp_right_dp   = all_outputs_d2[15];
565    assign hexdisp_right[6:0] = all_outputs_d2[14:8];
566
567    //Assign the usr_ output ports to the de-bounced top-level inputs
568    assign usr_dipsw[3:0] = dipsw_db[3:0];
569    assign usr_pb_u = pb_u_db;
570    assign usr_pb_m = pb_m_db;
571    assign usr_pb_d = pb_d_db;
572
573    generate
574    if(INCLUDE_DNA_READ_LOGIC) begin
575        wire dna_port_read, dna_port_shift, dna_port_clk_gated, dna_port_dout;
576        //Instantiate the DNA_PORT module, for reading the FPGA's unique ID
577        // Two MSB are always [1 0]? Accordint to isim at least
578        DNA_PORT #(.SIM_DNA_VALUE(57'h123456789abcdef)) dna_port_inst (
579            .DIN(1'b0),
580            .READ(dna_port_read),
581            .SHIFT(dna_port_shift),
582            .CLK(dna_port_clk_gated),
583            .DOUT(dna_port_dout)
584        );
585       
586        reg [6:0] dna_read_counter = 7'b0;
587
588        //Only clock the DNA_PORT primitive while actively shifting data out
589        assign dna_port_clk_gated = (DNA_Port_Clk & (dna_read_counter>7'd60) & (dna_read_counter<7'h7f));
590
591        //Count-limited counter, that starts at configuration and runs exactly once
592        always @(posedge DNA_Port_Clk)
593        begin
594            if(dna_read_counter == 7'h7f)
595                dna_read_counter <= 7'h7f;
596            else
597                dna_read_counter <= dna_read_counter + 1;
598        end
599
600        //dna read states, as function of dna_read_counter value:
601        //  0-63: Do nothing (just in case things needs to settle before DNA_PORT is accessible)
602        //    64: Toggle READ signal (loads DNA value into DNA_PORT 57-bit shift register)
603        //    65: Read DNA[0] from shift register DOUT; assert SHIFT
604        //66-121: Read DNA[1:56] from shif register DOUT; SHIFT stays asserted
605        //   122: De-assert SHIFT and READ
606       
607        assign dna_port_read = (dna_read_counter == 7'd63);
608        assign dna_port_shift = ((dna_read_counter>= 7'd65) && (dna_read_counter<=122));
609       
610        //Capture the shift register output in a single big register
611        wire dna_capt;
612        assign dna_capt = ((dna_read_counter>= 7'd65) && (dna_read_counter<=121));
613        always @(posedge DNA_Port_Clk)
614        begin
615            if (dna_capt)
616                fpga_dna_value[dna_read_counter-7'd65] = dna_port_dout;
617        end
618    end
619    endgenerate
620 
621endmodule
622
623
624module sevenSegmentMap
625(
626    input       [3:0]   data,
627    output  reg [6:0]   disp
628);
629
630always @(data[3:0])
631    case (data[3:0])
632    4'b0000 : disp <= ~(7'b1000000);   // 0
633    4'b0001 : disp <= ~(7'b1111001);   // 1
634    4'b0010 : disp <= ~(7'b0100100);   // 2
635    4'b0011 : disp <= ~(7'b0110000);   // 3
636    4'b0100 : disp <= ~(7'b0011001);   // 4
637    4'b0101 : disp <= ~(7'b0010010);   // 5
638    4'b0110 : disp <= ~(7'b0000010);   // 6
639    4'b0111 : disp <= ~(7'b1111000);   // 7
640    4'b1000 : disp <= ~(7'b0000000);   // 8
641    4'b1001 : disp <= ~(7'b0010000);   // 9
642    4'b1010 : disp <= ~(7'b0001000);   // A
643    4'b1011 : disp <= ~(7'b0000011);   // b
644    4'b1100 : disp <= ~(7'b1000110);   // C
645    4'b1101 : disp <= ~(7'b0100001);   // d
646    4'b1110 : disp <= ~(7'b0000110);   // E
647    4'b1111 : disp <= ~(7'b0001110);   // F
648    default : disp <=  (7'b0000000);
649    endcase
650
651endmodule
Note: See TracBrowser for help on using the repository browser.