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

Last change on this file was 1766, checked in by murphpo, 12 years ago
File size: 16.3 KB
Line 
1//----------------------------------------------------------------------------
2// user_logic.vhd - module
3//----------------------------------------------------------------------------
4//
5// ***************************************************************************
6// ** Copyright (c) 1995-2011 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.vhd
27// Version:           3.00.a
28// Description:       User logic module.
29// Date:              Mon May 14 12:21:28 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
51module user_logic
52(
53    // -- ADD USER PORTS BELOW THIS LINE ---------------
54   
55    samp_spi_sclk,
56    samp_spi_mosi,
57    samp_spi_miso,
58    samp_spi_cs_n,
59    samp_func,
60   
61    rfref_spi_sclk,
62    rfref_spi_mosi,
63    rfref_spi_miso,
64    rfref_spi_cs_n,
65    rfref_func,
66   
67    usr_reset0,
68    usr_reset1,
69    usr_reset2,
70    usr_reset3,
71   
72    usr_status,
73    // -- ADD USER PORTS ABOVE THIS LINE ---------------
74
75    // -- DO NOT EDIT BELOW THIS LINE ------------------
76    // -- Bus protocol ports, do not add to or delete
77    Bus2IP_Clk,                     // Bus to IP clock
78    Bus2IP_Reset,                   // Bus to IP reset
79    Bus2IP_Data,                    // Bus to IP data bus
80    Bus2IP_BE,                      // Bus to IP byte enables
81    Bus2IP_RdCE,                    // Bus to IP read chip enable
82    Bus2IP_WrCE,                    // Bus to IP write chip enable
83    IP2Bus_Data,                    // IP to Bus data bus
84    IP2Bus_RdAck,                   // IP to Bus read transfer acknowledgement
85    IP2Bus_WrAck,                   // IP to Bus write transfer acknowledgement
86    IP2Bus_Error                    // IP to Bus error response
87    // -- DO NOT EDIT ABOVE THIS LINE ------------------
88); // user_logic
89
90// -- ADD USER PARAMETERS BELOW THIS LINE ------------
91// --USER parameters added here
92// -- ADD USER PARAMETERS ABOVE THIS LINE ------------
93
94// -- DO NOT EDIT BELOW THIS LINE --------------------
95// -- Bus protocol parameters, do not add to or delete
96parameter C_SLV_DWIDTH                   = 32;
97parameter C_NUM_REG                      = 8;
98// -- DO NOT EDIT ABOVE THIS LINE --------------------
99
100// -- ADD USER PORTS BELOW THIS LINE -----------------
101
102output samp_spi_sclk;
103output samp_spi_mosi;
104input samp_spi_miso;
105output samp_spi_cs_n;
106output samp_func;
107
108output rfref_spi_sclk;
109output rfref_spi_mosi;
110input rfref_spi_miso;
111output rfref_spi_cs_n;
112output rfref_func;
113
114output usr_reset0;
115output usr_reset1;
116output usr_reset2;
117output usr_reset3;
118
119input [0:31] usr_status;
120
121// -- ADD USER PORTS ABOVE THIS LINE -----------------
122
123// -- DO NOT EDIT BELOW THIS LINE --------------------
124// -- Bus protocol ports, do not add to or delete
125input                                     Bus2IP_Clk;
126input                                     Bus2IP_Reset;
127input      [0 : C_SLV_DWIDTH-1]           Bus2IP_Data;
128input      [0 : C_SLV_DWIDTH/8-1]         Bus2IP_BE;
129input      [0 : C_NUM_REG-1]              Bus2IP_RdCE;
130input      [0 : C_NUM_REG-1]              Bus2IP_WrCE;
131output     [0 : C_SLV_DWIDTH-1]           IP2Bus_Data;
132output                                    IP2Bus_RdAck;
133output                                    IP2Bus_WrAck;
134output                                    IP2Bus_Error;
135// -- DO NOT EDIT ABOVE THIS LINE --------------------
136
137//----------------------------------------------------------------------------
138// Implementation
139//----------------------------------------------------------------------------
140
141    // --USER nets declarations added here, as needed for user logic
142
143    // Nets for user logic slave model s/w accessible register example
144    reg        [0 : C_SLV_DWIDTH-1]           slv_reg0;
145    reg        [0 : C_SLV_DWIDTH-1]           slv_reg1;
146    reg        [0 : C_SLV_DWIDTH-1]           slv_reg2;
147    reg        [0 : C_SLV_DWIDTH-1]           slv_reg3;
148    reg        [0 : C_SLV_DWIDTH-1]           slv_reg4;
149    reg        [0 : C_SLV_DWIDTH-1]           slv_reg5;
150    reg        [0 : C_SLV_DWIDTH-1]           slv_reg6;
151    reg        [0 : C_SLV_DWIDTH-1]           slv_reg7;
152    wire       [0 : 7]                        slv_reg_write_sel;
153    wire       [0 : 7]                        slv_reg_read_sel;
154    reg        [0 : C_SLV_DWIDTH-1]           slv_ip2bus_data;
155    wire                                      slv_read_ack;
156    wire                                      slv_write_ack;
157    integer                                   byte_index, bit_index;
158
159    // --USER logic implementation added here
160
161    // ------------------------------------------------------
162    // Example code to read/write user logic slave model s/w accessible registers
163    //
164    // Note:
165    // The example code presented here is to show you one way of reading/writing
166    // software accessible registers implemented in the user logic slave model.
167    // Each bit of the Bus2IP_WrCE/Bus2IP_RdCE signals is configured to correspond
168    // to one software accessible register by the top level template. For example,
169    // if you have four 32 bit software accessible registers in the user logic,
170    // you are basically operating on the following memory mapped registers:
171    //
172    //    Bus2IP_WrCE/Bus2IP_RdCE   Memory Mapped Register
173    //                     "1000"   C_BASEADDR + 0x0
174    //                     "0100"   C_BASEADDR + 0x4
175    //                     "0010"   C_BASEADDR + 0x8
176    //                     "0001"   C_BASEADDR + 0xC
177    //
178    // ------------------------------------------------------
179
180    assign slv_reg_write_sel = Bus2IP_WrCE[0:7];
181    assign slv_reg_read_sel  = Bus2IP_RdCE[0:7];
182
183    //Removed [1] from _ack list, so ack can be delayed following write to SPI Tx register
184    assign slv_write_ack     = Bus2IP_WrCE[0] || Bus2IP_WrCE[2] || Bus2IP_WrCE[3] || Bus2IP_WrCE[4] || Bus2IP_WrCE[5] || Bus2IP_WrCE[6] || Bus2IP_WrCE[7];
185    assign 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];
186
187    // implement slave model register(s)
188    always @( posedge Bus2IP_Clk )
189        begin: SLAVE_REG_WRITE_PROC
190
191            if ( Bus2IP_Reset == 1 )
192                begin
193                    slv_reg0 <= 0;
194                    slv_reg1 <= 0;
195                    slv_reg2 <= 0;
196                    slv_reg3 <= 0;
197                    slv_reg4 <= 0;
198                    slv_reg5 <= 0;
199                    slv_reg6 <= 0;
200                    slv_reg7 <= 0;
201                end
202            else
203                case ( slv_reg_write_sel )
204                    8'b10000000 :
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                                for ( bit_index = byte_index*8; bit_index <= byte_index*8+7; bit_index = bit_index+1 )
208                                    slv_reg0[bit_index] <= Bus2IP_Data[bit_index];
209                    8'b01000000 :
210                        for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
211                            if ( Bus2IP_BE[byte_index] == 1 )
212                                for ( bit_index = byte_index*8; bit_index <= byte_index*8+7; bit_index = bit_index+1 )
213                                    slv_reg1[bit_index] <= Bus2IP_Data[bit_index];
214                    8'b00100000 :
215                        for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
216                            if ( Bus2IP_BE[byte_index] == 1 )
217                                for ( bit_index = byte_index*8; bit_index <= byte_index*8+7; bit_index = bit_index+1 )
218                                    slv_reg2[bit_index] <= Bus2IP_Data[bit_index];
219                    8'b00010000 :
220                        for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
221                            if ( Bus2IP_BE[byte_index] == 1 )
222                                for ( bit_index = byte_index*8; bit_index <= byte_index*8+7; bit_index = bit_index+1 )
223                                    slv_reg3[bit_index] <= Bus2IP_Data[bit_index];
224                    8'b00001000 :
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                                for ( bit_index = byte_index*8; bit_index <= byte_index*8+7; bit_index = bit_index+1 )
228                                    slv_reg4[bit_index] <= Bus2IP_Data[bit_index];
229                    8'b00000100 :
230                        for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
231                            if ( Bus2IP_BE[byte_index] == 1 )
232                                for ( bit_index = byte_index*8; bit_index <= byte_index*8+7; bit_index = bit_index+1 )
233                                    slv_reg5[bit_index] <= Bus2IP_Data[bit_index];
234                    8'b00000010 :
235                        for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
236                            if ( Bus2IP_BE[byte_index] == 1 )
237                                for ( bit_index = byte_index*8; bit_index <= byte_index*8+7; bit_index = bit_index+1 )
238                                    slv_reg6[bit_index] <= Bus2IP_Data[bit_index];
239                    8'b00000001 :
240                        for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
241                            if ( Bus2IP_BE[byte_index] == 1 )
242                                for ( bit_index = byte_index*8; bit_index <= byte_index*8+7; bit_index = bit_index+1 )
243                                    slv_reg7[bit_index] <= Bus2IP_Data[bit_index];
244                    default : ;
245                endcase
246
247        end // SLAVE_REG_WRITE_PROC
248
249    wire [0:7] samp_spi_rx_byte;
250    wire [0:7] rfref_spi_rx_byte;
251
252    // implement slave model register read mux
253    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 )
254        begin: SLAVE_REG_READ_PROC
255
256            case ( slv_reg_read_sel )
257                8'b10000000 : slv_ip2bus_data <= slv_reg0;
258                8'b01000000 : slv_ip2bus_data <= slv_reg1;
259                8'b00100000 : slv_ip2bus_data <= {16'b0, rfref_spi_rx_byte, samp_spi_rx_byte};
260                8'b00010000 : slv_ip2bus_data <= slv_reg3;
261                8'b00001000 : slv_ip2bus_data <= usr_status_d;
262                8'b00000100 : slv_ip2bus_data <= slv_reg5;
263                8'b00000010 : slv_ip2bus_data <= slv_reg6;
264                8'b00000001 : slv_ip2bus_data <= slv_reg7;
265                default : slv_ip2bus_data <= 0;
266            endcase
267
268        end // SLAVE_REG_READ_PROC
269
270    // ------------------------------------------------------------
271    // Example code to drive IP to Bus signals
272    // ------------------------------------------------------------
273
274    assign IP2Bus_Data    = slv_ip2bus_data;
275//  assign IP2Bus_WrAck   = slv_write_ack; //Overridden below
276    assign IP2Bus_RdAck   = slv_read_ack;
277    assign IP2Bus_Error   = 0;
278
279    /* Address map:
280        HDL is coded [MSB:LSB] = [0:31]
281        regX[0]  maps to 0x80000000 in C driver
282        regX[31] maps to 0x00000001 in C driver
283
284    0: Config: {clk_div_sel[2:0], 1'b0, samp_func, rfref_func, 26'b0}
285        [29:31] Clock divider bit sel (00=0.5*busclk, 01=0.25*busclk, ...) 0x00000003
286        [28   ] Reserved
287        [   27] samp buf reset (active low) 0x00000010
288        [   26] rf ref buf reset (active low) 0x00000020
289        [0 :25] Reserved
290
291    1: SPI Tx
292        [24:31] Tx data byte
293        [17:23] 7-bit register address (0x00 to 0xFF all valid)
294        [11:16] 6'b0 (always zero)
295        [ 9:10] Num bytes to Tx/Rx; must be 2'b0 for 1-byte Tx/Rx
296        [    8] RW# 1=Read, 0=Write
297        [    7] ad1 chip select mask
298        [    6] ad2 chip select mask
299        [ 0: 5] Reserved
300   
301    2: SPI Rx: {samp_rxByte, rfref_rxByte, 16'b0}
302        [24:31] SPI Rx byte for samp buf 0x00FF
303        [16:23] SPI Rx byte for rf ref buf 0xFF00
304        [ 0:15] Reserved 0xFFFF0000
305       
306    3: RW: User reset outputs
307        [31] usr_reset0
308        [30] usr_reset1
309        [29] usr_reset2
310        [28] usr_reset3
311        [0:27] reserved
312   
313    4: RO: User status inputs
314        [0:31] usr_status input
315   
316    5-15: Reserved
317    */
318
319
320    `define AD9512_SPI_XFER_LEN 5'd24
321
322    wire spi_mosi;
323    wire spi_sclk;
324    wire spi_cs;
325    wire spi_rnw;
326    wire spi_tx_reg_write;
327    wire [0:2] clk_div_sel;
328    wire spi_xfer_done;
329
330    wire samp_spi_cs, rfref_spi_cs;
331   
332    wire [0:31] samp_spi_rxData;
333    wire [0:31] rfref_spi_rxData;
334   
335    reg [0:31] usr_status_d;
336
337    //Register the usr_status input here, to ease timing closure of potentially fast host PLBs
338    always @(posedge Bus2IP_Clk)
339        usr_status_d <= usr_status;
340       
341    //Extract bits from IPIF slave registers and control signals
342
343    //spi_io stores 32 bits for Tx/Rx
344    // AD9512 only outputs 8-bit words during reads, always the last 8 bits of the transfer
345    assign samp_spi_rx_byte = samp_spi_rxData[24:31];
346    assign rfref_spi_rx_byte = rfref_spi_rxData[24:31];
347   
348    //SPI clock divider selection
349    assign clk_div_sel = slv_reg0[29:31]; //0x3 from driver
350
351    //SPI device resets (active low)
352    assign samp_func = slv_reg0[27]; //0x10 from driver
353    assign rfref_func = slv_reg0[26]; //0x20 from driver
354
355    //SPI device chip selects (active high; inverted before use below)
356    assign samp_spi_cs = slv_reg1[7]; //0x01000000 from driver
357    assign rfref_spi_cs = slv_reg1[6]; //0x02000000 from driver
358
359    //User reset outputs
360    assign usr_reset0 = slv_reg3[31];
361    assign usr_reset1 = slv_reg3[30];
362    assign usr_reset2 = slv_reg3[29];
363    assign usr_reset3 = slv_reg3[28];
364   
365    //Use the IPIC write-enable for the SPI Tx register as the SPI go
366    // The bus will be paused until this core ACKs the write
367    assign spi_tx_reg_write = Bus2IP_WrCE[1];
368
369    //spi_tx_reg_write (Bus2IP_WrCE[1]) de-asserts as soon as transaction is ACK'd
370    // so this mux switches back to the generic ACK as soon as the SPI xfer is done
371    //Thus, the duration of assertion for spi_xfer_done doesn't really matter
372    //A bit fast-n-loose, but works ok
373    assign IP2Bus_WrAck = spi_tx_reg_write ? spi_xfer_done : slv_write_ack;
374
375    //SPI device chip selects are active low
376    assign samp_spi_cs_n = ~(samp_spi_cs & spi_cs);
377    assign rfref_spi_cs_n = ~(rfref_spi_cs & spi_cs);
378   
379    //Mask each device's SPI clock output by its CS; no point toggling signals that will be ignored
380    assign samp_spi_sclk = (spi_sclk & samp_spi_cs);
381    assign rfref_spi_sclk = (spi_sclk & rfref_spi_cs);
382
383    //All SPI devices driven by same serial data output; CS signals control who listens
384    assign samp_spi_mosi = samp_spi_cs ? spi_mosi : 1'b0;
385    assign rfref_spi_mosi = rfref_spi_cs ? spi_mosi : 1'b0;
386   
387    warp_spi_io #(.SPI_XFER_LEN(`AD9512_SPI_XFER_LEN)) spi_io
388    (
389        .sys_clk(Bus2IP_Clk),
390        .reset(Bus2IP_Reset),
391        .go(spi_tx_reg_write),
392        .done(spi_xfer_done),
393        .clkDiv(clk_div_sel),
394
395        .currBitNum(),
396
397        .txData(slv_reg1),
398
399        .rxData1(samp_spi_rxData),
400        .rxData2(rfref_spi_rxData),
401        .rxData3(),
402        .rxData4(),
403       
404        .spi_cs(spi_cs),
405        .spi_sclk(spi_sclk),
406
407        .spi_mosi(spi_mosi),
408       
409        .spi_miso1(samp_spi_miso),
410        .spi_miso2(rfref_spi_miso),
411        .spi_miso3(1'b0),
412        .spi_miso4(1'b0)
413    );
414endmodule
Note: See TracBrowser for help on using the repository browser.