summaryrefslogtreecommitdiffstats
path: root/fpga/usrp2
diff options
context:
space:
mode:
Diffstat (limited to 'fpga/usrp2')
-rw-r--r--fpga/usrp2/control_lib/Makefile.srcs3
-rw-r--r--fpga/usrp2/control_lib/settings_bus_crossclock.v9
-rw-r--r--fpga/usrp2/control_lib/settings_fifo_ctrl.v395
-rw-r--r--fpga/usrp2/control_lib/simple_i2c_core.v116
-rw-r--r--fpga/usrp2/control_lib/simple_spi_core.v214
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full.gise4
-rw-r--r--fpga/usrp2/fifo/Makefile.srcs4
-rw-r--r--fpga/usrp2/fifo/packet_dispatcher36_x4.v316
-rw-r--r--fpga/usrp2/fifo/packet_padder36.v155
-rw-r--r--fpga/usrp2/fifo/packet_router.v23
-rw-r--r--fpga/usrp2/gpif/Makefile.srcs8
-rw-r--r--fpga/usrp2/gpif/fifo36_to_gpmc16.v54
-rw-r--r--fpga/usrp2/gpif/gpif.v185
-rw-r--r--fpga/usrp2/gpif/gpif_rd.v111
-rw-r--r--fpga/usrp2/gpif/gpif_tb.v142
-rw-r--r--fpga/usrp2/gpif/gpif_wr.v95
-rw-r--r--fpga/usrp2/gpif/gpif_wr_tb.v110
-rw-r--r--fpga/usrp2/gpif/gpmc16_to_fifo36.v64
-rwxr-xr-xfpga/usrp2/gpif/lint2
-rw-r--r--fpga/usrp2/gpif/packet_splitter.v123
-rw-r--r--fpga/usrp2/gpif/packet_splitter_tb.v137
-rw-r--r--fpga/usrp2/gpif/slave_fifo.v599
-rw-r--r--fpga/usrp2/gpmc/Makefile.srcs3
-rw-r--r--fpga/usrp2/gpmc/cross_clock_reader.v8
-rw-r--r--fpga/usrp2/gpmc/fifo_to_gpmc.v9
-rw-r--r--fpga/usrp2/gpmc/gpmc.v156
-rw-r--r--fpga/usrp2/gpmc/gpmc_to_fifo.v45
-rw-r--r--fpga/usrp2/gpmc/gpmc_wb.v79
-rw-r--r--fpga/usrp2/models/DCM_SP.v1244
-rw-r--r--fpga/usrp2/models/IBUFG.v59
-rw-r--r--fpga/usrp2/models/IBUFGDS.v87
-rw-r--r--fpga/usrp2/models/IDDR2.v172
-rw-r--r--fpga/usrp2/models/ODDR2.v157
-rw-r--r--fpga/usrp2/models/PLL_ADV.v2142
-rw-r--r--fpga/usrp2/models/PLL_BASE.v150
-rw-r--r--fpga/usrp2/top/B100/B100.v82
-rw-r--r--fpga/usrp2/top/B100/Makefile5
-rw-r--r--fpga/usrp2/top/B100/Makefile.B100_2RX106
-rwxr-xr-xfpga/usrp2/top/B100/core_compile2
-rw-r--r--fpga/usrp2/top/B100/timing.ucf19
-rw-r--r--fpga/usrp2/top/B100/u1plus.ucf203
-rw-r--r--fpga/usrp2/top/B100/u1plus.v173
-rw-r--r--fpga/usrp2/top/B100/u1plus_core.v670
-rw-r--r--fpga/usrp2/top/E1x0/E1x0.ucf (renamed from fpga/usrp2/top/E1x0/u1e.ucf)0
-rw-r--r--fpga/usrp2/top/E1x0/E1x0.v (renamed from fpga/usrp2/top/E1x0/u1e.v)105
-rw-r--r--fpga/usrp2/top/E1x0/Makefile.E1008
-rw-r--r--fpga/usrp2/top/E1x0/Makefile.E1108
-rwxr-xr-xfpga/usrp2/top/E1x0/core_compile2
-rw-r--r--fpga/usrp2/top/E1x0/timing.ucf26
-rw-r--r--fpga/usrp2/top/E1x0/u1e_core.v494
-rw-r--r--fpga/usrp2/top/N2x0/bootloader.rmi780
-rw-r--r--fpga/usrp2/top/N2x0/u2plus_core.v86
-rw-r--r--fpga/usrp2/top/USRP2/Makefile2
-rw-r--r--fpga/usrp2/top/USRP2/u2_core.v95
-rwxr-xr-xfpga/usrp2/top/extract_usage.py60
-rw-r--r--fpga/usrp2/vrt/vita_rx_framer.v8
-rw-r--r--fpga/usrp2/vrt/vita_tx_deframer.v3
57 files changed, 6852 insertions, 3265 deletions
diff --git a/fpga/usrp2/control_lib/Makefile.srcs b/fpga/usrp2/control_lib/Makefile.srcs
index 6ee7ea262..42862a50f 100644
--- a/fpga/usrp2/control_lib/Makefile.srcs
+++ b/fpga/usrp2/control_lib/Makefile.srcs
@@ -55,4 +55,7 @@ atr_controller16.v \
fifo_to_wb.v \
gpio_atr.v \
user_settings.v \
+settings_fifo_ctrl.v \
+simple_spi_core.v \
+simple_i2c_core.v \
))
diff --git a/fpga/usrp2/control_lib/settings_bus_crossclock.v b/fpga/usrp2/control_lib/settings_bus_crossclock.v
index 9c5912042..a61ee8fad 100644
--- a/fpga/usrp2/control_lib/settings_bus_crossclock.v
+++ b/fpga/usrp2/control_lib/settings_bus_crossclock.v
@@ -1,5 +1,5 @@
//
-// Copyright 2011 Ettus Research LLC
+// Copyright 2011-2012 Ettus Research LLC
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -22,16 +22,17 @@
// the system or dsp clock on the output side
module settings_bus_crossclock
+ #(parameter FLOW_CTRL=0)
(input clk_i, input rst_i, input set_stb_i, input [7:0] set_addr_i, input [31:0] set_data_i,
- input clk_o, input rst_o, output set_stb_o, output [7:0] set_addr_o, output [31:0] set_data_o);
+ input clk_o, input rst_o, output set_stb_o, output [7:0] set_addr_o, output [31:0] set_data_o, input blocked);
wire full, empty;
fifo_xlnx_16x40_2clk settings_fifo
(.rst(rst_i),
.wr_clk(clk_i), .din({set_addr_i,set_data_i}), .wr_en(set_stb_i & ~full), .full(full),
- .rd_clk(clk_o), .dout({set_addr_o,set_data_o}), .rd_en(~empty), .empty(empty));
+ .rd_clk(clk_o), .dout({set_addr_o,set_data_o}), .rd_en(set_stb_o), .empty(empty));
- assign set_stb_o = ~empty;
+ assign set_stb_o = ~empty & (~blocked | ~FLOW_CTRL);
endmodule // settings_bus_crossclock
diff --git a/fpga/usrp2/control_lib/settings_fifo_ctrl.v b/fpga/usrp2/control_lib/settings_fifo_ctrl.v
new file mode 100644
index 000000000..37f11776e
--- /dev/null
+++ b/fpga/usrp2/control_lib/settings_fifo_ctrl.v
@@ -0,0 +1,395 @@
+//
+// Copyright 2012 Ettus Research LLC
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+// A settings and readback bus controlled via fifo36 interface
+
+module settings_fifo_ctrl
+ #(
+ parameter XPORT_HDR = 1, //extra transport hdr line
+ parameter PROT_DEST = 0, //protocol framer destination
+ parameter PROT_HDR = 1, //needs a protocol header?
+ parameter ACK_SID = 0 //stream ID for packet ACK
+ )
+ (
+ //clock and synchronous reset for all interfaces
+ input clock, input reset, input clear,
+
+ //current system time
+ input [63:0] vita_time,
+
+ //ready signal for multiple peripherals
+ input perfs_ready,
+
+ //input fifo36 interface control
+ input [35:0] in_data, input in_valid, output in_ready,
+
+ //output fifo36 interface status
+ output [35:0] out_data, output out_valid, input out_ready,
+
+ //32-bit settings bus outputs
+ output strobe, output [7:0] addr, output [31:0] data,
+
+ //16X 32-bit inputs for readback
+ input [31:0] word00,
+ input [31:0] word01,
+ input [31:0] word02,
+ input [31:0] word03,
+ input [31:0] word04,
+ input [31:0] word05,
+ input [31:0] word06,
+ input [31:0] word07,
+ input [31:0] word08,
+ input [31:0] word09,
+ input [31:0] word10,
+ input [31:0] word11,
+ input [31:0] word12,
+ input [31:0] word13,
+ input [31:0] word14,
+ input [31:0] word15,
+
+ //debug output
+ output [31:0] debug
+ );
+
+ wire reading = in_valid && in_ready;
+ wire writing = out_valid && out_ready;
+
+ //------------------------------------------------------------------
+ //-- The command fifo:
+ //-- Stores an individual register access command per line.
+ //------------------------------------------------------------------
+ wire [63:0] in_command_ticks, out_command_ticks;
+ wire [31:0] in_command_hdr, out_command_hdr;
+ wire [31:0] in_command_data, out_command_data;
+ wire in_command_has_time, out_command_has_time;
+ wire command_fifo_full, command_fifo_empty;
+ wire command_fifo_read, command_fifo_write;
+
+ shortfifo #(.WIDTH(129)) command_fifo (
+ .clk(clock), .rst(reset), .clear(clear),
+ .datain({in_command_ticks, in_command_hdr, in_command_data, in_command_has_time}),
+ .dataout({out_command_ticks, out_command_hdr, out_command_data, out_command_has_time}),
+ .write(command_fifo_write), .full(command_fifo_full), //input interface
+ .empty(command_fifo_empty), .read(command_fifo_read) //output interface
+ );
+
+ //------------------------------------------------------------------
+ //-- The result fifo:
+ //-- Stores an individual result of a command per line.
+ //------------------------------------------------------------------
+ wire [31:0] in_result_hdr, out_result_hdr;
+ wire [31:0] in_result_data, out_result_data;
+ wire result_fifo_full, result_fifo_empty;
+ wire result_fifo_read, result_fifo_write;
+
+ shortfifo #(.WIDTH(64)) result_fifo (
+ .clk(clock), .rst(reset), .clear(clear),
+ .datain({in_result_hdr, in_result_data}),
+ .dataout({out_result_hdr, out_result_data}),
+ .write(result_fifo_write), .full(result_fifo_full), //input interface
+ .empty(result_fifo_empty), .read(result_fifo_read) //output interface
+ );
+
+ //------------------------------------------------------------------
+ //-- Input state machine:
+ //-- Read input packet and fill a command fifo entry.
+ //------------------------------------------------------------------
+ localparam READ_LINE0 = 0;
+ localparam VITA_HDR = 1;
+ localparam VITA_SID = 2;
+ localparam VITA_CID0 = 3;
+ localparam VITA_CID1 = 4;
+ localparam VITA_TSI = 5;
+ localparam VITA_TSF0 = 6;
+ localparam VITA_TSF1 = 7;
+ localparam READ_HDR = 8;
+ localparam READ_DATA = 9;
+ localparam WAIT_EOF = 10;
+ localparam STORE_CMD = 11;
+
+ localparam START_STATE = (XPORT_HDR)? READ_LINE0 : VITA_HDR;
+
+ reg [4:0] in_state;
+
+ //holdover from current read inputs
+ reg [31:0] in_data_reg, in_hdr_reg;
+ reg [63:0] in_ticks_reg;
+ wire has_sid = in_data[28];
+ wire has_cid = in_data[27];
+ wire has_tsi = in_data[23:22] != 0;
+ wire has_tsf = in_data[21:20] != 0;
+ reg has_sid_reg, has_cid_reg, has_tsi_reg, has_tsf_reg;
+
+ assign in_ready = (in_state < STORE_CMD);
+ assign command_fifo_write = (in_state == STORE_CMD);
+ assign in_command_ticks = in_ticks_reg;
+ assign in_command_data = in_data_reg;
+ assign in_command_hdr = in_hdr_reg;
+ assign in_command_has_time = has_tsf_reg;
+
+ always @(posedge clock) begin
+ if (reset) begin
+ in_state <= START_STATE;
+ end
+ else begin
+ case (in_state)
+
+ READ_LINE0: begin
+ if (reading) in_state <= VITA_HDR;
+ end
+
+ VITA_HDR: begin
+ if (reading) begin
+ if (has_sid) in_state <= VITA_SID;
+ else if (has_cid) in_state <= VITA_CID0;
+ else if (has_tsi) in_state <= VITA_TSI;
+ else if (has_tsf) in_state <= VITA_TSF0;
+ else in_state <= READ_HDR;
+ end
+ has_sid_reg <= has_sid;
+ has_cid_reg <= has_cid;
+ has_tsi_reg <= has_tsi;
+ has_tsf_reg <= has_tsf;
+ end
+
+ VITA_SID: begin
+ if (reading) begin
+ if (has_cid_reg) in_state <= VITA_CID0;
+ else if (has_tsi_reg) in_state <= VITA_TSI;
+ else if (has_tsf_reg) in_state <= VITA_TSF0;
+ else in_state <= READ_HDR;
+ end
+ end
+
+ VITA_CID0: begin
+ if (reading) in_state <= VITA_CID1;
+ end
+
+ VITA_CID1: begin
+ if (reading) begin
+ if (has_tsi_reg) in_state <= VITA_TSI;
+ else if (has_tsf_reg) in_state <= VITA_TSF0;
+ else in_state <= READ_HDR;
+ end
+ end
+
+ VITA_TSI: begin
+ if (reading) begin
+ if (has_tsf_reg) in_state <= VITA_TSF0;
+ else in_state <= READ_HDR;
+ end
+ end
+
+ VITA_TSF0: begin
+ if (reading) in_state <= VITA_TSF1;
+ in_ticks_reg[63:32] <= in_data;
+ end
+
+ VITA_TSF1: begin
+ if (reading) in_state <= READ_HDR;
+ in_ticks_reg[31:0] <= in_data;
+ end
+
+ READ_HDR: begin
+ if (reading) in_state <= READ_DATA;
+ in_hdr_reg <= in_data[31:0];
+ end
+
+ READ_DATA: begin
+ if (reading) in_state <= (in_data[33])? STORE_CMD : WAIT_EOF;
+ in_data_reg <= in_data[31:0];
+ end
+
+ WAIT_EOF: begin
+ if (reading && in_data[33]) in_state <= STORE_CMD;
+ end
+
+ STORE_CMD: begin
+ if (~command_fifo_full) in_state <= START_STATE;
+ end
+
+ endcase //in_state
+ end
+ end
+
+ //------------------------------------------------------------------
+ //-- Command state machine:
+ //-- Read a command fifo entry, act on it, produce result.
+ //------------------------------------------------------------------
+ localparam LOAD_CMD = 0;
+ localparam EVENT_CMD = 1;
+
+ reg cmd_state;
+ reg [31:0] rb_data;
+
+ reg [63:0] command_ticks_reg;
+ reg [31:0] command_hdr_reg;
+ reg [31:0] command_data_reg;
+
+ reg [63:0] vita_time_reg;
+ always @(posedge clock)
+ vita_time_reg <= vita_time;
+
+ wire late;
+ `ifndef FIFO_CTRL_NO_TIME
+ time_compare time_compare(
+ .time_now(vita_time_reg), .trigger_time(command_ticks_reg), .late(late));
+ `else
+ assign late = 1;
+ `endif
+
+ //action occurs in the event state and when there is fifo space (should always be true)
+ //the third condition is that all peripherals in the perfs signal are ready/active high
+ //the fourth condition is that is an event time has been set, action is delayed until that time
+ wire time_ready = (out_command_has_time)? late : 1;
+ wire action = (cmd_state == EVENT_CMD) && ~result_fifo_full && perfs_ready && time_ready;
+
+ assign command_fifo_read = action;
+ assign result_fifo_write = action;
+ assign in_result_hdr = command_hdr_reg;
+ assign in_result_data = rb_data;
+
+ always @(posedge clock) begin
+ if (reset) begin
+ cmd_state <= LOAD_CMD;
+ end
+ else begin
+ case (cmd_state)
+
+ LOAD_CMD: begin
+ if (~command_fifo_empty) cmd_state <= EVENT_CMD;
+ command_ticks_reg <= out_command_ticks;
+ command_hdr_reg <= out_command_hdr;
+ command_data_reg <= out_command_data;
+ end
+
+ EVENT_CMD: begin // poking and peeking happens here!
+ if (action || clear) cmd_state <= LOAD_CMD;
+ end
+
+ endcase //cmd_state
+ end
+ end
+
+ //------------------------------------------------------------------
+ //-- assign to settings bus interface
+ //------------------------------------------------------------------
+ reg strobe_reg;
+ assign strobe = strobe_reg;
+ assign data = command_data_reg;
+ assign addr = command_hdr_reg[7:0];
+ wire poke = command_hdr_reg[8];
+
+ always @(posedge clock) begin
+ if (reset || clear) strobe_reg <= 0;
+ else strobe_reg <= action && poke;
+ end
+
+ //------------------------------------------------------------------
+ //-- readback mux
+ //------------------------------------------------------------------
+ always @(posedge clock) begin
+ case (out_command_hdr[3:0])
+ 0 : rb_data <= word00;
+ 1 : rb_data <= word01;
+ 2 : rb_data <= word02;
+ 3 : rb_data <= word03;
+ 4 : rb_data <= word04;
+ 5 : rb_data <= word05;
+ 6 : rb_data <= word06;
+ 7 : rb_data <= word07;
+ 8 : rb_data <= word08;
+ 9 : rb_data <= word09;
+ 10: rb_data <= word10;
+ 11: rb_data <= word11;
+ 12: rb_data <= word12;
+ 13: rb_data <= word13;
+ 14: rb_data <= word14;
+ 15: rb_data <= word15;
+ endcase // case(addr_reg[3:0])
+ end
+
+ //------------------------------------------------------------------
+ //-- Output state machine:
+ //-- Read a command fifo entry, act on it, produce ack packet.
+ //------------------------------------------------------------------
+ localparam WRITE_PROT_HDR = 0;
+ localparam WRITE_VRT_HDR = 1;
+ localparam WRITE_VRT_SID = 2;
+ localparam WRITE_RB_HDR = 3;
+ localparam WRITE_RB_DATA = 4;
+
+ //the state for the start of packet condition
+ localparam WRITE_PKT_HDR = (PROT_HDR)? WRITE_PROT_HDR : WRITE_VRT_HDR;
+
+ reg [2:0] out_state;
+
+ assign out_valid = ~result_fifo_empty;
+ assign result_fifo_read = out_data[33] && writing;
+
+ always @(posedge clock) begin
+ if (reset) begin
+ out_state <= WRITE_PKT_HDR;
+ end
+ else if (writing && out_data[33]) begin
+ out_state <= WRITE_PKT_HDR;
+ end
+ else if (writing) begin
+ out_state <= out_state + 1;
+ end
+ end
+
+ //------------------------------------------------------------------
+ //-- assign to output fifo interface
+ //------------------------------------------------------------------
+ wire [31:0] prot_hdr;
+ assign prot_hdr[15:0] = 16; //bytes in proceeding vita packet
+ assign prot_hdr[16] = 1; //yes frame
+ assign prot_hdr[18:17] = PROT_DEST;
+ assign prot_hdr[31:19] = 0; //nothing
+
+ reg [31:0] out_data_int;
+ always @* begin
+ case (out_state)
+ WRITE_PROT_HDR: out_data_int <= prot_hdr;
+ WRITE_VRT_HDR: out_data_int <= {12'b010100000000, out_result_hdr[19:16], 2'b0, prot_hdr[15:2]};
+ WRITE_VRT_SID: out_data_int <= ACK_SID;
+ WRITE_RB_HDR: out_data_int <= out_result_hdr;
+ WRITE_RB_DATA: out_data_int <= out_result_data;
+ default: out_data_int <= 0;
+ endcase //state
+ end
+
+ assign out_data[35:34] = 2'b0;
+ assign out_data[33] = (out_state == WRITE_RB_DATA);
+ assign out_data[32] = (out_state == WRITE_PKT_HDR);
+ assign out_data[31:0] = out_data_int;
+
+ //------------------------------------------------------------------
+ //-- debug outputs
+ //------------------------------------------------------------------
+ assign debug = {
+ in_state, out_state, //8
+ in_valid, in_ready, in_data[33:32], //4
+ out_valid, out_ready, out_data[33:32], //4
+ command_fifo_empty, command_fifo_full, //2
+ command_fifo_read, command_fifo_write, //2
+ addr, //8
+ strobe_reg, strobe, poke, out_command_has_time //4
+ };
+
+endmodule //settings_fifo_ctrl
diff --git a/fpga/usrp2/control_lib/simple_i2c_core.v b/fpga/usrp2/control_lib/simple_i2c_core.v
new file mode 100644
index 000000000..9c61de8fb
--- /dev/null
+++ b/fpga/usrp2/control_lib/simple_i2c_core.v
@@ -0,0 +1,116 @@
+//
+// Copyright 2012 Ettus Research LLC
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+// Simple I2C core
+
+// Settings reg map:
+//
+// BASE+0 control register
+// byte0 - control bits, data byte, or command bits, prescaler
+// byte1 - what to do? (documented in cpp file)
+// write prescaler lo
+// write prescaler hi
+// write control
+// write data
+// write command
+// read data
+// read status
+//
+
+// Readback:
+//
+// byte0 has readback value based on the last read command
+//
+
+module simple_i2c_core
+ #(
+ //settings register base address
+ parameter BASE = 0,
+
+ //i2c line level at reset
+ parameter ARST_LVL = 1
+ )
+ (
+ //clock and synchronous reset
+ input clock, input reset,
+
+ //32-bit settings bus inputs
+ input set_stb, input [7:0] set_addr, input [31:0] set_data,
+
+ //32-bit data readback
+ output reg [31:0] readback,
+
+ //read is high when i2c core can begin another transaction
+ output reg ready,
+
+ // I2C signals
+ // i2c clock line
+ input scl_pad_i, // SCL-line input
+ output scl_pad_o, // SCL-line output (always 1'b0)
+ output scl_padoen_o, // SCL-line output enable (active low)
+
+ // i2c data line
+ input sda_pad_i, // SDA-line input
+ output sda_pad_o, // SDA-line output (always 1'b0)
+ output sda_padoen_o, // SDA-line output enable (active low)
+
+ //optional debug output
+ output [31:0] debug
+ );
+
+ //declare command settings register
+ wire [7:0] sr_what, sr_data;
+ wire sr_changed;
+ setting_reg #(.my_addr(BASE+0),.width(16)) i2c_cmd_sr(
+ .clk(clock),.rst(reset),.strobe(set_stb),.addr(set_addr),.in(set_data),
+ .out({sr_what, sr_data}),.changed(sr_changed));
+
+ //declare wb interface signals
+ wire [2:0] wb_addr;
+ wire [7:0] wb_data_mosi;
+ wire [7:0] wb_data_miso;
+ wire wb_we, wb_stb, wb_cyc;
+ wire wb_ack;
+
+ //create wishbone-based i2c core
+ i2c_master_top #(.ARST_LVL(ARST_LVL)) i2c
+ (.wb_clk_i(clock),.wb_rst_i(reset),.arst_i(1'b0),
+ .wb_adr_i(wb_addr),.wb_dat_i(wb_data_mosi),.wb_dat_o(wb_data_miso),
+ .wb_we_i(wb_we),.wb_stb_i(wb_stb),.wb_cyc_i(wb_cyc),
+ .wb_ack_o(wb_ack),.wb_inta_o(),
+ .scl_pad_i(scl_pad_i),.scl_pad_o(scl_pad_o),.scl_padoen_o(scl_padoen_o),
+ .sda_pad_i(sda_pad_i),.sda_pad_o(sda_pad_o),.sda_padoen_o(sda_padoen_o) );
+
+ //not ready between setting register and wishbone ack
+ always @(posedge clock) begin
+ if (reset || wb_ack) ready <= 1;
+ else if (sr_changed) ready <= 0;
+ end
+
+ //register wishbone data on every ack
+ always @(posedge clock) begin
+ if (wb_ack) readback <= {24'b0, wb_data_miso};
+ end
+
+ //assign wishbone signals
+ assign wb_addr = sr_what[2:0];
+ assign wb_stb = sr_changed;
+ assign wb_we = wb_stb && sr_what[3];
+ assign wb_cyc = wb_stb;
+ assign wb_data_mosi = sr_data;
+
+endmodule //simple_i2c_core
diff --git a/fpga/usrp2/control_lib/simple_spi_core.v b/fpga/usrp2/control_lib/simple_spi_core.v
new file mode 100644
index 000000000..3c0ed60b9
--- /dev/null
+++ b/fpga/usrp2/control_lib/simple_spi_core.v
@@ -0,0 +1,214 @@
+//
+// Copyright 2012 Ettus Research LLC
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+// Simple SPI core, the simplest, yet complete spi core I can think of
+
+// Settings register controlled.
+// 2 settings regs, control and data
+// 1 32-bit readback and status signal
+
+// Settings reg map:
+//
+// BASE+0 divider setting
+// bits [15:0] spi clock divider
+//
+// BASE+1 configuration input
+// bits [23:0] slave select, bit0 = slave0 enabled
+// bits [29:24] num bits (1 through 32)
+// bit [30] data input edge = in data bit latched on rising edge of clock
+// bit [31] data output edge = out data bit latched on rising edge of clock
+//
+// BASE+2 input data
+// Writing this register begins a spi transaction.
+// Bits are latched out from bit 0.
+// Therefore, load this register in reverse.
+//
+// Readback
+// Bits are latched into bit 0.
+// Therefore, data will be in-order.
+
+module simple_spi_core
+ #(
+ //settings register base address
+ parameter BASE = 0,
+
+ //width of serial enables (up to 24 is possible)
+ parameter WIDTH = 8,
+
+ //idle state of the spi clock
+ parameter CLK_IDLE = 0,
+
+ //idle state of the serial enables
+ parameter SEN_IDLE = 24'hffffff
+ )
+ (
+ //clock and synchronous reset
+ input clock, input reset,
+
+ //32-bit settings bus inputs
+ input set_stb, input [7:0] set_addr, input [31:0] set_data,
+
+ //32-bit data readback
+ output [31:0] readback,
+
+ //read is high when spi core can begin another transaction
+ output ready,
+
+ //spi interface, slave selects, clock, data in, data out
+ output [WIDTH-1:0] sen,
+ output sclk,
+ output mosi,
+ input miso,
+
+ //optional debug output
+ output [31:0] debug
+ );
+
+ wire [15:0] sclk_divider;
+ setting_reg #(.my_addr(BASE+0),.width(16)) divider_sr(
+ .clk(clock),.rst(reset),.strobe(set_stb),.addr(set_addr),.in(set_data),
+ .out(sclk_divider),.changed());
+
+ wire [23:0] slave_select;
+ wire [5:0] num_bits;
+ wire datain_edge, dataout_edge;
+ setting_reg #(.my_addr(BASE+1),.width(32)) config_sr(
+ .clk(clock),.rst(reset),.strobe(set_stb),.addr(set_addr),.in(set_data),
+ .out({dataout_edge, datain_edge, num_bits, slave_select}),.changed());
+
+ wire [31:0] mosi_data;
+ wire trigger_spi;
+ setting_reg #(.my_addr(BASE+2),.width(32)) data_sr(
+ .clk(clock),.rst(reset),.strobe(set_stb),.addr(set_addr),.in(set_data),
+ .out(mosi_data),.changed(trigger_spi));
+
+ localparam WAIT_TRIG = 0;
+ localparam PRE_IDLE = 1;
+ localparam CLK_REG = 2;
+ localparam CLK_INV = 3;
+ localparam POST_IDLE = 4;
+ localparam IDLE_SEN = 5;
+
+ reg [2:0] state;
+
+ reg ready_reg;
+ assign ready = ready_reg && ~trigger_spi;
+
+ //serial clock either idles or is in one of two clock states
+ reg sclk_reg;
+ assign sclk = sclk_reg;
+
+ //serial enables either idle or enabled based on state
+ wire sen_is_idle = (state == WAIT_TRIG) || (state == IDLE_SEN);
+ wire [23:0] sen24 = (sen_is_idle)? SEN_IDLE : (SEN_IDLE ^ slave_select);
+ reg [WIDTH-1:0] sen_reg;
+ always @(posedge clock) sen_reg <= sen24[WIDTH-1:0];
+ assign sen = sen_reg;
+
+ //data output shift register
+ reg [31:0] dataout_reg;
+ wire [31:0] dataout_next = {dataout_reg[30:0], 1'b0};
+ assign mosi = dataout_reg[31];
+
+ //data input shift register
+ reg [31:0] datain_reg;
+ wire [31:0] datain_next = {datain_reg[30:0], miso};
+ assign readback = datain_reg;
+
+ //counter for spi clock
+ reg [15:0] sclk_counter;
+ wire sclk_counter_done = (sclk_counter == sclk_divider);
+ wire [15:0] sclk_counter_next = (sclk_counter_done)? 0 : sclk_counter + 1;
+
+ //counter for latching bits miso/mosi
+ reg [6:0] bit_counter;
+ wire [6:0] bit_counter_next = bit_counter + 1;
+ wire bit_counter_done = (bit_counter_next == num_bits);
+
+ always @(posedge clock) begin
+ if (reset) begin
+ state <= WAIT_TRIG;
+ sclk_reg <= CLK_IDLE;
+ ready_reg <= 0;
+ end
+ else begin
+ case (state)
+
+ WAIT_TRIG: begin
+ if (trigger_spi) state <= PRE_IDLE;
+ ready_reg <= ~trigger_spi;
+ dataout_reg <= mosi_data;
+ sclk_counter <= 0;
+ bit_counter <= 0;
+ sclk_reg <= CLK_IDLE;
+ end
+
+ PRE_IDLE: begin
+ if (sclk_counter_done) state <= CLK_REG;
+ sclk_counter <= sclk_counter_next;
+ sclk_reg <= CLK_IDLE;
+ end
+
+ CLK_REG: begin
+ if (sclk_counter_done) begin
+ state <= CLK_INV;
+ if (datain_edge != CLK_IDLE) datain_reg <= datain_next;
+ if (dataout_edge != CLK_IDLE && bit_counter != 0) dataout_reg <= dataout_next;
+ sclk_reg <= ~CLK_IDLE; //transition to rising when CLK_IDLE == 0
+ end
+ sclk_counter <= sclk_counter_next;
+ end
+
+ CLK_INV: begin
+ if (sclk_counter_done) begin
+ state <= (bit_counter_done)? POST_IDLE : CLK_REG;
+ bit_counter <= bit_counter_next;
+ if (datain_edge == CLK_IDLE) datain_reg <= datain_next;
+ if (dataout_edge == CLK_IDLE && ~bit_counter_done) dataout_reg <= dataout_next;
+ sclk_reg <= CLK_IDLE; //transition to falling when CLK_IDLE == 0
+ end
+ sclk_counter <= sclk_counter_next;
+ end
+
+ POST_IDLE: begin
+ if (sclk_counter_done) state <= IDLE_SEN;
+ sclk_counter <= sclk_counter_next;
+ sclk_reg <= CLK_IDLE;
+ end
+
+ IDLE_SEN: begin
+ if (sclk_counter_done) state <= WAIT_TRIG;
+ sclk_counter <= sclk_counter_next;
+ sclk_reg <= CLK_IDLE;
+ end
+
+ default: state <= WAIT_TRIG;
+
+ endcase //state
+ end
+ end
+
+ assign debug = {
+ trigger_spi, state, //4
+ sclk, mosi, miso, ready, //4
+ sen[7:0], //8
+ 1'b0, bit_counter[6:0], //8
+ sclk_counter_done, bit_counter_done, //2
+ sclk_counter[5:0] //6
+ };
+
+endmodule //simple_spi_core
diff --git a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full.gise b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full.gise
index 9abec8c3e..660fb2f65 100644
--- a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full.gise
+++ b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full.gise
@@ -21,9 +21,7 @@
<sourceproject xmlns="http://www.xilinx.com/XMLSchema" xil_pn:fileType="FILE_XISE" xil_pn:name="fifo_xlnx_512x36_2clk_prog_full.xise"/>
- <files xmlns="http://www.xilinx.com/XMLSchema">
- <file xil_pn:fileType="FILE_VEO" xil_pn:name="fifo_xlnx_512x36_2clk_prog_full.veo" xil_pn:origination="imported"/>
- </files>
+ <files xmlns="http://www.xilinx.com/XMLSchema"/>
<transforms xmlns="http://www.xilinx.com/XMLSchema"/>
diff --git a/fpga/usrp2/fifo/Makefile.srcs b/fpga/usrp2/fifo/Makefile.srcs
index 28d506571..55ba0be2a 100644
--- a/fpga/usrp2/fifo/Makefile.srcs
+++ b/fpga/usrp2/fifo/Makefile.srcs
@@ -1,5 +1,5 @@
#
-# Copyright 2010 Ettus Research LLC
+# Copyright 2010-2012 Ettus Research LLC
#
##################################################
@@ -32,9 +32,11 @@ splitter36.v \
valve36.v \
fifo_pacer.v \
packet_dispatcher36_x3.v \
+packet_dispatcher36_x4.v \
packet_generator32.v \
packet_generator.v \
packet_verifier32.v \
packet_verifier.v \
fifo19_pad.v \
+packet_padder36.v \
))
diff --git a/fpga/usrp2/fifo/packet_dispatcher36_x4.v b/fpga/usrp2/fifo/packet_dispatcher36_x4.v
new file mode 100644
index 000000000..7eedb3e74
--- /dev/null
+++ b/fpga/usrp2/fifo/packet_dispatcher36_x4.v
@@ -0,0 +1,316 @@
+//
+// Copyright 2011-2012 Ettus Research LLC
+//
+// Packet dispatcher with fifo36 interface and 4 outputs.
+//
+// The packet dispatcher expects 2-byte padded ethernet frames.
+// The frames will be inspected at ethernet, IPv4, UDP, and VRT layers.
+// Packets are dispatched into the following streams:
+// * tx dsp stream
+// * tx control stream
+// * to cpu stream
+// * to external stream
+// * to both cpu and external
+//
+// The following registers are used for dispatcher control:
+// * base + 0 = this ipv4 address (32 bits)
+// * base + 1 = udp control port (upper 16 bits), udp dsp port (lower 16 bits)
+//
+
+module packet_dispatcher36_x4
+ #(
+ parameter BASE = 0
+ )
+ (
+ //clocking and reset interface:
+ input clk, input rst, input clr,
+
+ //setting register interface:
+ input set_stb, input [7:0] set_addr, input [31:0] set_data,
+
+ //input stream interfaces:
+ input [35:0] com_inp_data, input com_inp_valid, output com_inp_ready,
+
+ //output stream interfaces:
+ output [35:0] ext_out_data, output ext_out_valid, input ext_out_ready,
+ output [35:0] dsp_out_data, output dsp_out_valid, input dsp_out_ready,
+ output [35:0] ctl_out_data, output ctl_out_valid, input ctl_out_ready,
+ output [35:0] cpu_out_data, output cpu_out_valid, input cpu_out_ready
+ );
+
+ //setting register to program the IP address
+ wire [31:0] my_ip_addr;
+ setting_reg #(.my_addr(BASE+0)) sreg_ip_addr(
+ .clk(clk),.rst(rst),
+ .strobe(set_stb),.addr(set_addr),.in(set_data),
+ .out(my_ip_addr),.changed()
+ );
+
+ //setting register to program the UDP DSP port
+ wire [15:0] dsp_udp_port, ctl_udp_port;
+ setting_reg #(.my_addr(BASE+1), .width(32)) sreg_data_port(
+ .clk(clk),.rst(rst),
+ .strobe(set_stb),.addr(set_addr),.in(set_data),
+ .out({ctl_udp_port, dsp_udp_port}),.changed()
+ );
+
+ ////////////////////////////////////////////////////////////////////
+ // Communication input inspector
+ // - inspect com input and send it to DSP, EXT, CPU, or BOTH
+ ////////////////////////////////////////////////////////////////////
+ localparam PD_STATE_READ_COM_PRE = 0;
+ localparam PD_STATE_READ_COM = 1;
+ localparam PD_STATE_WRITE_REGS = 2;
+ localparam PD_STATE_WRITE_LIVE = 3;
+
+ localparam PD_DEST_DSP = 0;
+ localparam PD_DEST_EXT = 1;
+ localparam PD_DEST_CPU = 2;
+ localparam PD_DEST_BOF = 3;
+ localparam PD_DEST_CTL = 4;
+
+ localparam PD_MAX_NUM_DREGS = 13; //padded_eth + ip + udp + seq + vrt_hdr
+ localparam PD_DREGS_DSP_OFFSET = 11; //offset to start dsp at
+
+ //output inspector interfaces
+ wire [35:0] pd_out_dsp_data;
+ wire pd_out_dsp_valid;
+ wire pd_out_dsp_ready;
+
+ wire [35:0] pd_out_ext_data;
+ wire pd_out_ext_valid;
+ wire pd_out_ext_ready;
+
+ wire [35:0] pd_out_cpu_data;
+ wire pd_out_cpu_valid;
+ wire pd_out_cpu_ready;
+
+ wire [35:0] pd_out_bof_data;
+ wire pd_out_bof_valid;
+ wire pd_out_bof_ready;
+
+ wire [35:0] pd_out_ctl_data;
+ wire pd_out_ctl_valid;
+ wire pd_out_ctl_ready;
+
+ reg [1:0] pd_state;
+ reg [2:0] pd_dest;
+ reg [3:0] pd_dreg_count; //data registers to buffer headers
+ wire [3:0] pd_dreg_count_next = pd_dreg_count + 1'b1;
+ wire pd_dreg_counter_done = (pd_dreg_count_next == PD_MAX_NUM_DREGS)? 1'b1 : 1'b0;
+ reg [35:0] pd_dregs [PD_MAX_NUM_DREGS-1:0];
+
+ reg is_eth_dst_mac_bcast;
+ reg is_eth_type_ipv4;
+ reg is_eth_ipv4_proto_udp;
+ reg is_eth_ipv4_dst_addr_here;
+ reg is_eth_udp_dsp_port_here;
+ reg is_eth_udp_ctl_port_here;
+ wire is_vrt_size_zero = (com_inp_data[15:0] == 16'h0); //needed on the same cycle, so it cant be registered
+
+ //Inspector output flags special case:
+ //Inject SOF into flags at first DSP line.
+ wire [3:0] pd_out_flags = (
+ (pd_dreg_count == PD_DREGS_DSP_OFFSET) &&
+ (pd_dest == PD_DEST_DSP)
+ )? 4'b0001 : pd_dregs[pd_dreg_count][35:32];
+
+ //The communication inspector ouput data and valid signals:
+ //Mux between com input and data registers based on the state.
+ wire [35:0] pd_out_data = (pd_state == PD_STATE_WRITE_REGS)?
+ {pd_out_flags, pd_dregs[pd_dreg_count][31:0]} : com_inp_data
+ ;
+ wire pd_out_valid =
+ (pd_state == PD_STATE_WRITE_REGS)? 1'b1 : (
+ (pd_state == PD_STATE_WRITE_LIVE)? com_inp_valid : (
+ 1'b0));
+
+ //The communication inspector ouput ready signal:
+ //Mux between the various destination ready signals.
+ wire pd_out_ready =
+ (pd_dest == PD_DEST_DSP)? pd_out_dsp_ready : (
+ (pd_dest == PD_DEST_EXT)? pd_out_ext_ready : (
+ (pd_dest == PD_DEST_CPU)? pd_out_cpu_ready : (
+ (pd_dest == PD_DEST_BOF)? pd_out_bof_ready : (
+ (pd_dest == PD_DEST_CTL)? pd_out_ctl_ready : (
+ 1'b0)))));
+
+ //Always connected output data lines.
+ assign pd_out_dsp_data = pd_out_data;
+ assign pd_out_ext_data = pd_out_data;
+ assign pd_out_cpu_data = pd_out_data;
+ assign pd_out_bof_data = pd_out_data;
+ assign pd_out_ctl_data = pd_out_data;
+
+ //Destination output valid signals:
+ //Comes from inspector valid when destination is selected, and otherwise low.
+ assign pd_out_dsp_valid = (pd_dest == PD_DEST_DSP)? pd_out_valid : 1'b0;
+ assign pd_out_ext_valid = (pd_dest == PD_DEST_EXT)? pd_out_valid : 1'b0;
+ assign pd_out_cpu_valid = (pd_dest == PD_DEST_CPU)? pd_out_valid : 1'b0;
+ assign pd_out_bof_valid = (pd_dest == PD_DEST_BOF)? pd_out_valid : 1'b0;
+ assign pd_out_ctl_valid = (pd_dest == PD_DEST_CTL)? pd_out_valid : 1'b0;
+
+ //The communication inspector ouput ready signal:
+ //Always ready when storing to data registers,
+ //comes from inspector ready output when live,
+ //and otherwise low.
+ assign com_inp_ready =
+ (pd_state == PD_STATE_READ_COM_PRE) ? 1'b1 : (
+ (pd_state == PD_STATE_READ_COM) ? 1'b1 : (
+ (pd_state == PD_STATE_WRITE_LIVE) ? pd_out_ready : (
+ 1'b0)));
+
+ //inspect the incoming data and mark register booleans
+ always @(posedge clk)
+ if (com_inp_ready & com_inp_valid) begin
+ case(pd_dreg_count)
+ 0: begin
+ is_eth_dst_mac_bcast <= (com_inp_data[15:0] == 16'hffff);
+ end
+ 1: begin
+ is_eth_dst_mac_bcast <= is_eth_dst_mac_bcast && (com_inp_data[31:0] == 32'hffffffff);
+ end
+ 3: begin
+ is_eth_type_ipv4 <= (com_inp_data[15:0] == 16'h800);
+ end
+ 6: begin
+ is_eth_ipv4_proto_udp <= (com_inp_data[23:16] == 8'h11);
+ end
+ 8: begin
+ is_eth_ipv4_dst_addr_here <= (com_inp_data[31:0] == my_ip_addr);
+ end
+ 9: begin
+ is_eth_udp_dsp_port_here <= (com_inp_data[15:0] == dsp_udp_port);
+ is_eth_udp_ctl_port_here <= (com_inp_data[15:0] == ctl_udp_port);
+ end
+ endcase //pd_dreg_count
+ end
+
+ always @(posedge clk)
+ if(rst | clr) begin
+ pd_state <= PD_STATE_READ_COM_PRE;
+ pd_dreg_count <= 0;
+ end
+ else begin
+ case(pd_state)
+ PD_STATE_READ_COM_PRE: begin
+ if (com_inp_ready & com_inp_valid & com_inp_data[32]) begin
+ pd_state <= PD_STATE_READ_COM;
+ pd_dreg_count <= pd_dreg_count_next;
+ pd_dregs[pd_dreg_count] <= com_inp_data;
+ end
+ end
+
+ PD_STATE_READ_COM: begin
+ if (com_inp_ready & com_inp_valid) begin
+ pd_dregs[pd_dreg_count] <= com_inp_data;
+ if (pd_dreg_counter_done | com_inp_data[33]) begin
+ pd_state <= PD_STATE_WRITE_REGS;
+ pd_dreg_count <= 0;
+
+ //---------- begin inspection decision -----------//
+ //EOF or bcast or not IPv4 or not UDP:
+ if (
+ com_inp_data[33] || is_eth_dst_mac_bcast ||
+ ~is_eth_type_ipv4 || ~is_eth_ipv4_proto_udp
+ ) begin
+ pd_dest <= PD_DEST_BOF;
+ end
+
+ //not my IP address:
+ else if (~is_eth_ipv4_dst_addr_here) begin
+ pd_dest <= PD_DEST_EXT;
+ end
+
+ //UDP control port and VRT:
+ else if (is_eth_udp_ctl_port_here && ~is_vrt_size_zero) begin
+ pd_dest <= PD_DEST_CTL;
+ pd_dreg_count <= PD_DREGS_DSP_OFFSET;
+ end
+
+ //UDP data port and VRT:
+ else if (is_eth_udp_dsp_port_here && ~is_vrt_size_zero) begin
+ pd_dest <= PD_DEST_DSP;
+ pd_dreg_count <= PD_DREGS_DSP_OFFSET;
+ end
+
+ //other:
+ else begin
+ pd_dest <= PD_DEST_CPU;
+ end
+ //---------- end inspection decision -------------//
+
+ end
+ else begin
+ pd_dreg_count <= pd_dreg_count_next;
+ end
+ end
+ end
+
+ PD_STATE_WRITE_REGS: begin
+ if (pd_out_ready & pd_out_valid) begin
+ if (pd_out_data[33]) begin
+ pd_state <= PD_STATE_READ_COM_PRE;
+ pd_dreg_count <= 0;
+ end
+ else if (pd_dreg_counter_done) begin
+ pd_state <= PD_STATE_WRITE_LIVE;
+ pd_dreg_count <= 0;
+ end
+ else begin
+ pd_dreg_count <= pd_dreg_count_next;
+ end
+ end
+ end
+
+ PD_STATE_WRITE_LIVE: begin
+ if (pd_out_ready & pd_out_valid & pd_out_data[33]) begin
+ pd_state <= PD_STATE_READ_COM_PRE;
+ end
+ end
+
+ endcase //pd_state
+ end
+
+ //connect this fast-path signals directly to the DSP out
+ assign dsp_out_data = pd_out_dsp_data;
+ assign dsp_out_valid = pd_out_dsp_valid;
+ assign pd_out_dsp_ready = dsp_out_ready;
+
+ assign ctl_out_data = pd_out_ctl_data;
+ assign ctl_out_valid = pd_out_ctl_valid;
+ assign pd_out_ctl_ready = ctl_out_ready;
+
+ ////////////////////////////////////////////////////////////////////
+ // Splitter and output muxes for the bof packets
+ // - split the bof packets into two streams
+ // - mux split packets into cpu out and ext out
+ ////////////////////////////////////////////////////////////////////
+
+ //dummy signals to join the the splitter and muxes below
+ wire [35:0] _split_to_ext_data, _split_to_cpu_data;
+ wire _split_to_ext_valid, _split_to_cpu_valid;
+ wire _split_to_ext_ready, _split_to_cpu_ready;
+
+ splitter36 bof_out_splitter(
+ .clk(clk), .rst(rst), .clr(clr),
+ .inp_data(pd_out_bof_data), .inp_valid(pd_out_bof_valid), .inp_ready(pd_out_bof_ready),
+ .out0_data(_split_to_ext_data), .out0_valid(_split_to_ext_valid), .out0_ready(_split_to_ext_ready),
+ .out1_data(_split_to_cpu_data), .out1_valid(_split_to_cpu_valid), .out1_ready(_split_to_cpu_ready)
+ );
+
+ fifo36_mux ext_out_mux(
+ .clk(clk), .reset(rst), .clear(clr),
+ .data0_i(pd_out_ext_data), .src0_rdy_i(pd_out_ext_valid), .dst0_rdy_o(pd_out_ext_ready),
+ .data1_i(_split_to_ext_data), .src1_rdy_i(_split_to_ext_valid), .dst1_rdy_o(_split_to_ext_ready),
+ .data_o(ext_out_data), .src_rdy_o(ext_out_valid), .dst_rdy_i(ext_out_ready)
+ );
+
+ fifo36_mux cpu_out_mux(
+ .clk(clk), .reset(rst), .clear(clr),
+ .data0_i(pd_out_cpu_data), .src0_rdy_i(pd_out_cpu_valid), .dst0_rdy_o(pd_out_cpu_ready),
+ .data1_i(_split_to_cpu_data), .src1_rdy_i(_split_to_cpu_valid), .dst1_rdy_o(_split_to_cpu_ready),
+ .data_o(cpu_out_data), .src_rdy_o(cpu_out_valid), .dst_rdy_i(cpu_out_ready)
+ );
+
+endmodule // packet_dispatcher36_x3
diff --git a/fpga/usrp2/fifo/packet_padder36.v b/fpga/usrp2/fifo/packet_padder36.v
new file mode 100644
index 000000000..7197b5ea5
--- /dev/null
+++ b/fpga/usrp2/fifo/packet_padder36.v
@@ -0,0 +1,155 @@
+//
+// Copyright 2011-2012 Ettus Research LLC
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+// The packet padder 36 for use with RX VITA stream output.
+// Packet padder understands the concept of USB LUTs,
+// and will forward packets through the interface,
+// adding zero padding as needed to properly flush.
+// The padder will never write a packet across a LUT boundary.
+// When flushing, padder writes out zeros until the LUT boundary.
+// Requires that the input line0 be a VITA header, and SOF set.
+// Flush when the LUT is partially filled and timeout is reached,
+// or when the LUT is partially filled and the DSP is inactive.
+
+module packet_padder36
+#(
+ parameter BASE = 0,
+
+ //default is 16K LUT
+ parameter DEFAULT_LINES32 = 4096,
+
+ //default about 1ms at 64MHz clock
+ parameter DEFAULT_IDLE_CYC = 65536
+)
+(
+ input clk, input reset,
+
+ //setting bus
+ input set_stb, input [7:0] set_addr, input [31:0] set_data,
+
+ //input interface
+ input [35:0] data_i,
+ input src_rdy_i,
+ output dst_rdy_o,
+
+ //output interface
+ output [35:0] data_o,
+ output src_rdy_o,
+ input dst_rdy_i,
+
+ input always_flush
+);
+
+ wire lut_lines_changed;
+ wire [15:0] max_lut_lines32;
+ setting_reg #(.my_addr(BASE+0),.width(16),.at_reset(DEFAULT_LINES32)) sr_num_lines(
+ .clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr),.in(set_data),
+ .out(max_lut_lines32),.changed(lut_lines_changed));
+
+ wire idle_cyc_changed;
+ wire [17:0] idle_flush_cycles;
+ setting_reg #(.my_addr(BASE+1),.width(18),.at_reset(DEFAULT_IDLE_CYC)) sr_flush_cyc(
+ .clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr),.in(set_data),
+ .out(idle_flush_cycles),.changed(idle_cyc_changed));
+
+ //state machine definitions
+ localparam STATE_READ_HDR = 0;
+ localparam STATE_WRITE_HDR = 1;
+ localparam STATE_FORWARD = 2;
+ localparam STATE_WRITE_PAD = 3;
+ reg [1:0] state;
+
+ //keep track of the outgoing lines
+ reg [15:0] line_count;
+ wire line_count_done = line_count == 1;
+ wire lut_is_empty = line_count == max_lut_lines32;
+ always @(posedge clk) begin
+ if (reset || lut_lines_changed) begin
+ line_count <= max_lut_lines32;
+ end
+ else if (src_rdy_o && dst_rdy_i) begin
+ line_count <= (line_count_done)? max_lut_lines32 : line_count - 1;
+ end
+ end
+
+ //count the number of cycles since RX data so we can force a flush
+ reg [17:0] non_rx_cycles;
+ wire idle_timeout = (non_rx_cycles == idle_flush_cycles);
+ always @(posedge clk) begin
+ if(reset || state != STATE_READ_HDR || idle_cyc_changed) begin
+ non_rx_cycles <= 0;
+ end
+ else if (~idle_timeout) begin
+ non_rx_cycles <= non_rx_cycles + 1;
+ end
+ end
+
+ //flush when we have written data to a LUT and either idle or non active DSP
+ wire force_flush = ~lut_is_empty && (idle_timeout || always_flush);
+
+ //the padding state machine
+ reg [31:0] vita_hdr;
+ reg has_vita_hdr;
+ always @(posedge clk) begin
+ if (reset) begin
+ state <= STATE_READ_HDR;
+ end
+ else case(state)
+
+ STATE_READ_HDR: begin
+ if (src_rdy_i && dst_rdy_o && data_i[32]) begin
+ vita_hdr <= data_i[31:0];
+ has_vita_hdr <= 1;
+ state <= (data_i[15:0] > line_count)? state <= STATE_WRITE_PAD : STATE_WRITE_HDR;
+ end
+ else if (force_flush) begin
+ has_vita_hdr <= 0;
+ state <= STATE_WRITE_PAD;
+ end
+ end
+
+ STATE_WRITE_HDR: begin
+ if (src_rdy_o && dst_rdy_i) begin
+ state <= STATE_FORWARD;
+ end
+ end
+
+ STATE_FORWARD: begin
+ if (src_rdy_i && dst_rdy_o && data_i[33]) begin
+ state <= STATE_READ_HDR;
+ end
+ end
+
+ STATE_WRITE_PAD: begin
+ if (src_rdy_o && dst_rdy_i && line_count_done) begin
+ state <= (has_vita_hdr)? STATE_WRITE_HDR : STATE_READ_HDR;
+ end
+ end
+
+ endcase //state
+ end
+
+ //assign outgoing signals
+ assign dst_rdy_o = (state == STATE_READ_HDR)? 1 : ((state == STATE_FORWARD)? dst_rdy_i : 0);
+ assign src_rdy_o = (state == STATE_WRITE_HDR || state == STATE_WRITE_PAD)? 1 : ((state == STATE_FORWARD )? src_rdy_i : 0);
+ assign data_o = (state == STATE_WRITE_HDR)? {4'b0001, vita_hdr} : ((state == STATE_FORWARD)? data_i : 0);
+
+endmodule // packet_padder36
+
+
+
+
diff --git a/fpga/usrp2/fifo/packet_router.v b/fpga/usrp2/fifo/packet_router.v
index 7bfa6893d..4c0fe14b1 100644
--- a/fpga/usrp2/fifo/packet_router.v
+++ b/fpga/usrp2/fifo/packet_router.v
@@ -1,5 +1,5 @@
//
-// Copyright 2011 Ettus Research LLC
+// Copyright 2011-2012 Ettus Research LLC
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -54,10 +54,12 @@ module packet_router
input [35:0] dsp1_inp_data, input dsp1_inp_valid, output dsp1_inp_ready,
input [35:0] eth_inp_data, input eth_inp_valid, output eth_inp_ready,
input [35:0] err_inp_data, input err_inp_valid, output err_inp_ready,
+ input [35:0] ctl_inp_data, input ctl_inp_valid, output ctl_inp_ready,
// Output Interfaces (out of router)
output [35:0] ser_out_data, output ser_out_valid, input ser_out_ready,
output [35:0] dsp_out_data, output dsp_out_valid, input dsp_out_ready,
+ output [35:0] ctl_out_data, output ctl_out_valid, input ctl_out_ready,
output [35:0] eth_out_data, output eth_out_valid, input eth_out_ready
);
@@ -188,9 +190,9 @@ module packet_router
////////////////////////////////////////////////////////////////////
//dummy signals to join the the muxes below
- wire [35:0] _combiner0_data, _combiner1_data;
- wire _combiner0_valid, _combiner1_valid;
- wire _combiner0_ready, _combiner1_ready;
+ wire [35:0] _combiner0_data, _combiner1_data, _combiner2_data;
+ wire _combiner0_valid, _combiner1_valid, _combiner2_valid;
+ wire _combiner0_ready, _combiner1_ready, _combiner2_ready;
fifo36_mux #(.prio(0)) // No priority, fair sharing
_com_output_combiner0(
@@ -201,6 +203,14 @@ module packet_router
);
fifo36_mux #(.prio(0)) // No priority, fair sharing
+ _com_output_combiner2(
+ .clk(stream_clk), .reset(stream_rst), .clear(stream_clr),
+ .data0_i(_combiner0_data), .src0_rdy_i(_combiner0_valid), .dst0_rdy_o(_combiner0_ready),
+ .data1_i(ctl_inp_data), .src1_rdy_i(ctl_inp_valid), .dst1_rdy_o(ctl_inp_ready),
+ .data_o(_combiner2_data), .src_rdy_o(_combiner2_valid), .dst_rdy_i(_combiner2_ready)
+ );
+
+ fifo36_mux #(.prio(0)) // No priority, fair sharing
_com_output_combiner1(
.clk(stream_clk), .reset(stream_rst), .clear(stream_clr),
.data0_i(dsp0_inp_data), .src0_rdy_i(dsp0_inp_valid), .dst0_rdy_o(dsp0_inp_ready),
@@ -211,7 +221,7 @@ module packet_router
fifo36_mux #(.prio(1)) // Give priority to err/cpu over dsp
com_output_source(
.clk(stream_clk), .reset(stream_rst), .clear(stream_clr),
- .data0_i(_combiner0_data), .src0_rdy_i(_combiner0_valid), .dst0_rdy_o(_combiner0_ready),
+ .data0_i(_combiner2_data), .src0_rdy_i(_combiner2_valid), .dst0_rdy_o(_combiner2_ready),
.data1_i(_combiner1_data), .src1_rdy_i(_combiner1_valid), .dst1_rdy_o(_combiner1_ready),
.data_o(udp_out_data), .src_rdy_o(udp_out_valid), .dst_rdy_i(udp_out_ready)
);
@@ -248,12 +258,13 @@ module packet_router
wire _cpu_out_valid;
wire _cpu_out_ready;
- packet_dispatcher36_x3 #(.BASE(CTRL_BASE+1)) packet_dispatcher(
+ packet_dispatcher36_x4 #(.BASE(CTRL_BASE+1)) packet_dispatcher(
.clk(stream_clk), .rst(stream_rst), .clr(stream_clr),
.set_stb(set_stb), .set_addr(set_addr), .set_data(set_data),
.com_inp_data(com_inp_data), .com_inp_valid(com_inp_valid), .com_inp_ready(com_inp_ready),
.ext_out_data(ext_out_data), .ext_out_valid(ext_out_valid), .ext_out_ready(ext_out_ready),
.dsp_out_data(dsp_out_data), .dsp_out_valid(dsp_out_valid), .dsp_out_ready(dsp_out_ready),
+ .ctl_out_data(ctl_out_data), .ctl_out_valid(ctl_out_valid), .ctl_out_ready(ctl_out_ready),
.cpu_out_data(_cpu_out_data), .cpu_out_valid(_cpu_out_valid), .cpu_out_ready(_cpu_out_ready)
);
diff --git a/fpga/usrp2/gpif/Makefile.srcs b/fpga/usrp2/gpif/Makefile.srcs
index 06cde8afa..7909fb5ff 100644
--- a/fpga/usrp2/gpif/Makefile.srcs
+++ b/fpga/usrp2/gpif/Makefile.srcs
@@ -1,15 +1,13 @@
#
-# Copyright 2010 Ettus Research LLC
+# Copyright 2010-2012 Ettus Research LLC
#
##################################################
# SERDES Sources
##################################################
GPIF_SRCS = $(abspath $(addprefix $(BASE_DIR)/../gpif/, \
-gpif.v \
-gpif_wr.v \
-gpif_rd.v \
packet_reframer.v \
-packet_splitter.v \
slave_fifo.v \
+fifo36_to_gpmc16.v \
+gpmc16_to_fifo36.v \
))
diff --git a/fpga/usrp2/gpif/fifo36_to_gpmc16.v b/fpga/usrp2/gpif/fifo36_to_gpmc16.v
new file mode 100644
index 000000000..508cd319c
--- /dev/null
+++ b/fpga/usrp2/gpif/fifo36_to_gpmc16.v
@@ -0,0 +1,54 @@
+//
+// Copyright 2012 Ettus Research LLC
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+module fifo36_to_gpmc16
+#(
+ parameter FIFO_SIZE = 9
+)
+(
+ //input fifo interface
+ input fifo_clk, input fifo_rst,
+ input [35:0] in_data,
+ input in_src_rdy,
+ output in_dst_rdy,
+
+ //output interface
+ input gpif_clk, input gpif_rst,
+ output [15:0] out_data,
+ output valid,
+ input enable,
+ output eof
+);
+
+ wire [35:0] data_int;
+ wire src_rdy_int, dst_rdy_int;
+
+ fifo_2clock_cascade #(.WIDTH(36), .SIZE(FIFO_SIZE)) fifo_2clk
+ (.wclk(fifo_clk), .datain(in_data), .src_rdy_i(in_src_rdy), .dst_rdy_o(in_dst_rdy), .space(),
+ .rclk(gpif_clk), .dataout(data_int), .src_rdy_o(src_rdy_int), .dst_rdy_i(dst_rdy_int), .occupied(),
+ .arst(fifo_rst | gpif_rst));
+
+ wire [18:0] data18_int;
+ fifo36_to_fifo19 #(.LE(1)) f36_to_f19
+ (.clk(gpif_clk), .reset(gpif_rst), .clear(1'b0),
+ .f36_datain(data_int), .f36_src_rdy_i(src_rdy_int), .f36_dst_rdy_o(dst_rdy_int),
+ .f19_dataout(data18_int), .f19_src_rdy_o(valid), .f19_dst_rdy_i(enable) );
+
+ assign out_data = data18_int[15:0];
+ assign eof = data18_int[17];
+
+endmodule //fifo_to_gpmc16
diff --git a/fpga/usrp2/gpif/gpif.v b/fpga/usrp2/gpif/gpif.v
deleted file mode 100644
index e5b63d5a3..000000000
--- a/fpga/usrp2/gpif/gpif.v
+++ /dev/null
@@ -1,185 +0,0 @@
-//
-// Copyright 2011 Ettus Research LLC
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see <http://www.gnu.org/licenses/>.
-//
-
-//////////////////////////////////////////////////////////////////////////////////
-
-module gpif
- #(parameter TXFIFOSIZE = 11, parameter RXFIFOSIZE = 11)
- (// GPIF signals
- input gpif_clk, input gpif_rst,
- inout [15:0] gpif_d, input [3:0] gpif_ctl, output [3:0] gpif_rdy,
- output [2:0] gpif_misc,
-
- // Wishbone signals
- input wb_clk, input wb_rst,
- output [15:0] wb_adr_o, output [15:0] wb_dat_mosi, input [15:0] wb_dat_miso,
- output [1:0] wb_sel_o, output wb_cyc_o, output wb_stb_o, output wb_we_o, input wb_ack_i,
- input [7:0] triggers,
-
- // FIFO interface
- input fifo_clk, input fifo_rst, input clear_tx, input clear_rx,
- output [35:0] tx_data_o, output tx_src_rdy_o, input tx_dst_rdy_i,
- input [35:0] rx_data_i, input rx_src_rdy_i, output rx_dst_rdy_o,
- input [35:0] tx_err_data_i, input tx_err_src_rdy_i, output tx_err_dst_rdy_o,
-
- output tx_underrun, output rx_overrun,
- input [7:0] frames_per_packet,
- output [31:0] debug0, output [31:0] debug1
- );
-
- assign tx_underrun = 0;
- assign rx_overrun = 0;
-
- wire WR = gpif_ctl[0];
- wire RD = gpif_ctl[1];
- wire OE = gpif_ctl[2];
- wire EP = gpif_ctl[3];
-
- wire CF, CE, DF, DE;
-
- assign gpif_rdy = { CF, CE, DF, DE };
-
- wire [15:0] gpif_d_out;
- assign gpif_d = OE ? gpif_d_out : 16'bz;
-
- wire [15:0] gpif_d_copy = gpif_d;
-
- wire [31:0] debug_rd, debug_wr, debug_split0, debug_split1;
-
- // ////////////////////////////////////////////////////////////////////
- // TX Data Path
-
- wire [18:0] tx19_data;
- wire tx19_src_rdy, tx19_dst_rdy;
- wire [35:0] tx36_data;
- wire tx36_src_rdy, tx36_dst_rdy;
-
- wire [18:0] ctrl_data;
- wire ctrl_src_rdy, ctrl_dst_rdy;
-
- gpif_wr gpif_wr
- (.gpif_clk(gpif_clk), .gpif_rst(gpif_rst),
- .gpif_data(gpif_d), .gpif_wr(WR), .gpif_ep(EP),
- .gpif_full_d(DF), .gpif_full_c(CF),
-
- .sys_clk(fifo_clk), .sys_rst(fifo_rst),
- .data_o(tx19_data), .src_rdy_o(tx19_src_rdy), .dst_rdy_i(tx19_dst_rdy),
- .ctrl_o(ctrl_data), .ctrl_src_rdy_o(ctrl_src_rdy), .ctrl_dst_rdy_i(ctrl_dst_rdy),
- .debug(debug_wr) );
-
- // join vita packets which are longer than one frame, drop frame padding
- wire [18:0] refr_data;
- wire refr_src_rdy, refr_dst_rdy;
-
- packet_reframer tx_packet_reframer
- (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_tx),
- .data_i(tx19_data), .src_rdy_i(tx19_src_rdy), .dst_rdy_o(tx19_dst_rdy),
- .data_o(refr_data), .src_rdy_o(refr_src_rdy), .dst_rdy_i(refr_dst_rdy));
-
- fifo19_to_fifo36 #(.LE(1)) f19_to_f36
- (.clk(fifo_clk), .reset(fifo_rst), .clear(0),
- .f19_datain(refr_data), .f19_src_rdy_i(refr_src_rdy), .f19_dst_rdy_o(refr_dst_rdy),
- .f36_dataout(tx36_data), .f36_src_rdy_o(tx36_src_rdy), .f36_dst_rdy_i(tx36_dst_rdy));
-
- fifo_cascade #(.WIDTH(36), .SIZE(TXFIFOSIZE)) tx_fifo36
- (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_tx),
- .datain(tx36_data), .src_rdy_i(tx36_src_rdy), .dst_rdy_o(tx36_dst_rdy),
- .dataout(tx_data_o), .src_rdy_o(tx_src_rdy_o), .dst_rdy_i(tx_dst_rdy_i));
-
- // ////////////////////////////////////////////
- // RX Data Path
-
- wire [35:0] rx36_data;
- wire rx36_src_rdy, rx36_dst_rdy;
- wire [18:0] rx19_data, splt_data;
- wire rx19_src_rdy, rx19_dst_rdy, splt_src_rdy, splt_dst_rdy;
- wire [18:0] resp_data, resp_int1, resp_int2;
- wire resp_src_rdy, resp_dst_rdy;
- wire resp_src_rdy_int1, resp_dst_rdy_int1, resp_src_rdy_int2, resp_dst_rdy_int2;
-
- fifo_cascade #(.WIDTH(36), .SIZE(RXFIFOSIZE)) rx_fifo36
- (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_rx),
- .datain(rx_data_i), .src_rdy_i(rx_src_rdy_i), .dst_rdy_o(rx_dst_rdy_o),
- .dataout(rx36_data), .src_rdy_o(rx36_src_rdy), .dst_rdy_i(rx36_dst_rdy));
-
- fifo36_to_fifo19 #(.LE(1)) f36_to_f19
- (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_rx),
- .f36_datain(rx36_data), .f36_src_rdy_i(rx36_src_rdy), .f36_dst_rdy_o(rx36_dst_rdy),
- .f19_dataout(rx19_data), .f19_src_rdy_o(rx19_src_rdy), .f19_dst_rdy_i(rx19_dst_rdy) );
-
- packet_splitter #(.FRAME_LEN(256)) packet_splitter
- (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_rx),
- .frames_per_packet(frames_per_packet),
- .data_i(rx19_data), .src_rdy_i(rx19_src_rdy), .dst_rdy_o(rx19_dst_rdy),
- .data_o(splt_data), .src_rdy_o(splt_src_rdy), .dst_rdy_i(splt_dst_rdy),
- .debug0(debug_split0), .debug1(debug_split1));
-
- gpif_rd gpif_rd
- (.gpif_clk(gpif_clk), .gpif_rst(gpif_rst),
- .gpif_data(gpif_d_out), .gpif_rd(RD), .gpif_ep(EP),
- .gpif_empty_d(DE), .gpif_empty_c(CE), .gpif_flush(gpif_misc[0]),
-
- .sys_clk(fifo_clk), .sys_rst(fifo_rst),
- .data_i(splt_data), .src_rdy_i(splt_src_rdy), .dst_rdy_o(splt_dst_rdy),
- .resp_i(resp_data), .resp_src_rdy_i(resp_src_rdy), .resp_dst_rdy_o(resp_dst_rdy),
- .debug(debug_rd) );
-
- // ////////////////////////////////////////////////////////////////////
- // FIFO to Wishbone interface
-
- fifo_to_wb fifo_to_wb
- (.clk(fifo_clk), .reset(fifo_rst), .clear(0),
- .data_i(ctrl_data), .src_rdy_i(ctrl_src_rdy), .dst_rdy_o(ctrl_dst_rdy),
- .data_o(resp_int1), .src_rdy_o(resp_src_rdy_int1), .dst_rdy_i(resp_dst_rdy_int1),
- .wb_adr_o(wb_adr_o), .wb_dat_mosi(wb_dat_mosi), .wb_dat_miso(wb_dat_miso), .wb_sel_o(wb_sel_o),
- .wb_cyc_o(wb_cyc_o), .wb_stb_o(wb_stb_o), .wb_we_o(wb_we_o), .wb_ack_i(wb_ack_i),
- .triggers(triggers),
- .debug0(), .debug1());
-
- wire [18:0] tx_err19_data;
- wire tx_err19_src_rdy, tx_err19_dst_rdy;
-
- fifo36_to_fifo19 #(.LE(1)) f36_to_f19_txerr
- (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_rx),
- .f36_datain(tx_err_data_i), .f36_src_rdy_i(tx_err_src_rdy_i), .f36_dst_rdy_o(tx_err_dst_rdy_o),
- .f19_dataout(tx_err19_data), .f19_src_rdy_o(tx_err19_src_rdy), .f19_dst_rdy_i(tx_err19_dst_rdy) );
-
- fifo19_mux #(.prio(0)) mux_err_stream
- (.clk(wb_clk), .reset(wb_rst), .clear(0),
- .data0_i(resp_int1), .src0_rdy_i(resp_src_rdy_int1), .dst0_rdy_o(resp_dst_rdy_int1),
- .data1_i(tx_err19_data), .src1_rdy_i(tx_err19_src_rdy), .dst1_rdy_o(tx_err19_dst_rdy),
- .data_o(resp_int2), .src_rdy_o(resp_src_rdy_int2), .dst_rdy_i(resp_dst_rdy_int2));
-
- fifo19_pad #(.LENGTH(16)) fifo19_pad
- (.clk(fifo_clk), .reset(fifo_rst), .clear(0),
- .data_i(resp_int2), .src_rdy_i(resp_src_rdy_int2), .dst_rdy_o(resp_dst_rdy_int2),
- .data_o(resp_data), .src_rdy_o(resp_src_rdy), .dst_rdy_i(resp_dst_rdy));
-
- // ////////////////////////////////////////////
- // DEBUG
-
- //assign debug0 = { rx19_src_rdy, rx19_dst_rdy, resp_src_rdy, resp_dst_rdy, gpif_ctl[3:0], gpif_rdy[3:0],
- // gpif_d_copy[15:0] };
-
- //assign debug1 = { { debug_rd[15:8] },
- // { debug_rd[7:0] },
- // { rx_src_rdy_i, rx_dst_rdy_o, rx36_src_rdy, rx36_dst_rdy, rx19_src_rdy, rx19_dst_rdy, resp_src_rdy, resp_dst_rdy},
- // { tx_src_rdy_o, tx_dst_rdy_i, tx19_src_rdy, tx19_dst_rdy, tx36_src_rdy, tx36_dst_rdy, ctrl_src_rdy, ctrl_dst_rdy} };
-
- assign debug0 = { gpif_ctl[3:0], gpif_rdy[3:0], debug_split0[23:0] };
- assign debug1 = { gpif_misc[0], debug_rd[14:0], debug_split1[15:8], debug_split1[7:0] };
-endmodule // gpif
diff --git a/fpga/usrp2/gpif/gpif_rd.v b/fpga/usrp2/gpif/gpif_rd.v
deleted file mode 100644
index b05c3cfb6..000000000
--- a/fpga/usrp2/gpif/gpif_rd.v
+++ /dev/null
@@ -1,111 +0,0 @@
-//
-// Copyright 2011 Ettus Research LLC
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see <http://www.gnu.org/licenses/>.
-//
-
-
-module gpif_rd
- (input gpif_clk, input gpif_rst,
- output [15:0] gpif_data, input gpif_rd, input gpif_ep,
- output reg gpif_empty_d, output reg gpif_empty_c,
- output reg gpif_flush,
-
- input sys_clk, input sys_rst,
- input [18:0] data_i, input src_rdy_i, output dst_rdy_o,
- input [18:0] resp_i, input resp_src_rdy_i, output resp_dst_rdy_o,
- output [31:0] debug
- );
-
- wire [18:0] data_o; // occ bit indicates flush
- wire [17:0] resp_o; // no occ bit
- wire final_rdy_data, final_rdy_resp;
-
- // 33/257 Bug Fix
- reg [8:0] read_count;
- always @(negedge gpif_clk)
- if(gpif_rst)
- read_count <= 0;
- else if(gpif_rd)
- read_count <= read_count + 1;
- else
- read_count <= 0;
-
- // Data Path
- wire [18:0] data_int;
- wire src_rdy_int, dst_rdy_int;
- fifo_2clock_cascade #(.WIDTH(19), .SIZE(4)) rd_fifo_2clk
- (.wclk(sys_clk), .datain(data_i[18:0]), .src_rdy_i(src_rdy_i), .dst_rdy_o(dst_rdy_o), .space(),
- .rclk(~gpif_clk), .dataout(data_int), .src_rdy_o(src_rdy_int), .dst_rdy_i(dst_rdy_int), .occupied(),
- .arst(sys_rst));
-
- reg [7:0] packet_count;
- wire consume_data_line = gpif_rd & ~gpif_ep & ~read_count[8];
- wire produce_eop = src_rdy_int & dst_rdy_int & data_int[17];
- wire consume_sop = consume_data_line & final_rdy_data & data_o[16];
- wire consume_eop = consume_data_line & final_rdy_data & data_o[17];
-
- fifo_cascade #(.WIDTH(19), .SIZE(10)) rd_fifo
- (.clk(~gpif_clk), .reset(gpif_rst), .clear(0),
- .datain(data_int), .src_rdy_i(src_rdy_int), .dst_rdy_o(dst_rdy_int), .space(),
- .dataout(data_o), .src_rdy_o(final_rdy_data), .dst_rdy_i(consume_data_line), .occupied());
-
- always @(negedge gpif_clk)
- if(gpif_rst)
- packet_count <= 0;
- else
- if(produce_eop & ~consume_sop)
- packet_count <= packet_count + 1;
- else if(consume_sop & ~produce_eop)
- packet_count <= packet_count - 1;
-
- always @(negedge gpif_clk)
- if(gpif_rst)
- gpif_empty_d <= 1;
- else
- gpif_empty_d <= ~|packet_count;
-
- // Use occ bit to signal a gpif flush
- always @(negedge gpif_clk)
- if(gpif_rst)
- gpif_flush <= 0;
- else if(consume_eop & data_o[18])
- gpif_flush <= ~gpif_flush;
-
- // Response Path
- wire [15:0] resp_fifolevel;
- wire consume_resp_line = gpif_rd & gpif_ep & ~read_count[4];
-
- fifo_2clock_cascade #(.WIDTH(18), .SIZE(4)) resp_fifo_2clk
- (.wclk(sys_clk), .datain(resp_i[17:0]), .src_rdy_i(resp_src_rdy_i), .dst_rdy_o(resp_dst_rdy_o), .space(),
- .rclk(~gpif_clk), .dataout(resp_o),
- .src_rdy_o(final_rdy_resp), .dst_rdy_i(consume_resp_line), .occupied(resp_fifolevel),
- .arst(sys_rst));
-
- // FIXME -- handle short packets
-
- always @(negedge gpif_clk)
- if(gpif_rst)
- gpif_empty_c <= 1;
- else
- gpif_empty_c <= resp_fifolevel < 16;
-
- // Output Mux
- assign gpif_data = gpif_ep ? resp_o[15:0] : data_o[15:0];
-
- assign debug = { { 16'd0 },
- { data_int[17:16], data_o[17:16], packet_count[3:0] },
- { consume_sop, consume_eop, final_rdy_data, data_o[18], consume_data_line, consume_resp_line, src_rdy_int, dst_rdy_int} };
-
-endmodule // gpif_rd
diff --git a/fpga/usrp2/gpif/gpif_tb.v b/fpga/usrp2/gpif/gpif_tb.v
deleted file mode 100644
index 686284c2b..000000000
--- a/fpga/usrp2/gpif/gpif_tb.v
+++ /dev/null
@@ -1,142 +0,0 @@
-//
-// Copyright 2011 Ettus Research LLC
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see <http://www.gnu.org/licenses/>.
-//
-
-
-module gpif_tb();
-
- reg sys_clk = 0;
- reg sys_rst = 1;
- reg gpif_clk = 0;
- reg gpif_rst = 1;
-
- reg [15:0] gpif_data;
- reg WR = 0, EP = 0;
-
- wire CF, DF;
-
- wire gpif_full_d, gpif_full_c;
- wire [18:0] data_o, ctrl_o, data_splt;
- wire src_rdy, dst_rdy, src_rdy_splt, dst_rdy_splt;
- wire ctrl_src_rdy, ctrl_dst_rdy;
-
- assign ctrl_dst_rdy = 1;
-
- initial $dumpfile("gpif_tb.vcd");
- initial $dumpvars(0,gpif_tb);
-
- initial #1000 gpif_rst = 0;
- initial #1000 sys_rst = 0;
- always #64 gpif_clk <= ~gpif_clk;
- always #47.9 sys_clk <= ~sys_clk;
-
- wire [18:0] data_int;
- wire src_rdy_int, dst_rdy_int;
-
- assign dst_rdy_splt = 1;
-
- gpif_wr gpif_write
- (.gpif_clk(gpif_clk), .gpif_rst(gpif_rst),
- .gpif_data(gpif_data), .gpif_wr(WR), .gpif_ep(EP),
- .gpif_full_d(DF), .gpif_full_c(CF),
-
- .sys_clk(sys_clk), .sys_rst(sys_rst),
- .data_o(data_int), .src_rdy_o(src_rdy_int), .dst_rdy_i(dst_rdy_int),
- .ctrl_o(ctrl_o), .ctrl_src_rdy_o(ctrl_src_rdy), .ctrl_dst_rdy_i(ctrl_dst_rdy) );
-
- packet_reframer tx_packet_reframer
- (.clk(sys_clk), .reset(sys_rst), .clear(0),
- .data_i(data_int), .src_rdy_i(src_rdy_int), .dst_rdy_o(dst_rdy_int),
- .data_o(data_o), .src_rdy_o(src_rdy), .dst_rdy_i(dst_rdy));
-
- packet_splitter #(.FRAME_LEN(256)) rx_packet_splitter
- (.clk(sys_clk), .reset(sys_rst), .clear(0),
- .frames_per_packet(2),
- .data_i(data_o), .src_rdy_i(src_rdy), .dst_rdy_o(dst_rdy),
- .data_o(data_splt), .src_rdy_o(src_rdy_splt), .dst_rdy_i(dst_rdy_splt));
-
- always @(posedge sys_clk)
- if(ctrl_src_rdy & ctrl_dst_rdy)
- $display("CTRL: %x",ctrl_o);
-
- always @(posedge sys_clk)
- if(src_rdy_splt & dst_rdy_splt)
- begin
- if(data_splt[16])
- $display("<-------- DATA SOF--------->");
- $display("DATA: %x",data_splt);
- if(data_splt[17])
- $display("<-------- DATA EOF--------->");
- end
-
- initial
- begin
- #10000;
- repeat (1)
- begin
- @(posedge gpif_clk);
-
- WR <= 1;
- gpif_data <= 256; // Length
- @(posedge gpif_clk);
- gpif_data <= 16'h00;
- @(posedge gpif_clk);
- repeat(254)
- begin
- gpif_data <= gpif_data + 1;
- @(posedge gpif_clk);
- end
- WR <= 0;
-
- while(DF)
- @(posedge gpif_clk);
- repeat (16)
- @(posedge gpif_clk);
-
- WR <= 1;
- repeat(256)
- begin
- gpif_data <= gpif_data - 1;
- @(posedge gpif_clk);
- end
- WR <= 0;
-
-
-/*
- while(DF)
- @(posedge gpif_clk);
-
- repeat (20)
- @(posedge gpif_clk);
- WR <= 1;
- gpif_data <= 16'h5;
- @(posedge gpif_clk);
- gpif_data <= 16'h00;
- @(posedge gpif_clk);
- repeat(254)
- begin
- gpif_data <= gpif_data - 1;
- @(posedge gpif_clk);
- end
- WR <= 0;
- */
- end
- end // initial begin
-
- initial #200000 $finish;
-
-
-endmodule // gpif_tb
diff --git a/fpga/usrp2/gpif/gpif_wr.v b/fpga/usrp2/gpif/gpif_wr.v
deleted file mode 100644
index 89fae282e..000000000
--- a/fpga/usrp2/gpif/gpif_wr.v
+++ /dev/null
@@ -1,95 +0,0 @@
-//
-// Copyright 2011 Ettus Research LLC
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see <http://www.gnu.org/licenses/>.
-//
-
-
-module gpif_wr
- (input gpif_clk, input gpif_rst,
- input [15:0] gpif_data, input gpif_wr, input gpif_ep,
- output reg gpif_full_d, output reg gpif_full_c,
-
- input sys_clk, input sys_rst,
- output [18:0] data_o, output src_rdy_o, input dst_rdy_i,
- output [18:0] ctrl_o, output ctrl_src_rdy_o, input ctrl_dst_rdy_i,
- output [31:0] debug );
-
- reg wr_reg, ep_reg;
- reg [15:0] gpif_data_reg;
-
- always @(posedge gpif_clk)
- begin
- ep_reg <= gpif_ep;
- wr_reg <= gpif_wr;
- gpif_data_reg <= gpif_data;
- end
-
- reg [9:0] write_count;
-
- always @(posedge gpif_clk)
- if(gpif_rst)
- write_count <= 0;
- else if(wr_reg)
- write_count <= write_count + 1;
- else
- write_count <= 0;
-
- reg sop;
- wire eop = (write_count == 255);
- wire eop_ctrl = (write_count == 15);
-
- always @(posedge gpif_clk)
- sop <= gpif_wr & ~wr_reg;
-
- // Data Path
- wire [15:0] fifo_space;
- always @(posedge gpif_clk)
- if(gpif_rst)
- gpif_full_d <= 1;
- else
- gpif_full_d <= fifo_space < 256;
-
- wire [17:0] data_int;
- wire src_rdy_int, dst_rdy_int;
-
- fifo_cascade #(.WIDTH(18), .SIZE(10)) wr_fifo
- (.clk(gpif_clk), .reset(gpif_rst), .clear(0),
- .datain({eop,sop,gpif_data_reg}), .src_rdy_i(~ep_reg & wr_reg & ~write_count[8]), .dst_rdy_o(), .space(fifo_space),
- .dataout(data_int), .src_rdy_o(src_rdy_int), .dst_rdy_i(dst_rdy_int), .occupied());
-
- fifo_2clock_cascade #(.WIDTH(18), .SIZE(4)) wr_fifo_2clk
- (.wclk(gpif_clk), .datain(data_int), .src_rdy_i(src_rdy_int), .dst_rdy_o(dst_rdy_int), .space(),
- .rclk(sys_clk), .dataout(data_o[17:0]), .src_rdy_o(src_rdy_o), .dst_rdy_i(dst_rdy_i), .occupied(),
- .arst(sys_rst));
- assign data_o[18] = 1'b0;
-
- // Control Path
- wire [15:0] ctrl_fifo_space;
- always @(posedge gpif_clk)
- if(gpif_rst)
- gpif_full_c <= 1;
- else
- gpif_full_c <= ctrl_fifo_space < 16;
-
- fifo_2clock_cascade #(.WIDTH(19), .SIZE(4)) ctrl_fifo_2clk
- (.wclk(gpif_clk), .datain({1'b0,eop_ctrl,sop,gpif_data_reg}),
- .src_rdy_i(ep_reg & wr_reg & ~write_count[4]), .dst_rdy_o(), .space(ctrl_fifo_space),
- .rclk(sys_clk), .dataout(ctrl_o[18:0]),
- .src_rdy_o(ctrl_src_rdy_o), .dst_rdy_i(ctrl_dst_rdy_i), .occupied(),
- .arst(sys_rst));
-
- assign debug = { 16'd0, ep_reg, wr_reg, eop, sop, (~ep_reg & wr_reg & ~write_count[8]), src_rdy_int, dst_rdy_int, write_count[8:0]};
-
-endmodule // gpif_wr
diff --git a/fpga/usrp2/gpif/gpif_wr_tb.v b/fpga/usrp2/gpif/gpif_wr_tb.v
deleted file mode 100644
index 171bb96a1..000000000
--- a/fpga/usrp2/gpif/gpif_wr_tb.v
+++ /dev/null
@@ -1,110 +0,0 @@
-//
-// Copyright 2011 Ettus Research LLC
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see <http://www.gnu.org/licenses/>.
-//
-
-
-module gpif_wr_tb();
-
- reg sys_clk = 0;
- reg sys_rst = 1;
- reg gpif_clk = 0;
- reg gpif_rst = 1;
-
- reg [15:0] gpif_data;
- reg WR = 0, EP = 0;
-
- wire CF, DF;
-
- wire gpif_full_d, gpif_full_c;
- wire [18:0] data_o, ctrl_o;
- wire src_rdy, dst_rdy;
- wire ctrl_src_rdy, ctrl_dst_rdy;
-
- assign ctrl_dst_rdy = 1;
- assign dst_rdy = 1;
-
- initial $dumpfile("gpif_wr_tb.vcd");
- initial $dumpvars(0,gpif_wr_tb);
-
- initial #1000 gpif_rst = 0;
- initial #1000 sys_rst = 0;
- always #64 gpif_clk <= ~gpif_clk;
- always #47.9 sys_clk <= ~sys_clk;
-
- wire [18:0] data_int;
- wire src_rdy_int, dst_rdy_int;
-
- gpif_wr gpif_write
- (.gpif_clk(gpif_clk), .gpif_rst(gpif_rst),
- .gpif_data(gpif_data), .gpif_wr(WR), .gpif_ep(EP),
- .gpif_full_d(DF), .gpif_full_c(CF),
-
- .sys_clk(sys_clk), .sys_rst(sys_rst),
- .data_o(data_int), .src_rdy_o(src_rdy_int), .dst_rdy_i(dst_rdy_int),
- .ctrl_o(ctrl_o), .ctrl_src_rdy_o(ctrl_src_rdy), .ctrl_dst_rdy_i(ctrl_dst_rdy) );
-
- packet_reframer tx_packet_reframer
- (.clk(sys_clk), .reset(sys_rst), .clear(0),
- .data_i(data_int), .src_rdy_i(src_rdy_int), .dst_rdy_o(dst_rdy_int),
- .data_o(data_o), .src_rdy_o(src_rdy), .dst_rdy_i(dst_rdy));
-
- always @(posedge sys_clk)
- if(ctrl_src_rdy & ctrl_dst_rdy)
- $display("CTRL: %x",ctrl_o);
-
- always @(posedge sys_clk)
- if(src_rdy & dst_rdy)
- begin
- if(data_o[16])
- $display("<-------- DATA SOF--------->");
- $display("DATA: %x",data_o);
- if(data_o[17])
- $display("<-------- DATA EOF--------->");
- end
-
- initial
- begin
- #10000;
- repeat (1)
- begin
- WR <= 1;
- gpif_data <= 10; // Length
- @(posedge gpif_clk);
- gpif_data <= 16'h00;
- @(posedge gpif_clk);
- repeat(254)
- begin
- gpif_data <= gpif_data + 1;
- @(posedge gpif_clk);
- end
- WR <= 0;
- repeat (20)
- @(posedge gpif_clk);
- WR <= 1;
- gpif_data <= 16'h5;
- @(posedge gpif_clk);
- repeat(254)
- begin
- gpif_data <= gpif_data - 1;
- @(posedge gpif_clk);
- end
- end
- end // initial begin
-
- initial #100000 $finish;
-
-
-endmodule // gpif_wr_tb
diff --git a/fpga/usrp2/gpif/gpmc16_to_fifo36.v b/fpga/usrp2/gpif/gpmc16_to_fifo36.v
new file mode 100644
index 000000000..933891715
--- /dev/null
+++ b/fpga/usrp2/gpif/gpmc16_to_fifo36.v
@@ -0,0 +1,64 @@
+//
+// Copyright 2012 Ettus Research LLC
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+module gpmc16_to_fifo36
+#(
+ parameter FIFO_SIZE = 9,
+
+ //not ready until minimum xfers of space available
+ parameter MIN_SPACE16 = 128
+)
+(
+ //input interface
+ input gpif_clk, input gpif_rst,
+ input [15:0] in_data,
+ input valid,
+ output reg ready,
+
+ //output fifo interface
+ input fifo_clk, input fifo_rst,
+ output [35:0] out_data,
+ output out_src_rdy,
+ input out_dst_rdy
+);
+
+ wire [35:0] data_int;
+ wire src_rdy_int, dst_rdy_int;
+ wire [18:0] refr_data;
+ wire refr_src_rdy, refr_dst_rdy;
+
+ wire [15:0] fifo_space;
+
+ always @(posedge gpif_clk)
+ ready <= (fifo_space >= MIN_SPACE16/2);
+
+ packet_reframer packet_reframer
+ (.clk(gpif_clk), .reset(gpif_rst), .clear(1'b0),
+ .data_i(in_data), .src_rdy_i(valid), .dst_rdy_o(),
+ .data_o(refr_data), .src_rdy_o(refr_src_rdy), .dst_rdy_i(refr_dst_rdy));
+
+ fifo19_to_fifo36 #(.LE(1)) f19_to_f36
+ (.clk(gpif_clk), .reset(gpif_rst), .clear(1'b0),
+ .f19_datain(refr_data), .f19_src_rdy_i(refr_src_rdy), .f19_dst_rdy_o(refr_dst_rdy),
+ .f36_dataout(data_int), .f36_src_rdy_o(src_rdy_int), .f36_dst_rdy_i(dst_rdy_int));
+
+ fifo_2clock_cascade #(.WIDTH(36), .SIZE(FIFO_SIZE)) fifo_2clk
+ (.wclk(gpif_clk), .datain(data_int), .src_rdy_i(src_rdy_int), .dst_rdy_o(dst_rdy_int), .space(fifo_space),
+ .rclk(fifo_clk), .dataout(out_data), .src_rdy_o(out_src_rdy), .dst_rdy_i(out_dst_rdy), .occupied(),
+ .arst(fifo_rst | gpif_rst));
+
+endmodule //fifo_to_gpmc16
diff --git a/fpga/usrp2/gpif/lint b/fpga/usrp2/gpif/lint
deleted file mode 100755
index 4316c89a9..000000000
--- a/fpga/usrp2/gpif/lint
+++ /dev/null
@@ -1,2 +0,0 @@
-iverilog -Wall -y . -y ../fifo/ -y ../control_lib/ -y ../models/ -y ../coregen/ -y ../simple_gemac/ -y ../sdr_lib/ -y ../vrt/ gpif.v 2>&1 | grep -v coregen | grep -v models
-
diff --git a/fpga/usrp2/gpif/packet_splitter.v b/fpga/usrp2/gpif/packet_splitter.v
deleted file mode 100644
index ba4c8cded..000000000
--- a/fpga/usrp2/gpif/packet_splitter.v
+++ /dev/null
@@ -1,123 +0,0 @@
-//
-// Copyright 2011 Ettus Research LLC
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see <http://www.gnu.org/licenses/>.
-//
-
-
-// Split vita packets longer than one GPIF frame, add padding on short frames
-
-module packet_splitter
- #(parameter FRAME_LEN=256)
- (input clk, input reset, input clear,
- input [7:0] frames_per_packet,
- input [18:0] data_i,
- input src_rdy_i,
- output dst_rdy_o,
- output [18:0] data_o,
- output src_rdy_o,
- input dst_rdy_i,
- output [31:0] debug0,
- output [31:0] debug1);
-
- reg [1:0] state;
- reg [15:0] length;
- reg [15:0] frame_len;
- reg [7:0] frame_count;
-
- localparam PS_IDLE = 0;
- localparam PS_FRAME = 1;
- localparam PS_NEW_FRAME = 2;
- localparam PS_PAD = 3;
-
- wire eof_i = data_i[17];
-
- always @(posedge clk)
- if(reset | clear)
- begin
- state <= PS_IDLE;
- frame_count <= 0;
- end
- else
- case(state)
- PS_IDLE :
- if(src_rdy_i & dst_rdy_i)
- begin
- length <= { data_i[14:0],1'b0};
- frame_len <= FRAME_LEN;
- state <= PS_FRAME;
- frame_count <= 1;
- end
- PS_FRAME :
- if(src_rdy_i & dst_rdy_i)
- if((frame_len == 2) & ((length == 2) | eof_i))
- state <= PS_IDLE;
- else if(frame_len == 2)
- begin
- length <= length - 1;
- state <= PS_NEW_FRAME;
- frame_count <= frame_count + 1;
- end
- else if((length == 2)|eof_i)
- begin
- frame_len <= frame_len - 1;
- state <= PS_PAD;
- end
- else
- begin
- frame_len <= frame_len - 1;
- length <= length - 1;
- end
- PS_NEW_FRAME :
- if(src_rdy_i & dst_rdy_i)
- begin
- frame_len <= FRAME_LEN;
- if((length == 2)|eof_i)
- state <= PS_PAD;
- else
- begin
- state <= PS_FRAME;
- length <= length - 1;
- end // else: !if((length == 2)|eof_i)
- end // if (src_rdy_i & dst_rdy_i)
-
- PS_PAD :
- if(dst_rdy_i)
- if(frame_len == 2)
- state <= PS_IDLE;
- else
- frame_len <= frame_len - 1;
-
- endcase // case (state)
-
- wire next_state_is_idle = dst_rdy_i & (frame_len==2) &
- ( (state==PS_PAD) | ( (state==PS_FRAME) & src_rdy_i & ((length==2)|eof_i) ) );
-
-
-
-
- assign dst_rdy_o = dst_rdy_i & (state != PS_PAD);
- assign src_rdy_o = src_rdy_i | (state == PS_PAD);
-
- wire eof_out = (frame_len == 2) & (state != PS_IDLE) & (state != PS_NEW_FRAME);
- wire sof_out = (state == PS_IDLE) | (state == PS_NEW_FRAME);
- wire occ_out = eof_out & next_state_is_idle & (frames_per_packet != frame_count);
-
- wire [15:0] data_out = data_i[15:0];
- assign data_o = {occ_out, eof_out, sof_out, data_out};
-
- assign debug0 = { 8'd0, dst_rdy_o, src_rdy_o, next_state_is_idle, eof_out, sof_out, occ_out, state[1:0], frame_count[7:0], frames_per_packet[7:0] };
- assign debug1 = { length[15:0], frame_len[15:0] };
-
-endmodule // packet_splitter
diff --git a/fpga/usrp2/gpif/packet_splitter_tb.v b/fpga/usrp2/gpif/packet_splitter_tb.v
deleted file mode 100644
index 329b58e0d..000000000
--- a/fpga/usrp2/gpif/packet_splitter_tb.v
+++ /dev/null
@@ -1,137 +0,0 @@
-//
-// Copyright 2011 Ettus Research LLC
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see <http://www.gnu.org/licenses/>.
-//
-
-
-module packet_splitter_tb();
-
- reg sys_clk = 0;
- reg sys_rst = 1;
- reg gpif_clk = 0;
- reg gpif_rst = 1;
-
- reg [15:0] gpif_data;
- reg WR = 0, EP = 0;
-
- wire CF, DF;
-
- wire gpif_full_d, gpif_full_c;
- wire [18:0] data_o, ctrl_o, data_splt;
- wire src_rdy, dst_rdy, src_rdy_splt, dst_rdy_splt;
- wire ctrl_src_rdy, ctrl_dst_rdy;
-
- assign ctrl_dst_rdy = 1;
-
- initial $dumpfile("packet_splitter_tb.vcd");
- initial $dumpvars(0,packet_splitter_tb);
-
- initial #1000 gpif_rst = 0;
- initial #1000 sys_rst = 0;
- always #64 gpif_clk <= ~gpif_clk;
- always #47.9 sys_clk <= ~sys_clk;
-
- wire [35:0] data_int;
- wire src_rdy_int, dst_rdy_int;
-
- assign dst_rdy_splt = 1;
-
- vita_pkt_gen vita_pkt_gen
- (.clk(sys_clk), .reset(sys_rst) , .clear(0),
- .len(512),.data_o(data_int), .src_rdy_o(src_rdy_int), .dst_rdy_i(dst_rdy_int));
-
- fifo36_to_fifo19 #(.LE(1)) f36_to_f19
- (.clk(sys_clk), .reset(sys_rst), .clear(0),
- .f36_datain(data_int), .f36_src_rdy_i(src_rdy_int), .f36_dst_rdy_o(dst_rdy_int),
- .f19_dataout(data_o), .f19_src_rdy_o(src_rdy), .f19_dst_rdy_i(dst_rdy));
-
- packet_splitter #(.FRAME_LEN(13)) rx_packet_splitter
- (.clk(sys_clk), .reset(sys_rst), .clear(0),
- .frames_per_packet(4),
- .data_i(data_o), .src_rdy_i(src_rdy), .dst_rdy_o(dst_rdy),
- .data_o(data_splt), .src_rdy_o(src_rdy_splt), .dst_rdy_i(dst_rdy_splt));
-
- always @(posedge sys_clk)
- if(ctrl_src_rdy & ctrl_dst_rdy)
- $display("CTRL: %x",ctrl_o);
-
- always @(posedge sys_clk)
- if(src_rdy_splt & dst_rdy_splt)
- begin
- if(data_splt[16])
- $display("<-------- DATA SOF--------->");
- $display("DATA: %x",data_splt);
- if(data_splt[17])
- $display("<-------- DATA EOF--------->");
- end
-
- initial
- begin
- #10000;
- repeat (1)
- begin
- @(posedge gpif_clk);
-
- WR <= 1;
- gpif_data <= 256; // Length
- @(posedge gpif_clk);
- gpif_data <= 16'h00;
- @(posedge gpif_clk);
- repeat(254)
- begin
- gpif_data <= gpif_data + 1;
- @(posedge gpif_clk);
- end
- WR <= 0;
-
- while(DF)
- @(posedge gpif_clk);
- repeat (16)
- @(posedge gpif_clk);
-
- WR <= 1;
- repeat(256)
- begin
- gpif_data <= gpif_data - 1;
- @(posedge gpif_clk);
- end
- WR <= 0;
-
-
-/*
- while(DF)
- @(posedge gpif_clk);
-
- repeat (20)
- @(posedge gpif_clk);
- WR <= 1;
- gpif_data <= 16'h5;
- @(posedge gpif_clk);
- gpif_data <= 16'h00;
- @(posedge gpif_clk);
- repeat(254)
- begin
- gpif_data <= gpif_data - 1;
- @(posedge gpif_clk);
- end
- WR <= 0;
- */
- end
- end // initial begin
-
- initial #200000 $finish;
-
-
-endmodule // packet_splitter_tb
diff --git a/fpga/usrp2/gpif/slave_fifo.v b/fpga/usrp2/gpif/slave_fifo.v
index e75f28913..0f301f8a6 100644
--- a/fpga/usrp2/gpif/slave_fifo.v
+++ b/fpga/usrp2/gpif/slave_fifo.v
@@ -20,85 +20,70 @@
//this is a FIFO master interface for the FX2 in "slave fifo" mode.
module slave_fifo
- #(parameter TXFIFOSIZE = 12, parameter RXFIFOSIZE = 12)
+ #(
+ //how many cycles max in a transfer state
+ parameter DATA_XFER_COUNT = 256,
+ parameter CTRL_XFER_COUNT = 32,
+
+ //sizes for fifo36 2 clock cascade fifos
+ parameter DATA_RX_FIFO_SIZE = 9,
+ parameter DATA_TX_FIFO_SIZE = 9,
+ parameter CTRL_RX_FIFO_SIZE = 9,
+ parameter CTRL_TX_FIFO_SIZE = 9
+ )
(// GPIF signals
input gpif_clk, input gpif_rst,
inout [15:0] gpif_d,
input [3:0] gpif_ctl,
- output sloe, output slrd, output slwr, output pktend, output [1:0] fifoadr,
-
- // Wishbone signals
- input wb_clk, input wb_rst,
- output [15:0] wb_adr_o, output [15:0] wb_dat_mosi, input [15:0] wb_dat_miso,
- output [1:0] wb_sel_o, output wb_cyc_o, output wb_stb_o, output wb_we_o, input wb_ack_i,
- input [7:0] triggers,
-
- input dsp_rx_run,
-
+ output reg sloe, output reg slrd, output reg slwr, output reg pktend, output reg [1:0] fifoadr,
+
// FIFO interface
- input fifo_clk, input fifo_rst, input clear_tx, input clear_rx,
- output [35:0] tx_data_o, output tx_src_rdy_o, input tx_dst_rdy_i,
- input [35:0] rx_data_i, input rx_src_rdy_i, output rx_dst_rdy_o,
- input [35:0] tx_err_data_i, input tx_err_src_rdy_i, output tx_err_dst_rdy_o,
- output tx_underrun, output rx_overrun,
-
- input [15:0] test_len, input [7:0] test_rate, input [3:0] test_ctrl,
- output [31:0] debug0, output [31:0] debug1
+ input fifo_clk, input fifo_rst,
+ output [35:0] tx_data, output tx_src_rdy, input tx_dst_rdy,
+ input [35:0] rx_data, input rx_src_rdy, output rx_dst_rdy,
+ output [35:0] ctrl_data, output ctrl_src_rdy, input ctrl_dst_rdy,
+ input [35:0] resp_data, input resp_src_rdy, output resp_dst_rdy,
+
+ output [31:0] debug
);
- reg FX2_DE, FX2_CE, FX2_DF, FX2_CF;
+ wire FX2_DE_pre = ~gpif_ctl[0]; //EP2 FX2 FIFO empty (FLAGA)
+ wire FX2_CE_pre = ~gpif_ctl[1]; //EP4 FX2 FIFO empty (FLAGB)
+ wire FX2_DF_pre = ~gpif_ctl[2]; //EP6 FX2 FIFO full (FLAGC)
+ wire FX2_CF_pre = ~gpif_ctl[3]; //EP8 FX2 FIFO full (FLAGD)
- // inputs to FPGA (all active low)
+ reg FX2_DE, FX2_CE, FX2_DF, FX2_CF;
always @(posedge gpif_clk) begin
- FX2_DE <= ~gpif_ctl[0]; //EP2 FX2 FIFO empty (FLAGA)
- FX2_CE <= ~gpif_ctl[1]; //EP4 FX2 FIFO empty (FLAGB)
- FX2_DF <= ~gpif_ctl[2]; //EP6 FX2 FIFO full (FLAGC)
- FX2_CF <= ~gpif_ctl[3]; //EP8 FX2 FIFO full (FLAGD)
+ FX2_DE <= FX2_DE_pre; //EP2 FX2 FIFO empty (FLAGA)
+ FX2_CE <= FX2_CE_pre; //EP4 FX2 FIFO empty (FLAGB)
+ FX2_DF <= FX2_DF_pre; //EP6 FX2 FIFO full (FLAGC)
+ FX2_CF <= FX2_CF_pre; //EP8 FX2 FIFO full (FLAGD)
end
- wire [17:0] gpif_d_out_ctrl, gpif_d_out_data, gpif_d_out;
+ wire [15:0] gpif_d_out_ctrl, gpif_d_out_data;
+ reg [15:0] gpif_d_out, gpif_d_in;
// ////////////////////////////////////////////////////////////////////
// GPIF bus master state machine
- //transfer size for GPIF data. this can be anything really, it's specified only for
- //fairness in bus sharing. 256 lines is 512 bytes over the wire, half the size of
- //the double buffers in B100/B150. this should probably be a toplevel parameter or even
- //a settings register value.
- localparam data_transfer_size = 256;
- localparam ctrl_transfer_size = 16; //probably unnecessary since ctrl xfers won't back up
-
- // state machine i/o to four fifos
- //tx
- wire ctrl_tx_dst_rdy; //sm input, ctrl tx path has space
- wire ctrl_tx_src_rdy; //sm output, ctrl tx path enable
- wire data_tx_dst_rdy; //sm input, data tx path has space
- wire data_tx_src_rdy; //sm output, data tx path enable
-
- //rx
- wire ctrl_rx_dst_rdy; //sm output, ctrl rx path enable
- wire ctrl_rx_src_rdy; //sm input, ctrl rx path has space
- wire data_rx_dst_rdy; //sm output, data rx path enable
- wire data_rx_src_rdy; //sm input, data rx path has space
-
- reg tx_data_enough_space;
+ wire rx_valid, resp_valid;
+ reg tx_valid, ctrl_valid;
+ wire tx_ready, ctrl_ready;
+ reg rx_enable, resp_enable;
reg [9:0] transfer_count; //number of lines (a line is 16 bits) in active transfer
-
- reg pktend_latch;
reg [3:0] state; //state machine current state
localparam STATE_IDLE = 0;
- localparam STATE_DATA_RX = 5;
+ localparam STATE_THINK = 1;
+ localparam STATE_DATA_RX = 2;
localparam STATE_DATA_TX = 3;
- localparam STATE_CTRL_RX = 6;
- localparam STATE_CTRL_TX = 9;
- localparam STATE_DATA_TX_SLOE = 2;
- localparam STATE_CTRL_TX_SLOE = 8;
- localparam STATE_DATA_RX_ADR = 1;
- localparam STATE_CTRL_RX_ADR = 4;
- localparam STATE_PKTEND_ADR = 10;
- localparam STATE_PKTEND = 7;
+ localparam STATE_CTRL_RX = 4;
+ localparam STATE_CTRL_TX = 5;
+ localparam STATE_DATA_TX_SLOE = 6;
+ localparam STATE_CTRL_TX_SLOE = 7;
+ localparam STATE_DATA_RX_ADR = 8;
+ localparam STATE_CTRL_RX_ADR = 9;
//logs the last bus user for xfer fairness
//we only care about data rx vs. tx since ctrl pkts are so short
@@ -106,368 +91,184 @@ module slave_fifo
localparam BUS_HOG_RX = 0;
localparam BUS_HOG_TX = 1;
+ wire resp_eof;
+ reg [1:0] idle_count;
+
// //////////////////////////////////////////////////////////////
// FX2 slave FIFO bus master state machine
//
- always @(posedge gpif_clk)
- if(gpif_rst)
- state <= STATE_IDLE;
- else
- begin
- case (state)
- STATE_IDLE:
- begin
- transfer_count <= 0;
- //handle transitions to other states
- if(ctrl_tx_dst_rdy & ~FX2_CE) //if there's room in the ctrl fifo and the FX2 has ctrl data
- state <= STATE_CTRL_TX_SLOE;
- else if(ctrl_rx_src_rdy & ~FX2_CF) //if the ctrl fifo has data and the FX2 isn't full
- state <= STATE_CTRL_RX_ADR;
- else if(data_tx_dst_rdy & ~FX2_DE & last_data_bus_hog == BUS_HOG_RX & tx_data_enough_space) //if there's room in the data fifo and the FX2 has data
- state <= STATE_DATA_TX_SLOE;
- else if(data_rx_src_rdy & ~FX2_DF & last_data_bus_hog == BUS_HOG_TX) //if the data fifo has data and the FX2 isn't full
- state <= STATE_DATA_RX_ADR;
- else if(data_tx_dst_rdy & ~FX2_DE & tx_data_enough_space)
- state <= STATE_DATA_TX_SLOE;
- else if(data_rx_src_rdy & ~FX2_DF)
- state <= STATE_DATA_RX_ADR;
- else if(~data_rx_src_rdy & ~dsp_rx_run & pktend_latch & ~FX2_DF)
- state <= STATE_PKTEND_ADR;
-
- if(data_rx_src_rdy)
- pktend_latch <= 1;
- end
-
- STATE_DATA_TX_SLOE: //just to assert SLOE one cycle before SLRD
- state <= STATE_DATA_TX;
- STATE_CTRL_TX_SLOE:
- state <= STATE_CTRL_TX;
-
- STATE_DATA_RX_ADR: //just to assert FIFOADR one cycle before SLWR
- state <= STATE_DATA_RX;
- STATE_CTRL_RX_ADR:
- state <= STATE_CTRL_RX;
-
- STATE_DATA_RX:
- begin
- if(data_rx_src_rdy && data_rx_dst_rdy)
- transfer_count <= transfer_count + 1;
- else
- state <= STATE_IDLE;
- last_data_bus_hog <= BUS_HOG_RX;
- end
-
- STATE_PKTEND_ADR:
- begin
- state <= STATE_PKTEND;
- end
-
- STATE_PKTEND:
- begin
- state <= STATE_IDLE;
- pktend_latch <= 0;
- end
-
- STATE_DATA_TX:
- begin
- if(data_tx_dst_rdy && data_tx_src_rdy)
- transfer_count <= transfer_count + 1;
- else
- state <= STATE_IDLE;
- last_data_bus_hog <= BUS_HOG_TX;
- end
- STATE_CTRL_RX:
- begin
- if(ctrl_rx_src_rdy && ctrl_rx_dst_rdy)
- transfer_count <= transfer_count + 1;
- else
- state <= STATE_IDLE;
- end
- STATE_CTRL_TX:
- begin
- if(ctrl_tx_dst_rdy && ctrl_tx_src_rdy)
- transfer_count <= transfer_count + 1;
- else
- state <= STATE_IDLE;
- end
- endcase
+ always @(posedge gpif_clk)
+ if(gpif_rst) begin
+ state <= STATE_IDLE;
+ sloe <= 1;
+ slrd <= 1;
+ slwr <= 1;
+ pktend <= 1;
+ rx_enable <= 0;
+ tx_valid <= 0;
+ ctrl_valid <= 0;
+ resp_enable <= 0;
+ idle_count <= 0;
+ end
+ else case (state)
+ STATE_IDLE: begin
+ transfer_count <= 0;
+ sloe <= 1;
+ slrd <= 1;
+ slwr <= 1;
+ pktend <= 1;
+ rx_enable <= 0;
+ tx_valid <= 0;
+ ctrl_valid <= 0;
+ resp_enable <= 0;
+ if (idle_count == 2'b11) state <= STATE_THINK;
+ idle_count <= idle_count + 1;
+ end
+
+ STATE_THINK: begin
+
+ idle_count <= 0;
+
+ //handle transitions to other states
+ if(ctrl_ready & ~FX2_CE) begin //if there's room in the ctrl fifo and the FX2 has ctrl data
+ state <= STATE_CTRL_TX_SLOE;
+ fifoadr <= 2'b01;
+ sloe <= 0;
+ end
+ else if(resp_valid & ~FX2_CF) begin //if the ctrl fifo has data and the FX2 isn't full
+ state <= STATE_CTRL_RX_ADR;
+ fifoadr <= 2'b11;
+ end
+ else if(tx_ready & ~FX2_DE & last_data_bus_hog == BUS_HOG_RX) begin //if there's room in the data fifo and the FX2 has data
+ state <= STATE_DATA_TX_SLOE;
+ last_data_bus_hog <= BUS_HOG_TX;
+ fifoadr <= 2'b00;
+ sloe <= 0;
end
+ else if(rx_valid & ~FX2_DF & last_data_bus_hog == BUS_HOG_TX) begin //if the data fifo has data and the FX2 isn't full
+ state <= STATE_DATA_RX_ADR;
+ last_data_bus_hog <= BUS_HOG_RX;
+ fifoadr <= 2'b10;
+ end
+ else if(tx_ready & ~FX2_DE) begin
+ state <= STATE_DATA_TX_SLOE;
+ last_data_bus_hog <= BUS_HOG_TX;
+ fifoadr <= 2'b00;
+ sloe <= 0;
+ end
+ else if(rx_valid & ~FX2_DF) begin
+ state <= STATE_DATA_RX_ADR;
+ last_data_bus_hog <= BUS_HOG_RX;
+ fifoadr <= 2'b10;
+ end
+ end
- // ///////////////////////////////////////////////////////////////////
- // fifo signal assignments and enables
+ STATE_DATA_TX_SLOE: begin //just to assert SLOE one cycle before SLRD
+ state <= STATE_DATA_TX;
+ slrd <= 0;
+ end
- //enable fifos
- assign data_rx_dst_rdy = (state == STATE_DATA_RX) && ~FX2_DF && (transfer_count != data_transfer_size);
- assign data_tx_src_rdy = (state == STATE_DATA_TX) && ~FX2_DE && (transfer_count != data_transfer_size);
- assign ctrl_rx_dst_rdy = (state == STATE_CTRL_RX) && ~FX2_CF;
- assign ctrl_tx_src_rdy = (state == STATE_CTRL_TX) && ~FX2_CE;
+ STATE_CTRL_TX_SLOE: begin
+ state <= STATE_CTRL_TX;
+ slrd <= 0;
+ end
- //framing for TX ctrl packets
- wire sop_ctrl, eop_ctrl;
- assign sop_ctrl = (transfer_count == 0);
- assign eop_ctrl = (transfer_count == (ctrl_transfer_size-1));
+ STATE_DATA_RX_ADR: begin //just to assert FIFOADR one cycle before SLWR
+ state <= STATE_DATA_RX;
+ rx_enable <= 1;
+ end
+
+ STATE_CTRL_RX_ADR: begin
+ state <= STATE_CTRL_RX;
+ resp_enable <= 1;
+ end
+
+ STATE_DATA_RX: begin
+ if (FX2_DF_pre || ~rx_valid || transfer_count == DATA_XFER_COUNT-1) begin
+ state <= STATE_IDLE;
+ rx_enable <= 0;
+ end
+ gpif_d_out <= gpif_d_out_data;
+ slwr <= ~rx_valid;
+ transfer_count <= transfer_count + 1;
+ end
+
+ STATE_DATA_TX: begin
+ if (FX2_DE_pre || transfer_count == DATA_XFER_COUNT-1) begin
+ state <= STATE_IDLE;
+ slrd <= 1;
+ end
+ gpif_d_in <= gpif_d;
+ tx_valid <= 1;
+ transfer_count <= transfer_count + 1;
+ end
+
+ STATE_CTRL_RX: begin
+ if (FX2_CF_pre || ~resp_valid || resp_eof || transfer_count == CTRL_XFER_COUNT-1) begin
+ state <= STATE_IDLE;
+ resp_enable <= 0;
+ end
+ pktend <= ~resp_eof;
+ gpif_d_out <= gpif_d_out_ctrl;
+ slwr <= ~resp_valid;
+ transfer_count <= transfer_count + 1;
+ end
+
+ STATE_CTRL_TX: begin
+ if (FX2_CE_pre || transfer_count == CTRL_XFER_COUNT-1) begin
+ state <= STATE_IDLE;
+ slrd <= 1;
+ end
+ gpif_d_in <= gpif_d;
+ ctrl_valid <= 1;
+ transfer_count <= transfer_count + 1;
+ end
+ endcase
- // ////////////////////////////////////////////////////////////////////
- // set GPIF pins
-
- //set fifoadr to the appropriate endpoint
- // {0,0}: EP2, data TX from host
- // {0,1}: EP4, ctrl TX from host
- // {1,0}: EP6, data RX to host
- // {1,1}: EP8, ctrl RX to host
- assign fifoadr = {(state == STATE_DATA_RX) | (state == STATE_CTRL_RX) | (state == STATE_DATA_RX_ADR) | (state == STATE_CTRL_RX_ADR) | (state == STATE_PKTEND) | (state == STATE_PKTEND_ADR),
- (state == STATE_CTRL_RX) | (state == STATE_CTRL_RX_ADR) | (state == STATE_CTRL_TX) | (state == STATE_CTRL_TX_SLOE)};
- //set sloe, slwr, slrd (all active low)
- //SLOE gets asserted when we want data from the FX2; i.e., TX mode
- assign sloe = ~{(state == STATE_DATA_TX) | (state == STATE_CTRL_TX) | (state == STATE_DATA_TX_SLOE) | (state == STATE_CTRL_TX_SLOE)};
- //"read" and "write" here are from the master's point of view;
- //so "read" means "transmit" and "write" means "receive"
- assign slwr = ~{(data_rx_src_rdy && data_rx_dst_rdy) || (ctrl_rx_src_rdy && ctrl_rx_dst_rdy)};
- assign slrd = ~{(data_tx_src_rdy && data_tx_dst_rdy) || (ctrl_tx_src_rdy && ctrl_tx_dst_rdy)};
-
- wire pktend_ctrl, pktend_data;
- assign pktend_ctrl = ((~ctrl_rx_src_rdy | gpif_d_out_ctrl[17]) & (state == STATE_CTRL_RX));
- assign pktend_data = (state == STATE_PKTEND);
- assign pktend = ~(pktend_ctrl | pktend_data);
-
- //mux between ctrl/data RX data out based on endpoint selection
- assign gpif_d_out = fifoadr[0] ? gpif_d_out_ctrl : gpif_d_out_data;
// GPIF output data lines, tristate
- assign gpif_d = sloe ? gpif_d_out : 16'bz;
+ assign gpif_d = (sloe)? gpif_d_out[15:0] : 16'bz;
// ////////////////////////////////////////////////////////////////////
// TX Data Path
- wire [15:0] txfifo_data;
- wire txfifo_src_rdy, txfifo_dst_rdy;
- wire [35:0] tx36_data;
- wire tx36_src_rdy, tx36_dst_rdy;
- wire [15:0] data_tx_2clk;
- wire tx_src_rdy_2clk, tx_dst_rdy_2clk;
-
- wire [15:0] wr_fifo_space;
-
- always @(posedge gpif_clk)
- tx_data_enough_space <= (wr_fifo_space >= data_transfer_size);
-
- fifo_cascade #(.WIDTH(16), .SIZE(12)) wr_fifo
- (.clk(gpif_clk), .reset(gpif_rst), .clear(clear_tx),
- .datain(gpif_d), .src_rdy_i(data_tx_src_rdy), .dst_rdy_o(data_tx_dst_rdy), .space(wr_fifo_space),
- .dataout(txfifo_data), .src_rdy_o(txfifo_src_rdy), .dst_rdy_i(txfifo_dst_rdy), .occupied());
-
- fifo_2clock_cascade #(.WIDTH(16), .SIZE(4)) wr_fifo_2clk
- (.wclk(gpif_clk), .datain(txfifo_data), .src_rdy_i(txfifo_src_rdy), .dst_rdy_o(txfifo_dst_rdy), .space(),
- .rclk(fifo_clk), .dataout(data_tx_2clk), .src_rdy_o(tx_src_rdy_2clk), .dst_rdy_i(tx_dst_rdy_2clk), .occupied(),
- .arst(fifo_rst));
-
- // join vita packets which are longer than one frame, add SOP/EOP/OCC
- wire [18:0] refr_data;
- wire refr_src_rdy, refr_dst_rdy;
- //below 3 signals for debug only
- wire refr_state;
- wire refr_eof;
- wire [15:0] refr_len;
-
- packet_reframer tx_packet_reframer
- (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_tx),
- .data_i(data_tx_2clk), .src_rdy_i(tx_src_rdy_2clk), .dst_rdy_o(tx_dst_rdy_2clk),
- .data_o(refr_data), .src_rdy_o(refr_src_rdy), .dst_rdy_i(refr_dst_rdy),
- .state(refr_state), .eof_out(refr_eof), .length(refr_len));
-
- fifo19_to_fifo36 #(.LE(1)) f19_to_f36
- (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_tx),
- .f19_datain(refr_data), .f19_src_rdy_i(refr_src_rdy), .f19_dst_rdy_o(refr_dst_rdy),
- .f36_dataout(tx36_data), .f36_src_rdy_o(tx36_src_rdy), .f36_dst_rdy_i(tx36_dst_rdy));
-
- fifo_cascade #(.WIDTH(36), .SIZE(TXFIFOSIZE)) tx_fifo36
- (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_tx),
- .datain(tx36_data), .src_rdy_i(tx36_src_rdy), .dst_rdy_o(tx36_dst_rdy),
- .dataout(tx_data_o), .src_rdy_o(tx_src_rdy_o), .dst_rdy_i(tx_dst_rdy_i));
+ gpmc16_to_fifo36 #(.FIFO_SIZE(DATA_TX_FIFO_SIZE), .MIN_SPACE16(DATA_XFER_COUNT)) fifo36_to_gpmc16_tx(
+ .gpif_clk(gpif_clk), .gpif_rst(gpif_rst),
+ .in_data(gpif_d_in), .ready(tx_ready), .valid(tx_valid),
+ .fifo_clk(fifo_clk), .fifo_rst(fifo_rst),
+ .out_data(tx_data), .out_src_rdy(tx_src_rdy), .out_dst_rdy(tx_dst_rdy)
+ );
// ////////////////////////////////////////////
// RX Data Path
- wire [35:0] rx36_data;
- wire rx36_src_rdy, rx36_dst_rdy;
- wire [18:0] rx19_data;
- wire rx19_src_rdy, rx19_dst_rdy;
- wire [15:0] rxfifospace;
-
- //deep 36 bit wide input fifo buffers from DSP
- fifo_cascade #(.WIDTH(36), .SIZE(8)) rx_fifo36
- (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_rx),
- .datain(rx_data_i), .src_rdy_i(rx_src_rdy_i), .dst_rdy_o(rx_dst_rdy_o),
- .dataout(rx36_data), .src_rdy_o(rx36_src_rdy), .dst_rdy_i(rx36_dst_rdy));
-
- //convert to fifo19
- fifo36_to_fifo19 #(.LE(1)) f36_to_f19
- (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_rx),
- .f36_datain(rx36_data), .f36_src_rdy_i(rx36_src_rdy), .f36_dst_rdy_o(rx36_dst_rdy),
- .f19_dataout(rx19_data), .f19_src_rdy_o(rx19_src_rdy), .f19_dst_rdy_i(rx19_dst_rdy) );
-
- wire [18:0] data_rx_int;
- wire rx_src_rdy_int, rx_dst_rdy_int;
- //clock domain crossing fifo for RX data
- fifo_2clock_cascade #(.WIDTH(19), .SIZE(4)) rd_fifo_2clk
- (.wclk(fifo_clk), .datain(rx19_data), .src_rdy_i(rx19_src_rdy), .dst_rdy_o(rx19_dst_rdy), .space(),
- .rclk(~gpif_clk), .dataout(data_rx_int), .src_rdy_o(rx_src_rdy_int), .dst_rdy_i(rx_dst_rdy_int), .occupied(),
- .arst(fifo_rst));
-
- //rd_fifo buffers writes to the 2clock fifo above
- fifo_cascade #(.WIDTH(16), .SIZE(RXFIFOSIZE)) rd_fifo
- (.clk(~gpif_clk), .reset(gpif_rst), .clear(clear_rx),
- .datain(data_rx_int), .src_rdy_i(rx_src_rdy_int), .dst_rdy_o(rx_dst_rdy_int), .space(rxfifospace),
- .dataout(gpif_d_out_data), .src_rdy_o(data_rx_src_rdy), .dst_rdy_i(data_rx_dst_rdy), .occupied());
+ fifo36_to_gpmc16 #(.FIFO_SIZE(DATA_RX_FIFO_SIZE)) fifo36_to_gpmc16_rx(
+ .fifo_clk(fifo_clk), .fifo_rst(fifo_rst),
+ .in_data(rx_data), .in_src_rdy(rx_src_rdy), .in_dst_rdy(rx_dst_rdy),
+ .gpif_clk(gpif_clk), .gpif_rst(gpif_rst),
+ .out_data(gpif_d_out_data), .valid(rx_valid), .enable(rx_enable)
+ );
// ////////////////////////////////////////////////////////////////////
- // FIFO to Wishbone interface
+ // CTRL TX Data Path
- wire [18:0] resp_data, resp_int;
- wire resp_src_rdy, resp_dst_rdy;
- wire resp_src_rdy_int, resp_dst_rdy_int;
-
- wire [18:0] tx_err19_data;
- wire tx_err19_src_rdy, tx_err19_dst_rdy;
-
- wire [18:0] ctrl_data;
- wire ctrl_src_rdy, ctrl_dst_rdy;
-
- fifo_to_wb fifo_to_wb
- (.clk(fifo_clk), .reset(fifo_rst), .clear(0),
- .data_i(ctrl_data), .src_rdy_i(ctrl_src_rdy), .dst_rdy_o(ctrl_dst_rdy),
- .data_o(resp_int), .src_rdy_o(resp_src_rdy_int), .dst_rdy_i(resp_dst_rdy_int),
- .wb_adr_o(wb_adr_o), .wb_dat_mosi(wb_dat_mosi), .wb_dat_miso(wb_dat_miso), .wb_sel_o(wb_sel_o),
- .wb_cyc_o(wb_cyc_o), .wb_stb_o(wb_stb_o), .wb_we_o(wb_we_o), .wb_ack_i(wb_ack_i),
- .triggers(triggers),
- .debug0(), .debug1());
-
- // ////////////////////////////////////////////////////////////////////
- // TX CTRL PATH (ctrl commands into Wishbone)
+ gpmc16_to_fifo36 #(.FIFO_SIZE(CTRL_TX_FIFO_SIZE), .MIN_SPACE16(CTRL_XFER_COUNT)) fifo36_to_gpmc16_ctrl(
+ .gpif_clk(gpif_clk), .gpif_rst(gpif_rst),
+ .in_data(gpif_d_in), .ready(ctrl_ready), .valid(ctrl_valid),
+ .fifo_clk(fifo_clk), .fifo_rst(fifo_rst),
+ .out_data(ctrl_data), .out_src_rdy(ctrl_src_rdy), .out_dst_rdy(ctrl_dst_rdy)
+ );
- //how does this use fifo_clk instead of wb_clk
- //answer: on b100 fifo clk IS wb clk
- fifo_2clock_cascade #(.WIDTH(19), .SIZE(4)) ctrl_fifo_2clk
- (.wclk(gpif_clk), .datain({1'b0,eop_ctrl,sop_ctrl,gpif_d}),
- .src_rdy_i(ctrl_tx_src_rdy), .dst_rdy_o(ctrl_tx_dst_rdy), .space(),
- .rclk(fifo_clk), .dataout(ctrl_data),
- .src_rdy_o(ctrl_src_rdy), .dst_rdy_i(ctrl_dst_rdy), .occupied(),
- .arst(fifo_rst));
+ // ////////////////////////////////////////////
+ // CTRL RX Data Path
+
+ fifo36_to_gpmc16 #(.FIFO_SIZE(CTRL_RX_FIFO_SIZE)) fifo36_to_gpmc16_resp(
+ .fifo_clk(fifo_clk), .fifo_rst(fifo_rst),
+ .in_data(resp_data), .in_src_rdy(resp_src_rdy), .in_dst_rdy(resp_dst_rdy),
+ .gpif_clk(gpif_clk), .gpif_rst(gpif_rst),
+ .out_data(gpif_d_out_ctrl), .valid(resp_valid), .enable(resp_enable),
+ .eof(resp_eof)
+ );
- // ////////////////////////////////////////////////////////////////////
- // RX CTRL PATH (async packets, ctrl response data)
-
- //tx_err_data_i is the 36wide tx async err data clocked on fifo_clk
- fifo36_to_fifo19 #(.LE(1)) f36_to_f19_txerr
- (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_rx),
- .f36_datain(tx_err_data_i), .f36_src_rdy_i(tx_err_src_rdy_i), .f36_dst_rdy_o(tx_err_dst_rdy_o),
- .f19_dataout(tx_err19_data), .f19_src_rdy_o(tx_err19_src_rdy), .f19_dst_rdy_i(tx_err19_dst_rdy) );
-
- //mux FIFO-to-WB along with async tx err pkts into one ctrl resp fifo
- //how is this clocked on wb_clk?
- fifo19_mux #(.prio(0)) mux_err_stream
- (.clk(wb_clk), .reset(wb_rst), .clear(clear_rx),
- .data0_i(resp_int), .src0_rdy_i(resp_src_rdy_int), .dst0_rdy_o(resp_dst_rdy_int),
- .data1_i(tx_err19_data), .src1_rdy_i(tx_err19_src_rdy), .dst1_rdy_o(tx_err19_dst_rdy),
- .data_o(resp_data), .src_rdy_o(resp_src_rdy), .dst_rdy_i(resp_dst_rdy));
-
- //clock domain crossing cascade fifo for mux_err_stream to get from wb_clk to gpif_clk
- //the output of this fifo is CTRL DATA PENDING FOR GPIF
- fifo_2clock_cascade #(.WIDTH(18), .SIZE(4)) resp_fifo_2clk
- (.wclk(wb_clk), .datain(resp_data[17:0]), .src_rdy_i(resp_src_rdy), .dst_rdy_o(resp_dst_rdy), .space(),
- .rclk(~gpif_clk), .dataout(gpif_d_out_ctrl),
- .src_rdy_o(ctrl_rx_src_rdy), .dst_rdy_i(ctrl_rx_dst_rdy), .occupied(),
- .arst(wb_rst));
-
-
- // ////////////////////////////////////////////////////////////////////
- // Debug support, timed and loopback
- // RX side muxes test data into the same stream
+ assign debug = 0;
- ///////////////////////////////////////////////////////////////////////
- // debug lines
- wire [31:0] debug_rd, debug_wr, debug_split0, debug_split1;
-
- wire [35:0] timedrx_data, loopbackrx_data, testrx_data;
- wire [35:0] timedtx_data, loopbacktx_data, testtx_data;
- wire timedrx_src_rdy, timedrx_dst_rdy, loopbackrx_src_rdy, loopbackrx_dst_rdy,
- testrx_src_rdy, testrx_dst_rdy;
- wire timedtx_src_rdy, timedtx_dst_rdy, loopbacktx_src_rdy, loopbacktx_dst_rdy,
- testtx_src_rdy, testtx_dst_rdy;
- wire timedrx_src_rdy_int, timedrx_dst_rdy_int, timedtx_src_rdy_int, timedtx_dst_rdy_int;
-
- wire [31:0] total, crc_err, seq_err, len_err;
- wire sel_testtx = test_ctrl[0];
- wire sel_loopbacktx = test_ctrl[1];
- wire pkt_src_enable = test_ctrl[2];
- wire pkt_sink_enable = test_ctrl[3];
-/*
- fifo36_mux rx_test_mux_lvl_1
- (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_rx),
- .data0_i(timedrx_data), .src0_rdy_i(timedrx_src_rdy), .dst0_rdy_o(timedrx_dst_rdy),
- .data1_i(loopbackrx_data), .src1_rdy_i(loopbackrx_src_rdy), .dst1_rdy_o(loopbackrx_dst_rdy),
- .data_o(testrx_data), .src_rdy_o(testrx_src_rdy), .dst_rdy_i(testrx_dst_rdy));
-
- fifo36_mux rx_test_mux_lvl_2
- (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_rx),
- .data0_i(testrx_data), .src0_rdy_i(testrx_src_rdy), .dst0_rdy_o(testrx_dst_rdy),
- .data1_i(rx_data_i), .src1_rdy_i(rx_src_rdy_i), .dst1_rdy_o(rx_dst_rdy_o),
- .data_o(rx_data), .src_rdy_o(rx_src_rdy), .dst_rdy_i(rx_dst_rdy));
-
- fifo_short #(.WIDTH(36)) loopback_fifo
- (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_tx | clear_rx),
- .datain(loopbacktx_data), .src_rdy_i(loopbacktx_src_rdy), .dst_rdy_o(loopbacktx_dst_rdy),
- .dataout(loopbackrx_data), .src_rdy_o(loopbackrx_src_rdy), .dst_rdy_i(loopbackrx_dst_rdy));
-
- // Crossbar used as a demux for switching TX stream to main DSP or to test logic
- crossbar36 tx_crossbar_lvl_1
- (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_tx),
- .cross(sel_testtx),
- .data0_i(tx_data), .src0_rdy_i(tx_src_rdy), .dst0_rdy_o(tx_dst_rdy),
- .data1_i(tx_data), .src1_rdy_i(1'b0), .dst1_rdy_o(), // No 2nd input
- .data0_o(tx_data_o), .src0_rdy_o(tx_src_rdy_o), .dst0_rdy_i(tx_dst_rdy_i),
- .data1_o(testtx_data), .src1_rdy_o(testtx_src_rdy), .dst1_rdy_i(testtx_dst_rdy) );
-
- crossbar36 tx_crossbar_lvl_2
- (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_tx),
- .cross(sel_loopbacktx),
- .data0_i(testtx_data), .src0_rdy_i(testtx_src_rdy), .dst0_rdy_o(testtx_dst_rdy),
- .data1_i(testtx_data), .src1_rdy_i(1'b0), .dst1_rdy_o(), // No 2nd input
- .data0_o(timedtx_data), .src0_rdy_o(timedtx_src_rdy), .dst0_rdy_i(timedtx_dst_rdy),
- .data1_o(loopbacktx_data), .src1_rdy_o(loopbacktx_src_rdy), .dst1_rdy_i(loopbacktx_dst_rdy) );
-
- // Fixed rate TX traffic consumer
- fifo_pacer tx_pacer
- (.clk(fifo_clk), .reset(fifo_rst), .rate(test_rate), .enable(pkt_sink_enable),
- .src1_rdy_i(timedtx_src_rdy), .dst1_rdy_o(timedtx_dst_rdy),
- .src2_rdy_o(timedtx_src_rdy_int), .dst2_rdy_i(timedtx_dst_rdy_int),
- .underrun(tx_underrun), .overrun());
-
- packet_verifier32 pktver32
- (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_tx),
- .data_i(timedtx_data), .src_rdy_i(timedtx_src_rdy_int), .dst_rdy_o(timedtx_dst_rdy_int),
- .total(total), .crc_err(crc_err), .seq_err(seq_err), .len_err(len_err));
-
- // Fixed rate RX traffic generator
- vita_pkt_gen pktgen
- (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_rx),
- .len(test_len),
- .data_o(timedrx_data), .src_rdy_o(timedrx_src_rdy_int), .dst_rdy_i(timedrx_dst_rdy_int));
-
- fifo_pacer rx_pacer
- (.clk(fifo_clk), .reset(fifo_rst), .rate(test_rate), .enable(pkt_src_enable),
- .src1_rdy_i(timedrx_src_rdy_int), .dst1_rdy_o(timedrx_dst_rdy_int),
- .src2_rdy_o(timedrx_src_rdy), .dst2_rdy_i(timedrx_dst_rdy),
- .underrun(), .overrun(rx_overrun));
-*/
- // ////////////////////////////////////////////
- // DEBUG
-
- assign debug0 = { pktend_latch, data_rx_src_rdy, gpif_ctl[3:0], sloe, slrd, slwr, pktend, fifoadr[1:0], state[3:0], gpif_d[15:0]};
- //assign debug0 = { data_tx_src_rdy, data_tx_dst_rdy, tx_src_rdy_int, tx_dst_rdy_int,
- // tx19_src_rdy, tx19_dst_rdy, refr_src_rdy, refr_dst_rdy,
- // tx36_src_rdy, tx36_dst_rdy,
- // gpif_ctl[3:0], fifoadr[1:0],
- // wr_fifo_space[15:0]};
- assign debug1 = { 16'b0, transfer_count[7:0], ctrl_rx_src_rdy, ctrl_tx_dst_rdy, data_rx_src_rdy,
- data_tx_dst_rdy, ctrl_tx_src_rdy, ctrl_rx_dst_rdy, data_tx_src_rdy, data_rx_dst_rdy};
endmodule // slave_fifo
diff --git a/fpga/usrp2/gpmc/Makefile.srcs b/fpga/usrp2/gpmc/Makefile.srcs
index 4c6a1b4a2..39b37db58 100644
--- a/fpga/usrp2/gpmc/Makefile.srcs
+++ b/fpga/usrp2/gpmc/Makefile.srcs
@@ -1,5 +1,5 @@
#
-# Copyright 2010-2011 Ettus Research LLC
+# Copyright 2010-2012 Ettus Research LLC
#
##################################################
@@ -10,5 +10,4 @@ cross_clock_reader.v \
fifo_to_gpmc.v \
gpmc.v \
gpmc_to_fifo.v \
-gpmc_wb.v \
))
diff --git a/fpga/usrp2/gpmc/cross_clock_reader.v b/fpga/usrp2/gpmc/cross_clock_reader.v
index a8366badc..b4cdb79c5 100644
--- a/fpga/usrp2/gpmc/cross_clock_reader.v
+++ b/fpga/usrp2/gpmc/cross_clock_reader.v
@@ -27,18 +27,20 @@ module cross_clock_reader
);
reg [WIDTH-1:0] shadow0, shadow1;
+ reg [2:0] count;
always @(posedge clk) begin
if (rst) begin
out <= DEFAULT;
shadow0 <= DEFAULT;
shadow1 <= DEFAULT;
+ count <= 0;
end
- else if (shadow0 == shadow1) begin
- out <= shadow1;
- end
+ else if (shadow0 == shadow1) count <= count + 1;
+ else count <= 0;
shadow0 <= in;
shadow1 <= shadow0;
+ if (count == 3'b111) out <= shadow1;
end
endmodule //cross_clock_reader
diff --git a/fpga/usrp2/gpmc/fifo_to_gpmc.v b/fpga/usrp2/gpmc/fifo_to_gpmc.v
index 42c71d2d6..26443a702 100644
--- a/fpga/usrp2/gpmc/fifo_to_gpmc.v
+++ b/fpga/usrp2/gpmc/fifo_to_gpmc.v
@@ -1,5 +1,5 @@
//
-// Copyright 2011 Ettus Research LLC
+// Copyright 2011-2012 Ettus Research LLC
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -39,7 +39,7 @@
////////////////////////////////////////////////////////////////////////
module fifo_to_gpmc
- #(parameter PTR_WIDTH = 2, parameter ADDR_WIDTH = 10)
+ #(parameter PTR_WIDTH = 2, parameter ADDR_WIDTH = 10, parameter LAST_ADDR = 10'h3ff)
(input clk, input reset, input clear, input arst,
input [17:0] data_i, input src_rdy_i, output dst_rdy_o,
output [15:0] EM_D, input [ADDR_WIDTH:1] EM_A, input EM_CLK, input EM_OE,
@@ -82,14 +82,15 @@ module fifo_to_gpmc
end
GPMC_STATE_EMPTY: begin
- if (EM_A == 10'h3ff) begin
+ if (addr == LAST_ADDR) begin
gpmc_state <= GPMC_STATE_START;
gpmc_ptr <= next_gpmc_ptr;
+ addr <= 0;
end
end
endcase //gpmc_state
- end //EM_WE
+ end //EM_OE
end //always
//------------------------------------------------------------------
diff --git a/fpga/usrp2/gpmc/gpmc.v b/fpga/usrp2/gpmc/gpmc.v
index a5d4db466..2ba69d184 100644
--- a/fpga/usrp2/gpmc/gpmc.v
+++ b/fpga/usrp2/gpmc/gpmc.v
@@ -1,5 +1,5 @@
//
-// Copyright 2011 Ettus Research LLC
+// Copyright 2011-2012 Ettus Research LLC
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -18,7 +18,7 @@
//////////////////////////////////////////////////////////////////////////////////
module gpmc
- #(parameter TXFIFOSIZE = 11,
+ #(parameter TXFIFOSIZE = 11,
parameter RXFIFOSIZE = 11,
parameter ADDR_WIDTH = 10,
parameter BUSDEBUG = 1)
@@ -26,57 +26,51 @@ module gpmc
input arst,
input EM_CLK, inout [15:0] EM_D, input [ADDR_WIDTH:1] EM_A, input [1:0] EM_NBE,
input EM_WAIT0, input EM_NCS4, input EM_NCS6, input EM_NWE, input EM_NOE,
-
+
// GPIOs for FIFO signalling
- output rx_have_data, output tx_have_space,
-
- // Wishbone signals
- input wb_clk, input wb_rst,
- output [ADDR_WIDTH:0] wb_adr_o, output [15:0] wb_dat_mosi, input [15:0] wb_dat_miso,
- output [1:0] wb_sel_o, output wb_cyc_o, output wb_stb_o, output wb_we_o, input wb_ack_i,
-
+ output rx_have_data, output tx_have_space, output resp_have_data,
+
// FIFO interface
- input fifo_clk, input fifo_rst, input clear_tx, input clear_rx,
- output [35:0] tx_data_o, output tx_src_rdy_o, input tx_dst_rdy_i,
- input [35:0] rx_data_i, input rx_src_rdy_i, output rx_dst_rdy_o,
+ input fifo_clk, input fifo_rst,
+ output [35:0] tx_data, output tx_src_rdy, input tx_dst_rdy,
+ input [35:0] rx_data, input rx_src_rdy, output rx_dst_rdy,
+ output [35:0] ctrl_data, output ctrl_src_rdy, input ctrl_dst_rdy,
+ input [35:0] resp_data, input resp_src_rdy, output resp_dst_rdy,
- output tx_underrun, output rx_overrun,
- input [7:0] test_rate, input [3:0] test_ctrl,
output [31:0] debug
);
- wire EM_output_enable = (~EM_NOE & (~EM_NCS4 | ~EM_NCS6));
- wire [15:0] EM_D_fifo;
- wire [15:0] EM_D_wb;
+ wire EM_output_enable = (~EM_NOE & (~EM_NCS4 | ~EM_NCS6));
+ wire [15:0] EM_D_data;
+ wire [15:0] EM_D_ctrl;
- assign EM_D = ~EM_output_enable ? 16'bz : ~EM_NCS4 ? EM_D_fifo : EM_D_wb;
+ assign EM_D = ~EM_output_enable ? 16'bz : ~EM_NCS4 ? EM_D_data : EM_D_ctrl;
// CS4 is RAM_2PORT for DATA PATH (high-speed data)
// Writes go into one RAM, reads come from the other
- // CS6 is for CONTROL PATH (wishbone)
+ // CS6 is for CONTROL PATH (slow)
// ////////////////////////////////////////////
// TX Data Path
wire [17:0] tx18_data;
wire tx18_src_rdy, tx18_dst_rdy;
- wire [35:0] tx_data, txb_data;
- wire tx_src_rdy, tx_dst_rdy;
+ wire [35:0] txb_data;
wire txb_src_rdy, txb_dst_rdy;
gpmc_to_fifo #(.ADDR_WIDTH(ADDR_WIDTH)) gpmc_to_fifo
(.EM_D(EM_D), .EM_A(EM_A), .EM_CLK(EM_CLK), .EM_WE(~EM_NCS4 & ~EM_NWE),
- .clk(fifo_clk), .reset(fifo_rst), .clear(clear_tx), .arst(fifo_rst | clear_tx | arst),
+ .clk(fifo_clk), .reset(fifo_rst), .clear(1'b0), .arst(fifo_rst | arst),
.data_o(tx18_data), .src_rdy_o(tx18_src_rdy), .dst_rdy_i(tx18_dst_rdy),
.have_space(tx_have_space));
fifo19_to_fifo36 #(.LE(1)) f19_to_f36 // Little endian because ARM is LE
- (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_tx),
+ (.clk(fifo_clk), .reset(fifo_rst), .clear(1'b0),
.f19_datain({1'b0,tx18_data}), .f19_src_rdy_i(tx18_src_rdy), .f19_dst_rdy_o(tx18_dst_rdy),
.f36_dataout(txb_data), .f36_src_rdy_o(txb_src_rdy), .f36_dst_rdy_i(txb_dst_rdy));
fifo_cascade #(.WIDTH(36), .SIZE(TXFIFOSIZE)) tx_buffering(
- .clk(fifo_clk), .reset(fifo_rst), .clear(clear_tx),
+ .clk(fifo_clk), .reset(fifo_rst), .clear(1'b0),
.datain(txb_data), .src_rdy_i(txb_src_rdy), .dst_rdy_o(txb_dst_rdy),
.dataout(tx_data), .src_rdy_o(tx_src_rdy), .dst_rdy_i(tx_dst_rdy)
);
@@ -86,74 +80,88 @@ module gpmc
wire [17:0] rx18_data;
wire rx18_src_rdy, rx18_dst_rdy;
- wire [35:0] rx_data, rxb_data;
- wire rx_src_rdy, rx_dst_rdy;
+ wire [35:0] rxb_data;
wire rxb_src_rdy, rxb_dst_rdy;
wire dummy;
fifo_cascade #(.WIDTH(36), .SIZE(RXFIFOSIZE)) rx_buffering(
- .clk(fifo_clk), .reset(fifo_rst), .clear(clear_rx),
+ .clk(fifo_clk), .reset(fifo_rst), .clear(1'b0),
.datain(rx_data), .src_rdy_i(rx_src_rdy), .dst_rdy_o(rx_dst_rdy),
.dataout(rxb_data), .src_rdy_o(rxb_src_rdy), .dst_rdy_i(rxb_dst_rdy)
);
fifo36_to_fifo19 #(.LE(1)) f36_to_f19 // Little endian because ARM is LE
- (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_rx),
+ (.clk(fifo_clk), .reset(fifo_rst), .clear(1'b0),
.f36_datain(rxb_data), .f36_src_rdy_i(rxb_src_rdy), .f36_dst_rdy_o(rxb_dst_rdy),
.f19_dataout({dummy,rx18_data}), .f19_src_rdy_o(rx18_src_rdy), .f19_dst_rdy_i(rx18_dst_rdy) );
- fifo_to_gpmc #(.ADDR_WIDTH(ADDR_WIDTH)) fifo_to_gpmc
- (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_rx), .arst(fifo_rst | clear_rx | arst),
+ fifo_to_gpmc #(.ADDR_WIDTH(ADDR_WIDTH), .LAST_ADDR(10'h3ff)) fifo_to_gpmc
+ (.clk(fifo_clk), .reset(fifo_rst), .clear(1'b0), .arst(fifo_rst | arst),
.data_i(rx18_data), .src_rdy_i(rx18_src_rdy), .dst_rdy_o(rx18_dst_rdy),
- .EM_D(EM_D_fifo), .EM_A(EM_A), .EM_CLK(EM_CLK), .EM_OE(~EM_NCS4 & ~EM_NOE),
+ .EM_D(EM_D_data), .EM_A(EM_A), .EM_CLK(EM_CLK), .EM_OE(~EM_NCS4 & ~EM_NOE),
.data_available(rx_have_data));
// ////////////////////////////////////////////
// Control path on CS6
-
- gpmc_wb gpmc_wb
- (.EM_CLK(EM_CLK), .EM_D_in(EM_D), .EM_D_out(EM_D_wb), .EM_A(EM_A), .EM_NBE(EM_NBE),
- .EM_WE(~EM_NCS6 & ~EM_NWE), .EM_OE(~EM_NCS6 & ~EM_NOE),
- .wb_clk(wb_clk), .wb_rst(wb_rst),
- .wb_adr_o(wb_adr_o), .wb_dat_mosi(wb_dat_mosi), .wb_dat_miso(wb_dat_miso),
- .wb_sel_o(wb_sel_o), .wb_cyc_o(wb_cyc_o), .wb_stb_o(wb_stb_o), .wb_we_o(wb_we_o),
- .wb_ack_i(wb_ack_i) );
+
+ // ////////////////////////////////////////////////////////////////////
+ // CTRL TX Data Path
+
+ wire [17:0] ctrl18_data;
+ wire ctrl18_src_rdy, ctrl18_dst_rdy;
+ wire [35:0] ctrlb_data;
+ wire ctrlb_src_rdy, ctrlb_dst_rdy;
+
+ gpmc_to_fifo #(.PTR_WIDTH(5), .ADDR_WIDTH(5)) ctrl_gpmc_to_fifo
+ (.EM_D(EM_D), .EM_A(EM_A[5:1]), .EM_CLK(EM_CLK), .EM_WE(~EM_NCS6 & ~EM_NWE & (EM_A[ADDR_WIDTH:6] == 0)),
+ .clk(fifo_clk), .reset(fifo_rst), .clear(1'b0), .arst(fifo_rst | arst),
+ .data_o(ctrl18_data), .src_rdy_o(ctrl18_src_rdy), .dst_rdy_i(ctrl18_dst_rdy),
+ .have_space(/*always*/));
+
+ fifo19_to_fifo36 #(.LE(1)) ctrl_f19_to_f36 // Little endian because ARM is LE
+ (.clk(fifo_clk), .reset(fifo_rst), .clear(1'b0),
+ .f19_datain({1'b0,ctrl18_data}), .f19_src_rdy_i(ctrl18_src_rdy), .f19_dst_rdy_o(ctrl18_dst_rdy),
+ .f36_dataout(ctrlb_data), .f36_src_rdy_o(ctrlb_src_rdy), .f36_dst_rdy_i(ctrlb_dst_rdy));
+
+ fifo_cascade #(.WIDTH(36), .SIZE(9)) ctrl_buffering(
+ .clk(fifo_clk), .reset(fifo_rst), .clear(1'b0),
+ .datain(ctrlb_data), .src_rdy_i(ctrlb_src_rdy), .dst_rdy_o(ctrlb_dst_rdy),
+ .dataout(ctrl_data), .src_rdy_o(ctrl_src_rdy), .dst_rdy_i(ctrl_dst_rdy)
+ );
// ////////////////////////////////////////////
- // Test support, traffic generator, loopback, etc.
-
- // RX side muxes test data into the same stream
- wire [35:0] loopbackrx_data, testrx_data;
- wire [35:0] loopbacktx_data, testtx_data;
- wire loopbackrx_src_rdy, loopbackrx_dst_rdy;
- wire loopbacktx_src_rdy, loopbacktx_dst_rdy;
- wire sel_testtx = test_ctrl[0];
-
- fifo36_mux rx_test_mux_lvl_2
- (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_rx),
- .data0_i(loopbackrx_data), .src0_rdy_i(loopbackrx_src_rdy), .dst0_rdy_o(loopbackrx_dst_rdy),
- .data1_i(rx_data_i), .src1_rdy_i(rx_src_rdy_i), .dst1_rdy_o(rx_dst_rdy_o),
- .data_o(rx_data), .src_rdy_o(rx_src_rdy), .dst_rdy_i(rx_dst_rdy));
-
- fifo_short #(.WIDTH(36)) loopback_fifo
- (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_tx | clear_rx),
- .datain(loopbacktx_data), .src_rdy_i(loopbacktx_src_rdy), .dst_rdy_o(loopbacktx_dst_rdy),
- .dataout(loopbackrx_data), .src_rdy_o(loopbackrx_src_rdy), .dst_rdy_i(loopbackrx_dst_rdy));
-
- // Crossbar used as a demux for switching TX stream to main DSP or to test logic
- crossbar36 tx_crossbar_lvl_1
- (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_tx),
- .cross(sel_testtx),
- .data0_i(tx_data), .src0_rdy_i(tx_src_rdy), .dst0_rdy_o(tx_dst_rdy),
- .data1_i(tx_data), .src1_rdy_i(1'b0), .dst1_rdy_o(), // No 2nd input
- .data0_o(tx_data_o), .src0_rdy_o(tx_src_rdy_o), .dst0_rdy_i(tx_dst_rdy_i),
- .data1_o(loopbacktx_data), .src1_rdy_o(loopbacktx_src_rdy), .dst1_rdy_i(loopbacktx_dst_rdy) );
-
- assign debug = {
- EM_D, //16
+ // CTRL RX Data Path
+
+ wire [17:0] resp18_data;
+ wire resp18_src_rdy, resp18_dst_rdy;
+ wire [35:0] respb_data;
+ wire respb_src_rdy, respb_dst_rdy;
+ wire resp_dummy;
+
+ fifo_cascade #(.WIDTH(36), .SIZE(9)) resp_buffering(
+ .clk(fifo_clk), .reset(fifo_rst), .clear(1'b0),
+ .datain(resp_data), .src_rdy_i(resp_src_rdy), .dst_rdy_o(resp_dst_rdy),
+ .dataout(respb_data), .src_rdy_o(respb_src_rdy), .dst_rdy_i(respb_dst_rdy)
+ );
+
+ fifo36_to_fifo19 #(.LE(1)) resp_f36_to_f19 // Little endian because ARM is LE
+ (.clk(fifo_clk), .reset(fifo_rst), .clear(1'b0),
+ .f36_datain(respb_data), .f36_src_rdy_i(respb_src_rdy), .f36_dst_rdy_o(respb_dst_rdy),
+ .f19_dataout({resp_dummy,resp18_data}), .f19_src_rdy_o(resp18_src_rdy), .f19_dst_rdy_i(resp18_dst_rdy) );
+
+ fifo_to_gpmc #(.ADDR_WIDTH(ADDR_WIDTH), .LAST_ADDR(10'h00f)) resp_fifo_to_gpmc
+ (.clk(fifo_clk), .reset(fifo_rst), .clear(1'b0), .arst(fifo_rst | arst),
+ .data_i(resp18_data), .src_rdy_i(resp18_src_rdy), .dst_rdy_o(resp18_dst_rdy),
+ .EM_D(EM_D_ctrl), .EM_A(EM_A), .EM_CLK(EM_CLK), .EM_OE(~EM_NCS6 & ~EM_NOE),
+ .data_available(resp_have_data));
+
+ assign debug = {
+ EM_D,
+ //resp18_data[15:0], //16
EM_A, //10
- EM_CLK, EM_NCS4, EM_NWE, EM_NOE, //4
- EM_NCS6, wb_ack_i
- };
+ //resp18_data[17:16], resp18_src_rdy, resp18_dst_rdy, //4
+ EM_NCS4, EM_NCS6, EM_NWE, EM_NOE, //4
+ EM_CLK, resp_have_data //2
+ };
endmodule // gpmc
diff --git a/fpga/usrp2/gpmc/gpmc_to_fifo.v b/fpga/usrp2/gpmc/gpmc_to_fifo.v
index cfc5aaa8b..3932b81ac 100644
--- a/fpga/usrp2/gpmc/gpmc_to_fifo.v
+++ b/fpga/usrp2/gpmc/gpmc_to_fifo.v
@@ -1,5 +1,5 @@
//
-// Copyright 2011 Ettus Research LLC
+// Copyright 2011-2012 Ettus Research LLC
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -22,7 +22,7 @@
// The GPMC is asynchronously alerted when a BRAM page is available.
//
// EM_CLK:
-// A GPMC read transaction consists of one EM_CLK cycle (idle low).
+// A GPMC write transaction consists of one EM_CLK cycle (idle low).
//
// EM_WE:
// Write enable is actually the combination of ~NWE & ~NCS.
@@ -36,7 +36,7 @@
////////////////////////////////////////////////////////////////////////
module gpmc_to_fifo
- #(parameter PTR_WIDTH = 2, parameter ADDR_WIDTH = 10)
+ #(parameter PTR_WIDTH = 2, parameter ADDR_WIDTH = 10, parameter XFER_OFFSET = 2)
(input [15:0] EM_D, input [ADDR_WIDTH:1] EM_A, input EM_CLK, input EM_WE,
input clk, input reset, input clear, input arst,
output [17:0] data_o, output src_rdy_o, input dst_rdy_i,
@@ -45,17 +45,20 @@ module gpmc_to_fifo
//states for the GPMC side of things
wire [17:0] data_i;
reg gpmc_state;
- reg [ADDR_WIDTH:1] last_addr;
+ reg [15:0] vita_len;
+ reg [ADDR_WIDTH:1] addr;
+ wire [ADDR_WIDTH:1] last_addr = {vita_len[ADDR_WIDTH-2:0], 1'b0} - 1'b1 + XFER_OFFSET;
reg [PTR_WIDTH:0] gpmc_ptr, next_gpmc_ptr;
localparam GPMC_STATE_START = 0;
localparam GPMC_STATE_FILL = 1;
//states for the FIFO side of things
- reg fifo_state;
+ reg [1:0] fifo_state;
reg [ADDR_WIDTH-1:0] counter;
reg [PTR_WIDTH:0] fifo_ptr;
localparam FIFO_STATE_CLAIM = 0;
localparam FIFO_STATE_EMPTY = 1;
+ localparam FIFO_STATE_PRE = 2;
//------------------------------------------------------------------
// State machine to control the data from GPMC to BRAM
@@ -65,14 +68,16 @@ module gpmc_to_fifo
gpmc_state <= GPMC_STATE_START;
gpmc_ptr <= 0;
next_gpmc_ptr <= 0;
+ addr <= 0;
end
else if (EM_WE) begin
+ addr <= EM_A + 1;
case(gpmc_state)
GPMC_STATE_START: begin
- if (EM_A == 2) begin
+ if (data_i[16]) begin
gpmc_state <= GPMC_STATE_FILL;
- last_addr <= {EM_D[ADDR_WIDTH-2:0], 1'b0} - 1'b1 + 2;
+ vita_len <= EM_D;
next_gpmc_ptr <= gpmc_ptr + 1;
end
end
@@ -81,6 +86,7 @@ module gpmc_to_fifo
if (data_i[17]) begin
gpmc_state <= GPMC_STATE_START;
gpmc_ptr <= next_gpmc_ptr;
+ addr <= 0;
end
end
@@ -105,6 +111,7 @@ module gpmc_to_fifo
cross_clock_reader #(.WIDTH(PTR_WIDTH+1)) read_next_gpmc_ptr
(.clk(clk), .rst(reset | clear), .in(next_gpmc_ptr), .out(safe_next_gpmc_ptr));
+ wire [PTR_WIDTH:0] fifo_ptr_next = fifo_ptr + 1;
always @(posedge clk)
if (reset | clear) have_space <= 0;
else have_space <= (fifo_ptr ^ (1 << PTR_WIDTH)) != safe_next_gpmc_ptr;
@@ -116,22 +123,28 @@ module gpmc_to_fifo
if (reset | clear) begin
fifo_state <= FIFO_STATE_CLAIM;
fifo_ptr <= 0;
- counter <= 2;
+ counter <= XFER_OFFSET;
end
else begin
case(fifo_state)
FIFO_STATE_CLAIM: begin
- if (bram_available_to_empty) fifo_state <= FIFO_STATE_EMPTY;
- counter <= 2;
+ if (bram_available_to_empty && data_o[16]) fifo_state <= FIFO_STATE_PRE;
+ counter <= XFER_OFFSET;
+ end
+
+ FIFO_STATE_PRE: begin
+ fifo_state <= FIFO_STATE_EMPTY;
+ counter <= counter + 1;
end
FIFO_STATE_EMPTY: begin
if (src_rdy_o && dst_rdy_i && data_o[17]) begin
fifo_state <= FIFO_STATE_CLAIM;
fifo_ptr <= fifo_ptr + 1;
+ counter <= XFER_OFFSET;
end
- if (src_rdy_o && dst_rdy_i) begin
+ else if (src_rdy_o && dst_rdy_i) begin
counter <= counter + 1;
end
end
@@ -140,18 +153,20 @@ module gpmc_to_fifo
end
end //always
+ wire enable = (fifo_state != FIFO_STATE_EMPTY) || dst_rdy_i;
+
assign src_rdy_o = fifo_state == FIFO_STATE_EMPTY;
//assign data and frame bits to bram input
assign data_i[15:0] = EM_D;
- assign data_i[16] = (gpmc_state == GPMC_STATE_START);
- assign data_i[17] = (EM_A == last_addr);
+ assign data_i[16] = (addr == XFER_OFFSET);
+ assign data_i[17] = (addr == last_addr);
//instantiate dual ported bram for async read + write
ram_2port #(.DWIDTH(18),.AWIDTH(PTR_WIDTH + ADDR_WIDTH)) async_fifo_bram
(.clka(~EM_CLK),.ena(1'b1),.wea(EM_WE),
- .addra({gpmc_ptr[PTR_WIDTH-1:0], EM_A}),.dia(data_i),.doa(),
- .clkb(~clk),.enb(1'b1),.web(1'b0),
+ .addra({gpmc_ptr[PTR_WIDTH-1:0], addr}),.dia(data_i),.doa(),
+ .clkb(clk),.enb(enable),.web(1'b0),
.addrb({fifo_ptr[PTR_WIDTH-1:0], counter}),.dib(18'h3ffff),.dob(data_o));
endmodule // gpmc_to_fifo
diff --git a/fpga/usrp2/gpmc/gpmc_wb.v b/fpga/usrp2/gpmc/gpmc_wb.v
deleted file mode 100644
index 4d368ca94..000000000
--- a/fpga/usrp2/gpmc/gpmc_wb.v
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// Copyright 2011 Ettus Research LLC
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see <http://www.gnu.org/licenses/>.
-//
-
-
-
-module gpmc_wb
- (input EM_CLK, input [15:0] EM_D_in, output [15:0] EM_D_out, input [10:1] EM_A, input [1:0] EM_NBE,
- input EM_WE, input EM_OE,
-
- input wb_clk, input wb_rst,
- output reg [10:0] wb_adr_o, output reg [15:0] wb_dat_mosi, input [15:0] wb_dat_miso,
- output reg [1:0] wb_sel_o, output wb_cyc_o, output reg wb_stb_o, output reg wb_we_o, input wb_ack_i);
-
- // ////////////////////////////////////////////
- // Control Path, Wishbone bus bridge (wb master)
- reg [1:0] we_del, oe_del;
-
- // Synchronize the async control signals
- always @(posedge wb_clk)
- if (wb_rst) begin
- we_del <= 2'b0;
- oe_del <= 2'b0;
- end
- else begin
- we_del <= { we_del[0], EM_WE };
- oe_del <= { oe_del[0], EM_OE };
- end
-
- wire writing = we_del == 2'b01;
- wire reading = oe_del == 2'b01;
-
- always @(posedge wb_clk)
- if(writing || reading)
- wb_adr_o <= { EM_A, 1'b0 };
-
- always @(posedge wb_clk)
- if(writing)
- begin
- wb_dat_mosi <= EM_D_in;
- wb_sel_o <= ~EM_NBE;
- end
-
- reg [15:0] EM_D_hold;
-
- always @(posedge wb_clk)
- if(wb_ack_i)
- EM_D_hold <= wb_dat_miso;
-
- assign EM_D_out = wb_ack_i ? wb_dat_miso : EM_D_hold;
-
- assign wb_cyc_o = wb_stb_o;
-
- always @(posedge wb_clk)
- if(writing)
- wb_we_o <= 1;
- else if(wb_ack_i) // Turn off we when done. Could also use we_del[0], others...
- wb_we_o <= 0;
-
- always @(posedge wb_clk)
- if(writing || reading)
- wb_stb_o <= 1;
- else if(wb_ack_i)
- wb_stb_o <= 0;
-
-endmodule // gpmc_wb
diff --git a/fpga/usrp2/models/DCM_SP.v b/fpga/usrp2/models/DCM_SP.v
new file mode 100644
index 000000000..2142fa736
--- /dev/null
+++ b/fpga/usrp2/models/DCM_SP.v
@@ -0,0 +1,1244 @@
+// $Header: /devl/xcs/repo/env/Databases/CAEInterfaces/verunilibs/data/unisims/DCM_SP.v,v 1.9.4.3 2007/04/11 20:30:19 yanx Exp $
+///////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 1995/2004 Xilinx, Inc.
+// All Right Reserved.
+///////////////////////////////////////////////////////////////////////////////
+// ____ ____
+// / /\/ /
+// /___/ \ / Vendor : Xilinx
+// \ \ \/ Version : 9.2i (J.36)
+// \ \ Description : Xilinx Function Simulation Library Component
+// / / Digital Clock Manager
+// /___/ /\ Filename : DCM_SP.v
+// \ \ / \ Timestamp :
+// \___\/\___\
+//
+// Revision:
+// 02/28/06 - Initial version.
+// 05/09/06 - Add clkin_ps_mkup and clkin_ps_mkup_win for phase shifting (CR 229789).
+// 06/14/06 - Add clkin_ps_mkup_flag for multiple cycle delays (CR233283).
+// 07/21/06 - Change range of variable phase shifting to +/- integer of 20*(Period-3ns).
+// Give warning not support initial phase shifting for variable phase shifting.
+// (CR 235216).
+// 09/22/06 - Add lock_period and lock_fb to clkfb_div block (CR 418722).
+// 12/19/06 - Add clkfb_div_en for clkfb2x divider (CR431210).
+// 04/06/07 - Enable the clock out in clock low time after reset in model
+// clock_divide_by_2 (CR 437471).
+// End Revision
+
+
+`timescale 1 ps / 1 ps
+
+module DCM_SP (
+ CLK0, CLK180, CLK270, CLK2X, CLK2X180, CLK90,
+ CLKDV, CLKFX, CLKFX180, LOCKED, PSDONE, STATUS,
+ CLKFB, CLKIN, DSSEN, PSCLK, PSEN, PSINCDEC, RST);
+
+parameter CLKDV_DIVIDE = 2.0;
+parameter integer CLKFX_DIVIDE = 1;
+parameter integer CLKFX_MULTIPLY = 4;
+parameter CLKIN_DIVIDE_BY_2 = "FALSE";
+parameter CLKIN_PERIOD = 10.0; // non-simulatable
+parameter CLKOUT_PHASE_SHIFT = "NONE";
+parameter CLK_FEEDBACK = "1X";
+parameter DESKEW_ADJUST = "SYSTEM_SYNCHRONOUS"; // non-simulatable
+parameter DFS_FREQUENCY_MODE = "LOW";
+parameter DLL_FREQUENCY_MODE = "LOW";
+parameter DSS_MODE = "NONE"; // non-simulatable
+parameter DUTY_CYCLE_CORRECTION = "TRUE";
+parameter FACTORY_JF = 16'hC080; // non-simulatable
+parameter integer MAXPERCLKIN = 1000000; // non-modifiable simulation parameter
+parameter integer MAXPERPSCLK = 100000000; // non-modifiable simulation parameter
+parameter integer PHASE_SHIFT = 0;
+parameter integer SIM_CLKIN_CYCLE_JITTER = 300; // non-modifiable simulation parameter
+parameter integer SIM_CLKIN_PERIOD_JITTER = 1000; // non-modifiable simulation parameter
+parameter STARTUP_WAIT = "FALSE"; // non-simulatable
+
+
+localparam PS_STEP = 25;
+
+input CLKFB, CLKIN, DSSEN;
+input PSCLK, PSEN, PSINCDEC, RST;
+
+output CLK0, CLK180, CLK270, CLK2X, CLK2X180, CLK90;
+output CLKDV, CLKFX, CLKFX180, LOCKED, PSDONE;
+output [7:0] STATUS;
+
+reg CLK0, CLK180, CLK270, CLK2X, CLK2X180, CLK90;
+reg CLKDV, CLKFX, CLKFX180;
+
+wire locked_out_out;
+wire clkfb_in, clkin_in, dssen_in;
+wire psclk_in, psen_in, psincdec_in, rst_in;
+reg clk0_out;
+reg clk2x_out, clkdv_out;
+reg clkfx_out, clkfx180_en;
+reg rst_flag;
+reg locked_out, psdone_out, ps_overflow_out, ps_lock;
+reg clkfb_div, clkfb_chk, clkfb_div_en;
+integer clkdv_cnt;
+
+reg [1:0] clkfb_type;
+reg [8:0] divide_type;
+reg clkin_type;
+reg [1:0] ps_type;
+reg [3:0] deskew_adjust_mode;
+reg dfs_mode_type;
+reg dll_mode_type;
+reg clk1x_type;
+integer ps_in;
+
+reg lock_period, lock_delay, lock_clkin, lock_clkfb;
+reg first_time_locked;
+reg en_status;
+reg ps_overflow_out_ext;
+reg clkin_lost_out_ext;
+reg clkfx_lost_out_ext;
+reg [1:0] lock_out;
+reg lock_out1_neg;
+reg lock_fb, lock_ps, lock_ps_dly, lock_fb_dly, lock_fb_dly_tmp;
+reg fb_delay_found;
+reg clock_stopped;
+reg clkin_chkin, clkfb_chkin;
+
+wire chk_enable, chk_rst;
+wire clkin_div;
+wire lock_period_pulse;
+wire lock_period_dly, lock_period_dly1;
+
+reg clkin_ps, clkin_ps_tmp, clkin_ps_mkup, clkin_ps_mkup_win, clkin_ps_mkup_flag;
+reg clkin_fb;
+
+time FINE_SHIFT_RANGE;
+//time ps_delay, ps_delay_init, ps_delay_md, ps_delay_all, ps_max_range;
+integer ps_delay, ps_delay_init, ps_delay_md, ps_delay_all, ps_max_range;
+integer ps_delay_last;
+integer ps_acc;
+time clkin_edge;
+time clkin_div_edge;
+time clkin_ps_edge;
+time delay_edge;
+time clkin_period [2:0];
+time period;
+integer period_int, period_int2, period_int3, period_ps_tmp;
+time period_div;
+integer period_orig_int;
+time period_orig;
+time period_ps;
+time clkout_delay;
+time fb_delay;
+time period_fx, remain_fx;
+time period_dv_high, period_dv_low;
+time cycle_jitter, period_jitter;
+
+reg clkin_window, clkfb_window;
+reg [2:0] rst_reg;
+reg [12:0] numerator, denominator, gcd;
+reg [23:0] i, n, d, p;
+
+reg notifier;
+
+initial begin
+ #1;
+ if ($realtime == 0) begin
+ $display ("Simulator Resolution Error : Simulator resolution is set to a value greater than 1 ps.");
+ $display ("In order to simulate the DCM_SP, the simulator resolution must be set to 1ps or smaller.");
+ $finish;
+ end
+end
+
+initial begin
+ case (2.0)
+ 1.5 : divide_type = 'd3;
+ 2.0 : divide_type = 'd4;
+ 2.5 : divide_type = 'd5;
+ 3.0 : divide_type = 'd6;
+ 3.5 : divide_type = 'd7;
+ 4.0 : divide_type = 'd8;
+ 4.5 : divide_type = 'd9;
+ 5.0 : divide_type = 'd10;
+ 5.5 : divide_type = 'd11;
+ 6.0 : divide_type = 'd12;
+ 6.5 : divide_type = 'd13;
+ 7.0 : divide_type = 'd14;
+ 7.5 : divide_type = 'd15;
+ 8.0 : divide_type = 'd16;
+ 9.0 : divide_type = 'd18;
+ 10.0 : divide_type = 'd20;
+ 11.0 : divide_type = 'd22;
+ 12.0 : divide_type = 'd24;
+ 13.0 : divide_type = 'd26;
+ 14.0 : divide_type = 'd28;
+ 15.0 : divide_type = 'd30;
+ 16.0 : divide_type = 'd32;
+ default : begin
+ $display("Attribute Syntax Error : The attribute CLKDV_DIVIDE on DCM_SP instance %m is set to %0.1f. Legal values for this attribute are 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, or 16.0.", CLKDV_DIVIDE);
+ $finish;
+ end
+ endcase
+
+ if ((CLKFX_DIVIDE <= 0) || (32 < CLKFX_DIVIDE)) begin
+ $display("Attribute Syntax Error : The attribute CLKFX_DIVIDE on DCM_SP instance %m is set to %d. Legal values for this attribute are 1 ... 32.", CLKFX_DIVIDE);
+ $finish;
+ end
+
+ if ((CLKFX_MULTIPLY <= 1) || (32 < CLKFX_MULTIPLY)) begin
+ $display("Attribute Syntax Error : The attribute CLKFX_MULTIPLY on DCM_SP instance %m is set to %d. Legal values for this attribute are 2 ... 32.", CLKFX_MULTIPLY);
+ $finish;
+ end
+
+ case (CLKIN_DIVIDE_BY_2)
+ "false" : clkin_type = 0;
+ "FALSE" : clkin_type = 0;
+ "true" : clkin_type = 1;
+ "TRUE" : clkin_type = 1;
+ default : begin
+ $display("Attribute Syntax Error : The attribute CLKIN_DIVIDE_BY_2 on DCM_SP instance %m is set to %s. Legal values for this attribute are TRUE or FALSE.", CLKIN_DIVIDE_BY_2);
+ $finish;
+ end
+ endcase
+
+ case (CLKOUT_PHASE_SHIFT)
+ "NONE" : begin
+ ps_in = 256;
+ ps_type = 0;
+ end
+ "none" : begin
+ ps_in = 256;
+ ps_type = 0;
+ end
+ "FIXED" : begin
+ ps_in = PHASE_SHIFT + 256;
+ ps_type = 1;
+ end
+ "fixed" : begin
+ ps_in = PHASE_SHIFT + 256;
+ ps_type = 1;
+ end
+ "VARIABLE" : begin
+ ps_in = PHASE_SHIFT + 256;
+ ps_type = 2;
+ end
+ "variable" : begin
+ ps_in = PHASE_SHIFT + 256;
+ ps_type = 2;
+ if (PHASE_SHIFT != 0)
+ $display("Attribute Syntax Warning : The attribute PHASE_SHIFT on DCM_SP instance %m is set to %d. The maximum variable phase shift range is only valid when initial phase shift PHASE_SHIFT is zero.", PHASE_SHIFT);
+ end
+ default : begin
+ $display("Attribute Syntax Error : The attribute CLKOUT_PHASE_SHIFT on DCM_SP instance %m is set to %s. Legal values for this attribute are NONE, FIXED or VARIABLE.", CLKOUT_PHASE_SHIFT);
+ $finish;
+ end
+ endcase
+
+
+ case (CLK_FEEDBACK)
+ "none" : clkfb_type = 2'b00;
+ "NONE" : clkfb_type = 2'b00;
+ "1x" : clkfb_type = 2'b01;
+ "1X" : clkfb_type = 2'b01;
+ "2x" : clkfb_type = 2'b10;
+ "2X" : clkfb_type = 2'b10;
+ default : begin
+ $display("Attribute Syntax Error : The attribute CLK_FEEDBACK on DCM_SP instance %m is set to %s. Legal values for this attribute are NONE, 1X or 2X.", CLK_FEEDBACK);
+ $finish;
+ end
+ endcase
+
+ case (DESKEW_ADJUST)
+ "source_synchronous" : deskew_adjust_mode = 8;
+ "SOURCE_SYNCHRONOUS" : deskew_adjust_mode = 8;
+ "system_synchronous" : deskew_adjust_mode = 11;
+ "SYSTEM_SYNCHRONOUS" : deskew_adjust_mode = 11;
+ "0" : deskew_adjust_mode = 0;
+ "1" : deskew_adjust_mode = 1;
+ "2" : deskew_adjust_mode = 2;
+ "3" : deskew_adjust_mode = 3;
+ "4" : deskew_adjust_mode = 4;
+ "5" : deskew_adjust_mode = 5;
+ "6" : deskew_adjust_mode = 6;
+ "7" : deskew_adjust_mode = 7;
+ "8" : deskew_adjust_mode = 8;
+ "9" : deskew_adjust_mode = 9;
+ "10" : deskew_adjust_mode = 10;
+ "11" : deskew_adjust_mode = 11;
+ "12" : deskew_adjust_mode = 12;
+ "13" : deskew_adjust_mode = 13;
+ "14" : deskew_adjust_mode = 14;
+ "15" : deskew_adjust_mode = 15;
+ default : begin
+ $display("Attribute Syntax Error : The attribute DESKEW_ADJUST on DCM_SP instance %m is set to %s. Legal values for this attribute are SOURCE_SYNCHRONOUS, SYSTEM_SYNCHRONOUS or 0 ... 15.", DESKEW_ADJUST);
+ $finish;
+ end
+ endcase
+
+ case (DFS_FREQUENCY_MODE)
+ "high" : dfs_mode_type = 1;
+ "HIGH" : dfs_mode_type = 1;
+ "low" : dfs_mode_type = 0;
+ "LOW" : dfs_mode_type = 0;
+ default : begin
+ $display("Attribute Syntax Error : The attribute DFS_FREQUENCY_MODE on DCM_SP instance %m is set to %s. Legal values for this attribute are HIGH or LOW.", DFS_FREQUENCY_MODE);
+ $finish;
+ end
+ endcase
+
+ period_jitter = SIM_CLKIN_PERIOD_JITTER;
+ cycle_jitter = SIM_CLKIN_CYCLE_JITTER;
+
+ case (DLL_FREQUENCY_MODE)
+ "high" : dll_mode_type = 1;
+ "HIGH" : dll_mode_type = 1;
+ "low" : dll_mode_type = 0;
+ "LOW" : dll_mode_type = 0;
+ default : begin
+ $display("Attribute Syntax Error : The attribute DLL_FREQUENCY_MODE on DCM_SP instance %m is set to %s. Legal values for this attribute are HIGH or LOW.", DLL_FREQUENCY_MODE);
+ $finish;
+ end
+ endcase
+
+ if ((dll_mode_type ==1) && (clkfb_type == 2'b10)) begin
+ $display("Attribute Syntax Error : The attributes DLL_FREQUENCY_MODE on DCM_SP instance %m is set to %s and CLK_FEEDBACK is set to %s. CLK_FEEDBACK 2X is not supported when DLL_FREQUENCY_MODE is HIGH.", DLL_FREQUENCY_MODE, CLK_FEEDBACK);
+ $finish;
+ end
+
+ case (DSS_MODE)
+ "none" : ;
+ "NONE" : ;
+ default : begin
+ $display("Attribute Syntax Error : The attribute DSS_MODE on DCM_SP instance %m is set to %s. Legal values for this attribute is NONE.", DSS_MODE);
+ $finish;
+ end
+ endcase
+
+ case (DUTY_CYCLE_CORRECTION)
+ "false" : clk1x_type = 0;
+ "FALSE" : clk1x_type = 0;
+ "true" : clk1x_type = 1;
+ "TRUE" : clk1x_type = 1;
+ default : begin
+ $display("Attribute Syntax Error : The attribute DUTY_CYCLE_CORRECTION on DCM_SP instance %m is set to %s. Legal values for this attribute are TRUE or FALSE.", DUTY_CYCLE_CORRECTION);
+ $finish;
+ end
+ endcase
+
+ if ((PHASE_SHIFT < -255) || (PHASE_SHIFT > 255)) begin
+ $display("Attribute Syntax Error : The attribute PHASE_SHIFT on DCM_SP instance %m is set to %d. Legal values for this attribute are -255 ... 255.", PHASE_SHIFT);
+ $display("Error : PHASE_SHIFT = %d is not -255 ... 255.", PHASE_SHIFT);
+ $finish;
+ end
+
+ case (STARTUP_WAIT)
+ "false" : ;
+ "FALSE" : ;
+ "true" : ;
+ "TRUE" : ;
+ default : begin
+ $display("Attribute Syntax Error : The attribute STARTUP_WAIT on DCM_SP instance %m is set to %s. Legal values for this attribute are TRUE or FALSE.", STARTUP_WAIT);
+ $finish;
+ end
+ endcase
+end
+
+//
+// fx parameters
+//
+
+initial begin
+ gcd = 1;
+ for (i = 2; i <= CLKFX_MULTIPLY; i = i + 1) begin
+ if (((CLKFX_MULTIPLY % i) == 0) && ((CLKFX_DIVIDE % i) == 0))
+ gcd = i;
+ end
+ numerator = CLKFX_MULTIPLY / gcd;
+ denominator = CLKFX_DIVIDE / gcd;
+end
+
+//
+// input wire delays
+//
+
+buf b_clkin (clkin_in, CLKIN);
+buf b_clkfb (clkfb_in, CLKFB);
+buf b_dssen (dssen_in, DSSEN);
+buf b_psclk (psclk_in, PSCLK);
+buf b_psen (psen_in, PSEN);
+buf b_psincdec (psincdec_in, PSINCDEC);
+buf b_rst (rst_in, RST);
+buf #100 b_LOCKED (LOCKED, locked_out_out);
+buf #100 b_PSDONE (PSDONE, psdone_out);
+buf b_ps_overflow (STATUS[0], ps_overflow_out_ext);
+buf b_clkin_lost (STATUS[1], clkin_lost_out_ext);
+buf b_clkfx_lost (STATUS[2], clkfx_lost_out_ext);
+
+assign STATUS[7:3] = 5'b0;
+
+dcm_sp_clock_divide_by_2 i_clock_divide_by_2 (clkin_in, clkin_type, clkin_div, rst_in);
+
+dcm_sp_maximum_period_check #("CLKIN", MAXPERCLKIN) i_max_clkin (clkin_in, rst_in);
+dcm_sp_maximum_period_check #("PSCLK", MAXPERPSCLK) i_max_psclk (psclk_in, rst_in);
+
+dcm_sp_clock_lost i_clkin_lost (clkin_in, first_time_locked, clkin_lost_out, rst_in);
+dcm_sp_clock_lost i_clkfx_lost (CLKFX, first_time_locked, clkfx_lost_out, rst_in);
+
+always @(rst_in or en_status or clkfx_lost_out or clkin_lost_out or ps_overflow_out)
+ if (rst_in == 1 || en_status == 0) begin
+ ps_overflow_out_ext = 0;
+ clkin_lost_out_ext = 0;
+ clkfx_lost_out_ext = 0;
+ end
+ else
+ begin
+ ps_overflow_out_ext = ps_overflow_out;
+ clkin_lost_out_ext = clkin_lost_out;
+ clkfx_lost_out_ext = clkfx_lost_out;
+ end
+
+always @(posedge rst_in or posedge LOCKED)
+ if (rst_in == 1)
+ en_status <= 0;
+ else
+ en_status <= 1;
+
+
+always @(clkin_div)
+ clkin_ps_tmp <= #(ps_delay_md) clkin_div;
+
+always @(clkin_ps_tmp or clkin_ps_mkup or clkin_ps_mkup_win)
+ if (clkin_ps_mkup_win)
+ clkin_ps = clkin_ps_mkup;
+ else
+ clkin_ps = clkin_ps_tmp;
+
+always @(ps_delay_last or period_int or ps_delay) begin
+ period_int2 = 2 * period_int;
+ period_int3 = 3 * period_int;
+ if ((ps_delay_last >= period_int && ps_delay < period_int) ||
+ (ps_delay_last >= period_int2 && ps_delay < period_int2) ||
+ (ps_delay_last >= period_int3 && ps_delay < period_int3))
+ clkin_ps_mkup_flag = 1;
+ else
+ clkin_ps_mkup_flag = 0;
+end
+
+always @(posedge clkin_div or negedge clkin_div) begin
+ if (ps_type == 2'b10) begin
+ if ((ps_delay_last > 0 && ps_delay <= 0 ) || clkin_ps_mkup_flag == 1) begin
+ if (clkin_div) begin
+ clkin_ps_mkup_win <= 1;
+ clkin_ps_mkup <= 1;
+ #1;
+ @(negedge clkin_div) begin
+ clkin_ps_mkup_win <= 1;
+ clkin_ps_mkup <= 0;
+ end
+ end
+ else begin
+ clkin_ps_mkup_win <= 0;
+ clkin_ps_mkup <= 0;
+ #1;
+ @(posedge clkin_div) begin
+ clkin_ps_mkup_win <= 1;
+ clkin_ps_mkup <= 1;
+ end
+ @(negedge clkin_div) begin
+ clkin_ps_mkup_win <= 1;
+ clkin_ps_mkup <= 0;
+ end
+ end
+ end
+ else begin
+ clkin_ps_mkup_win <= 0;
+ clkin_ps_mkup <= 0;
+ end
+ ps_delay_last <= ps_delay;
+ end
+end
+
+always @(clkin_ps or lock_fb)
+ clkin_fb = clkin_ps & lock_fb;
+
+always @(negedge clkfb_in or posedge rst_in)
+ if (rst_in)
+ clkfb_div_en <= 0;
+ else
+ if (lock_fb_dly && lock_period && lock_fb && ~clkin_ps)
+ clkfb_div_en <= 1;
+
+always @(posedge clkfb_in or posedge rst_in)
+ if (rst_in)
+ clkfb_div <= 0;
+ else
+ if (clkfb_div_en )
+ clkfb_div <= ~clkfb_div;
+
+always @(clkfb_in or clkfb_div )
+ if (clkfb_type == 2'b10 )
+ clkfb_chk = clkfb_div;
+ else
+ clkfb_chk = clkfb_in & lock_fb_dly;
+
+always @(posedge clkin_fb or posedge chk_rst)
+ if (chk_rst)
+ clkin_chkin <= 0;
+ else
+ clkin_chkin <= 1;
+
+always @(posedge clkfb_chk or posedge chk_rst)
+ if (chk_rst)
+ clkfb_chkin <= 0;
+ else
+ clkfb_chkin <= 1;
+
+ assign chk_rst = (rst_in==1 || clock_stopped==1 ) ? 1 : 0;
+ assign chk_enable = (clkin_chkin == 1 && clkfb_chkin == 1 &&
+ lock_ps ==1 && lock_fb ==1 && lock_fb_dly == 1) ? 1 : 0;
+
+always @(posedge clkin_div or posedge rst_in)
+ if (rst_in) begin
+ period_div <= 0;
+ clkin_div_edge <= 0;
+ end
+ else
+ if ( clkin_div ==1 ) begin
+ clkin_div_edge <= $time;
+ if (($time - clkin_div_edge) <= (1.5 * period_div))
+ period_div <= $time - clkin_div_edge;
+ else if ((period_div == 0) && (clkin_div_edge != 0))
+ period_div <= $time - clkin_div_edge;
+ end
+
+always @(posedge clkin_ps or posedge rst_in)
+ if (rst_in) begin
+ period_ps <= 0;
+ clkin_ps_edge <= 0;
+ end
+ else
+ if (clkin_ps == 1 ) begin
+ clkin_ps_edge <= $time;
+ if (($time - clkin_ps_edge) <= (1.5 * period_ps))
+ period_ps <= $time - clkin_ps_edge;
+ else if ((period_ps == 0) && (clkin_ps_edge != 0))
+ period_ps <= $time - clkin_ps_edge;
+ end
+
+always @(posedge clkin_ps) begin
+ lock_ps <= lock_period;
+ lock_ps_dly <= lock_ps;
+ lock_fb <= lock_ps_dly;
+ lock_fb_dly_tmp <= lock_fb;
+end
+
+always @(negedge clkin_ps or posedge rst_in)
+ if (rst_in)
+ lock_fb_dly <= 1'b0;
+ else
+ lock_fb_dly <= #(period/4) lock_fb_dly_tmp;
+
+
+always @(period or fb_delay )
+ if (fb_delay == 0)
+ clkout_delay = 0;
+ else
+ clkout_delay = period - fb_delay;
+
+//
+// generate master reset signal
+//
+
+always @(posedge clkin_in) begin
+ rst_reg[0] <= rst_in;
+ rst_reg[1] <= rst_reg[0] & rst_in;
+ rst_reg[2] <= rst_reg[1] & rst_reg[0] & rst_in;
+end
+
+reg rst_tmp1, rst_tmp2;
+initial
+begin
+rst_tmp1 = 0;
+rst_tmp2 = 0;
+rst_flag = 0;
+end
+
+always @(rst_in)
+begin
+ if (rst_in)
+ rst_flag = 0;
+
+ rst_tmp1 = rst_in;
+ if (rst_tmp1 == 0 && rst_tmp2 == 1) begin
+ if ((rst_reg[2] & rst_reg[1] & rst_reg[0]) == 0) begin
+ rst_flag = 1;
+ $display("Input Error : RST on instance %m must be asserted for 3 CLKIN clock cycles.");
+ end
+ end
+ rst_tmp2 = rst_tmp1;
+end
+
+initial begin
+ CLK0 = 0;
+ CLK180 = 0;
+ CLK270 = 0;
+ CLK2X = 0;
+ CLK2X180 = 0;
+ CLK90 = 0;
+ CLKDV = 0;
+ CLKFX = 0;
+ CLKFX180 = 0;
+ clk0_out = 0;
+ clk2x_out = 0;
+ clkdv_out = 0;
+ clkdv_cnt = 0;
+ clkfb_window = 0;
+ clkfx_out = 0;
+ clkfx180_en = 0;
+ clkin_div_edge = 0;
+ clkin_period[0] = 0;
+ clkin_period[1] = 0;
+ clkin_period[2] = 0;
+ clkin_edge = 0;
+ clkin_ps_edge = 0;
+ clkin_window = 0;
+ clkout_delay = 0;
+ clock_stopped = 1;
+ fb_delay = 0;
+ fb_delay_found = 0;
+ lock_clkfb = 0;
+ lock_clkin = 0;
+ lock_delay = 0;
+ lock_fb = 0;
+ lock_fb_dly = 0;
+ lock_out = 2'b00;
+ lock_out1_neg = 0;
+ lock_period = 0;
+ lock_ps = 0;
+ lock_ps_dly = 0;
+ locked_out = 0;
+ period = 0;
+ period_int = 0;
+ period_int2 = 0;
+ period_int3 = 0;
+ period_div = 0;
+ period_fx = 0;
+ period_orig = 0;
+ period_orig_int = 0;
+ period_ps = 0;
+ psdone_out = 0;
+ ps_delay = 0;
+ ps_delay_md = 0;
+ ps_delay_init = 0;
+ ps_acc = 0;
+ ps_delay_all = 0;
+ ps_lock = 0;
+ ps_overflow_out = 0;
+ ps_overflow_out_ext = 0;
+ clkin_lost_out_ext = 0;
+ clkfx_lost_out_ext = 0;
+ rst_reg = 3'b000;
+ first_time_locked = 0;
+ en_status = 0;
+ clkfb_div = 0;
+ clkin_chkin = 0;
+ clkfb_chkin = 0;
+ clkin_ps_mkup = 0;
+ clkin_ps_mkup_win = 0;
+ clkin_ps_mkup_flag = 0;
+ ps_delay_last = 0;
+ clkin_ps_tmp = 0;
+end
+
+// RST less than 3 cycles, lock = x
+
+ assign locked_out_out = (rst_flag) ? 1'bx : locked_out;
+
+//
+// detect_first_time_locked
+//
+always @(posedge locked_out)
+ if (first_time_locked == 0)
+ first_time_locked <= 1;
+
+//
+// phase shift parameters
+//
+
+always @(posedge lock_period)
+ ps_delay_init <= ps_in * period_orig /256;
+
+
+always @(period) begin
+ period_int = period;
+ if (clkin_type==1)
+ period_ps_tmp = 2 * period;
+ else
+ period_ps_tmp = period;
+
+ if (period_ps_tmp > 3000)
+ ps_max_range = 20 * (period_ps_tmp - 3000)/1000;
+ else
+ ps_max_range = 0;
+end
+
+always @(ps_delay or rst_in or period_int or lock_period)
+ if ( rst_in)
+ ps_delay_md = 0;
+ else if (lock_period) begin
+ ps_delay_md = period_int + ps_delay % period_int;
+ end
+
+always @(posedge psclk_in or posedge rst_in or posedge lock_period_pulse)
+ if (rst_in) begin
+ ps_delay <= 0;
+ ps_overflow_out <= 0;
+ ps_acc <= 0;
+ end
+ else if (lock_period_pulse)
+ ps_delay <= ps_delay_init;
+ else
+ if (ps_type == 2'b10)
+ if (psen_in) begin
+ if (ps_lock == 1)
+ $display(" Warning : Please wait for PSDONE signal before adjusting the Phase Shift.");
+ else if (lock_ps) begin
+ if (psincdec_in == 1) begin
+ if (ps_acc > ps_max_range)
+ ps_overflow_out <= 1;
+ else begin
+ ps_delay <= ps_delay + PS_STEP;
+ ps_acc <= ps_acc + 1;
+ ps_overflow_out <= 0;
+ end
+ ps_lock <= 1;
+ end
+ else if (psincdec_in == 0) begin
+ if (ps_acc < -ps_max_range)
+ ps_overflow_out <= 1;
+ else begin
+ ps_delay <= ps_delay - PS_STEP;
+ ps_acc <= ps_acc - 1;
+ ps_overflow_out <= 0;
+ end
+ ps_lock <= 1;
+ end
+ end
+ end
+
+always @(posedge ps_lock) begin
+ @(posedge clkin_ps)
+ @(posedge psclk_in)
+ @(posedge psclk_in)
+ @(posedge psclk_in)
+ psdone_out <= 1;
+ @(posedge psclk_in)
+ psdone_out <= 0;
+ ps_lock <= 0;
+end
+
+//
+// determine clock period
+//
+
+always @(posedge clkin_div or negedge clkin_div or posedge rst_in)
+ if (rst_in == 1) begin
+ clkin_period[0] <= 0;
+ clkin_period[1] <= 0;
+ clkin_period[2] <= 0;
+ clkin_edge <= 0;
+ end
+ else
+ if (clkin_div == 1) begin
+ clkin_edge <= $time;
+ clkin_period[2] <= clkin_period[1];
+ clkin_period[1] <= clkin_period[0];
+ if (clkin_edge != 0)
+ clkin_period[0] <= $time - clkin_edge;
+ end
+ else if (clkin_div == 0)
+ if (lock_period == 1)
+ if (100000000 < clkin_period[0]/1000)
+ begin
+ end
+ else if ((period_orig * 2 < clkin_period[0]) && (clock_stopped == 0)) begin
+ clkin_period[0] <= clkin_period[1];
+ end
+
+always @(negedge clkin_div or posedge rst_in)
+ if (rst_in == 1) begin
+ lock_period <= 0;
+ clock_stopped <= 1;
+ end
+ else begin
+ if (lock_period == 1'b0) begin
+ if ((clkin_period[0] != 0) &&
+ (clkin_period[0] - cycle_jitter <= clkin_period[1]) &&
+ (clkin_period[1] <= clkin_period[0] + cycle_jitter) &&
+ (clkin_period[1] - cycle_jitter <= clkin_period[2]) &&
+ (clkin_period[2] <= clkin_period[1] + cycle_jitter)) begin
+ lock_period <= 1;
+ period_orig <= (clkin_period[0] +
+ clkin_period[1] +
+ clkin_period[2]) / 3;
+ period <= clkin_period[0];
+ end
+ end
+ else if (lock_period == 1'b1) begin
+ if (100000000 < (clkin_period[0] / 1000)) begin
+ $display(" Warning : CLKIN stopped toggling on instance %m exceeds %d ms. Current CLKIN Period = %1.3f ns.", 100, clkin_period[0] / 1000.0);
+ lock_period <= 0;
+ @(negedge rst_reg[2]);
+ end
+ else if ((period_orig * 2 < clkin_period[0]) && clock_stopped == 1'b0) begin
+ clock_stopped <= 1'b1;
+ end
+ else if ((clkin_period[0] < period_orig - period_jitter) ||
+ (period_orig + period_jitter < clkin_period[0])) begin
+ $display(" Warning : Input Clock Period Jitter on instance %m exceeds %1.3f ns. Locked CLKIN Period = %1.3f. Current CLKIN Period = %1.3f.", period_jitter / 1000.0, period_orig / 1000.0, clkin_period[0] / 1000.0);
+ lock_period <= 0;
+ @(negedge rst_reg[2]);
+ end
+ else if ((clkin_period[0] < clkin_period[1] - cycle_jitter) ||
+ (clkin_period[1] + cycle_jitter < clkin_period[0])) begin
+ $display(" Warning : Input Clock Cycle-Cycle Jitter on instance %m exceeds %1.3f ns. Previous CLKIN Period = %1.3f. Current CLKIN Period = %1.3f.", cycle_jitter / 1000.0, clkin_period[1] / 1000.0, clkin_period[0] / 1000.0);
+ lock_period <= 0;
+ @(negedge rst_reg[2]);
+ end
+ else begin
+ period <= clkin_period[0];
+ clock_stopped <= 1'b0;
+ end
+ end
+end
+
+ assign #1 lock_period_dly1 = lock_period;
+ assign #(period/2) lock_period_dly = lock_period_dly1;
+ assign lock_period_pulse = (lock_period_dly1==1 && lock_period_dly==0) ? 1 : 0;
+
+//
+// determine clock delay
+//
+
+//always @(posedge lock_period or posedge rst_in)
+always @(posedge lock_ps_dly or posedge rst_in)
+ if (rst_in) begin
+ fb_delay <= 0;
+ fb_delay_found <= 0;
+ end
+ else begin
+ if (lock_period && clkfb_type != 2'b00) begin
+ if (clkfb_type == 2'b01) begin
+ @(posedge CLK0 or rst_in)
+ delay_edge = $time;
+ end
+ else if (clkfb_type == 2'b10) begin
+ @(posedge CLK2X or rst_in)
+ delay_edge = $time;
+ end
+ @(posedge clkfb_in or rst_in) begin
+ fb_delay <= ($time - delay_edge) % period_orig;
+ fb_delay_found <= 1;
+ end
+ end
+ end
+
+//
+// determine feedback lock
+//
+
+always @(posedge clkfb_chk or posedge rst_in)
+ if (rst_in)
+ clkfb_window <= 0;
+ else begin
+ clkfb_window <= 1;
+ #cycle_jitter clkfb_window <= 0;
+ end
+
+always @(posedge clkin_fb or posedge rst_in)
+ if (rst_in)
+ clkin_window <= 0;
+ else begin
+ clkin_window <= 1;
+ #cycle_jitter clkin_window <= 0;
+ end
+
+always @(posedge clkin_fb or posedge rst_in)
+ if (rst_in)
+ lock_clkin <= 0;
+ else begin
+ #1
+ if ((clkfb_window && fb_delay_found) || (clkin_lost_out == 1'b1 && lock_out[0]==1'b1))
+ lock_clkin <= 1;
+ else
+ if (chk_enable==1)
+ lock_clkin <= 0;
+ end
+
+always @(posedge clkfb_chk or posedge rst_in)
+ if (rst_in)
+ lock_clkfb <= 0;
+ else begin
+ #1
+ if ((clkin_window && fb_delay_found) || (clkin_lost_out == 1'b1 && lock_out[0]==1'b1))
+ lock_clkfb <= 1;
+ else
+ if (chk_enable ==1)
+ lock_clkfb <= 0;
+ end
+
+always @(negedge clkin_fb or posedge rst_in)
+ if (rst_in)
+ lock_delay <= 0;
+ else
+ lock_delay <= lock_clkin || lock_clkfb;
+
+//
+// generate lock signal
+//
+
+always @(posedge clkin_ps or posedge rst_in)
+ if (rst_in) begin
+ lock_out <= 2'b0;
+ locked_out <=0;
+ end
+ else begin
+ if (clkfb_type == 2'b00)
+ lock_out[0] <= lock_period;
+ else
+ lock_out[0] <= lock_period & lock_delay & lock_fb;
+ lock_out[1] <= lock_out[0];
+ locked_out <= lock_out[1];
+ end
+
+always @(negedge clkin_ps or posedge rst_in)
+ if (rst_in)
+ lock_out1_neg <= 0;
+ else
+ lock_out1_neg <= lock_out[1];
+
+
+//
+// generate the clk1x_out
+//
+
+always @(posedge clkin_ps or negedge clkin_ps or posedge rst_in)
+ if (rst_in)
+ clk0_out <= 0;
+ else
+ if (clkin_ps ==1)
+ if (clk1x_type==1 && lock_out[0]) begin
+ clk0_out <= 1;
+ #(period / 2)
+ clk0_out <= 0;
+ end
+ else
+ clk0_out <= 1;
+ else
+ if (clkin_ps == 0 && ((clk1x_type && lock_out[0]) == 0 || (lock_out[0]== 1 && lock_out[1]== 0)))
+ clk0_out <= 0;
+
+//
+// generate the clk2x_out
+//
+
+always @(posedge clkin_ps or posedge rst_in)
+ if (rst_in)
+ clk2x_out <= 0;
+ else begin
+ clk2x_out <= 1;
+ #(period / 4)
+ clk2x_out <= 0;
+ #(period / 4)
+ clk2x_out <= 1;
+ #(period / 4)
+ clk2x_out <= 0;
+ end
+
+//
+// generate the clkdv_out
+//
+
+always @(posedge clkin_ps or negedge clkin_ps or posedge rst_in)
+ if (rst_in) begin
+ clkdv_out <= 1'b0;
+ clkdv_cnt <= 0;
+ end
+ else
+ if (lock_out1_neg) begin
+ if (clkdv_cnt >= divide_type -1)
+ clkdv_cnt <= 0;
+ else
+ clkdv_cnt <= clkdv_cnt + 1;
+
+ if (clkdv_cnt < divide_type /2)
+ clkdv_out <= 1'b1;
+ else
+ if ( (divide_type[0] == 1'b1) && dll_mode_type == 1'b0)
+ clkdv_out <= #(period/4) 1'b0;
+ else
+ clkdv_out <= 1'b0;
+ end
+
+
+//
+// generate fx output signal
+//
+
+always @(lock_period or period or denominator or numerator) begin
+ if (lock_period == 1'b1) begin
+ period_fx = (period * denominator) / (numerator * 2);
+ remain_fx = (period * denominator) % (numerator * 2);
+ end
+end
+
+always @(posedge clkin_ps or posedge clkin_lost_out or posedge rst_in )
+ if (rst_in == 1)
+ clkfx_out = 1'b0;
+ else if (clkin_lost_out == 1'b1 ) begin
+ if (locked_out == 1)
+ @(negedge rst_reg[2]);
+ end
+ else
+ if (lock_out[1] == 1) begin
+ clkfx_out = 1'b1;
+ for (p = 0; p < (numerator * 2 - 1); p = p + 1) begin
+ #(period_fx);
+ if (p < remain_fx)
+ #1;
+ clkfx_out = !clkfx_out;
+ end
+ if (period_fx > (period / 2)) begin
+ #(period_fx - (period / 2));
+ end
+ end
+
+//
+// generate all output signal
+//
+
+always @(rst_in)
+if (rst_in) begin
+ assign CLK0 = 0;
+ assign CLK90 = 0;
+ assign CLK180 = 0;
+ assign CLK270 = 0;
+ assign CLK2X = 0;
+ assign CLK2X180 =0;
+ assign CLKDV = 0;
+ assign CLKFX = 0;
+ assign CLKFX180 = 0;
+end
+else begin
+ deassign CLK0;
+ deassign CLK90;
+ deassign CLK180;
+ deassign CLK270;
+ deassign CLK2X;
+ deassign CLK2X180;
+ deassign CLKDV;
+ deassign CLKFX;
+ deassign CLKFX180;
+end
+
+always @(clk0_out) begin
+ CLK0 <= #(clkout_delay) clk0_out && (clkfb_type != 2'b00);
+ CLK90 <= #(clkout_delay + period / 4) clk0_out && !dll_mode_type && (clkfb_type != 2'b00);
+ CLK180 <= #(clkout_delay) ~clk0_out && (clkfb_type != 2'b00);
+ CLK270 <= #(clkout_delay + period / 4) ~clk0_out && !dll_mode_type && (clkfb_type != 2'b00);
+ end
+
+always @(clk2x_out) begin
+ CLK2X <= #(clkout_delay) clk2x_out && !dll_mode_type && (clkfb_type != 2'b00);
+ CLK2X180 <= #(clkout_delay) ~clk2x_out && !dll_mode_type && (clkfb_type != 2'b00);
+end
+
+always @(clkdv_out)
+ CLKDV <= #(clkout_delay) clkdv_out && (clkfb_type != 2'b00);
+
+always @(clkfx_out )
+ CLKFX <= #(clkout_delay) clkfx_out;
+
+always @( clkfx_out or first_time_locked or locked_out)
+ if ( ~first_time_locked)
+ CLKFX180 = 0;
+ else
+ CLKFX180 <= #(clkout_delay) ~clkfx_out;
+
+
+endmodule
+
+//////////////////////////////////////////////////////
+
+module dcm_sp_clock_divide_by_2 (clock, clock_type, clock_out, rst);
+input clock;
+input clock_type;
+input rst;
+output clock_out;
+
+reg clock_out;
+reg clock_div2;
+reg [2:0] rst_reg;
+wire clk_src;
+
+initial begin
+ clock_out = 1'b0;
+ clock_div2 = 1'b0;
+end
+
+always @(posedge clock)
+ clock_div2 <= ~clock_div2;
+
+always @(posedge clock) begin
+ rst_reg[0] <= rst;
+ rst_reg[1] <= rst_reg[0] & rst;
+ rst_reg[2] <= rst_reg[1] & rst_reg[0] & rst;
+end
+
+assign clk_src = (clock_type) ? clock_div2 : clock;
+
+always @(clk_src or rst or rst_reg)
+ if (rst == 1'b0)
+ clock_out = clk_src;
+ else if (rst == 1'b1) begin
+ clock_out = 1'b0;
+ @(negedge rst_reg[2]);
+ if (clk_src == 1'b1)
+ @(negedge clk_src);
+ end
+
+
+endmodule
+
+module dcm_sp_maximum_period_check (clock, rst);
+parameter clock_name = "";
+parameter maximum_period = 0;
+input clock;
+input rst;
+
+time clock_edge;
+time clock_period;
+
+initial begin
+ clock_edge = 0;
+ clock_period = 0;
+end
+
+always @(posedge clock) begin
+ clock_edge <= $time;
+// clock_period <= $time - clock_edge;
+ clock_period = $time - clock_edge;
+ if (clock_period > maximum_period ) begin
+ if (rst == 0)
+ $display(" Warning : Input clock period of %1.3f ns, on the %s port of instance %m exceeds allowed value of %1.3f ns at time %1.3f ns.", clock_period/1000.0, clock_name, maximum_period/1000.0, $time/1000.0);
+ end
+end
+endmodule
+
+module dcm_sp_clock_lost (clock, enable, lost, rst);
+input clock;
+input enable;
+input rst;
+output lost;
+
+time clock_edge;
+reg [63:0] period;
+reg clock_low, clock_high;
+reg clock_posedge, clock_negedge;
+reg lost_r, lost_f, lost;
+reg clock_second_pos, clock_second_neg;
+
+initial begin
+ clock_edge = 0;
+ clock_high = 0;
+ clock_low = 0;
+ lost_r = 0;
+ lost_f = 0;
+ period = 0;
+ clock_posedge = 0;
+ clock_negedge = 0;
+ clock_second_pos = 0;
+ clock_second_neg = 0;
+end
+
+always @(posedge clock or posedge rst)
+ if (rst==1)
+ period <= 0;
+ else begin
+ clock_edge <= $time;
+ if (period != 0 && (($time - clock_edge) <= (1.5 * period)))
+ period <= $time - clock_edge;
+ else if (period != 0 && (($time - clock_edge) > (1.5 * period)))
+ period <= 0;
+ else if ((period == 0) && (clock_edge != 0) && clock_second_pos == 1)
+ period <= $time - clock_edge;
+ end
+
+
+always @(posedge clock or posedge rst)
+ if (rst)
+ lost_r <= 0;
+ else
+ if (enable == 1 && clock_second_pos == 1) begin
+ #1;
+ if ( period != 0)
+ lost_r <= 0;
+ #((period * 9.1) / 10)
+ if ((clock_low != 1'b1) && (clock_posedge != 1'b1) && rst == 0)
+ lost_r <= 1;
+ end
+
+always @(posedge clock or negedge clock or posedge rst)
+ if (rst) begin
+ clock_second_pos <= 0;
+ clock_second_neg <= 0;
+ end
+ else if (clock)
+ clock_second_pos <= 1;
+ else if (~clock)
+ clock_second_neg <= 1;
+
+always @(negedge clock or posedge rst)
+ if (rst==1) begin
+ lost_f <= 0;
+ end
+ else begin
+ if (enable == 1 && clock_second_neg == 1) begin
+ if ( period != 0)
+ lost_f <= 0;
+ #((period * 9.1) / 10)
+ if ((clock_high != 1'b1) && (clock_negedge != 1'b1) && rst == 0)
+ lost_f <= 1;
+ end
+ end
+
+always @( lost_r or lost_f or enable)
+begin
+ if (enable == 1)
+ lost = lost_r | lost_f;
+ else
+ lost = 0;
+end
+
+
+always @(posedge clock or negedge clock or posedge rst)
+ if (rst==1) begin
+ clock_low <= 1'b0;
+ clock_high <= 1'b0;
+ clock_posedge <= 1'b0;
+ clock_negedge <= 1'b0;
+ end
+ else begin
+ if (clock ==1) begin
+ clock_low <= 1'b0;
+ clock_high <= 1'b1;
+ clock_posedge <= 1'b0;
+ clock_negedge <= 1'b1;
+ end
+ else if (clock == 0) begin
+ clock_low <= 1'b1;
+ clock_high <= 1'b0;
+ clock_posedge <= 1'b1;
+ clock_negedge <= 1'b0;
+ end
+end
+
+
+endmodule
diff --git a/fpga/usrp2/models/IBUFG.v b/fpga/usrp2/models/IBUFG.v
new file mode 100644
index 000000000..c21cc1dc8
--- /dev/null
+++ b/fpga/usrp2/models/IBUFG.v
@@ -0,0 +1,59 @@
+// $Header: /devl/xcs/repo/env/Databases/CAEInterfaces/verunilibs/data/unisims/IBUFG.v,v 1.7 2007/05/23 21:43:34 patrickp Exp $
+///////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 1995/2004 Xilinx, Inc.
+// All Right Reserved.
+///////////////////////////////////////////////////////////////////////////////
+// ____ ____
+// / /\/ /
+// /___/ \ / Vendor : Xilinx
+// \ \ \/ Version : 10.1
+// \ \ Description : Xilinx Functional Simulation Library Component
+// / / Input Clock Buffer
+// /___/ /\ Filename : IBUFG.v
+// \ \ / \ Timestamp : Thu Mar 25 16:42:24 PST 2004
+// \___\/\___\
+//
+// Revision:
+// 03/23/04 - Initial version.
+// 05/23/07 - Changed timescale to 1 ps / 1 ps.
+
+`timescale 1 ps / 1 ps
+
+
+module IBUFG (O, I);
+
+ parameter CAPACITANCE = "DONT_CARE";
+ parameter IBUF_DELAY_VALUE = "0";
+ parameter IOSTANDARD = "DEFAULT";
+
+ output O;
+ input I;
+
+ buf B1 (O, I);
+
+ initial begin
+
+ case (CAPACITANCE)
+
+ "LOW", "NORMAL", "DONT_CARE" : ;
+ default : begin
+ $display("Attribute Syntax Error : The attribute CAPACITANCE on IBUFG instance %m is set to %s. Legal values for this attribute are DONT_CARE, LOW or NORMAL.", CAPACITANCE);
+ $finish;
+ end
+
+ endcase
+
+
+ case (IBUF_DELAY_VALUE)
+
+ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16" : ;
+ default : begin
+ $display("Attribute Syntax Error : The attribute IBUF_DELAY_VALUE on IBUFG instance %m is set to %s. Legal values for this attribute are 0, 1, 2, ... or 16.", IBUF_DELAY_VALUE);
+ $finish;
+ end
+
+ endcase
+
+ end // initial begin
+
+endmodule
diff --git a/fpga/usrp2/models/IBUFGDS.v b/fpga/usrp2/models/IBUFGDS.v
new file mode 100644
index 000000000..01c108c8d
--- /dev/null
+++ b/fpga/usrp2/models/IBUFGDS.v
@@ -0,0 +1,87 @@
+// $Header: /devl/xcs/repo/env/Databases/CAEInterfaces/verunilibs/data/unisims/IBUFGDS.v,v 1.8 2007/07/26 23:22:55 fphillip Exp $
+///////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 1995/2004 Xilinx, Inc.
+// All Right Reserved.
+///////////////////////////////////////////////////////////////////////////////
+// ____ ____
+// / /\/ /
+// /___/ \ / Vendor : Xilinx
+// \ \ \/ Version : 10.1
+// \ \ Description : Xilinx Functional Simulation Library Component
+// / / Differential Signaling Input Clock Buffer
+// /___/ /\ Filename : IBUFGDS.v
+// \ \ / \ Timestamp : Thu Mar 25 16:42:24 PST 2004
+// \___\/\___\
+//
+// Revision:
+// 03/23/04 - Initial version.
+// 05/23/07 - Changed timescale to 1 ps / 1 ps.
+// 07/26/07 - Add else to handle x case for o_out (CR 424214).
+// End Revision
+
+
+`timescale 1 ps / 1 ps
+
+
+module IBUFGDS (O, I, IB);
+
+ parameter CAPACITANCE = "DONT_CARE";
+ parameter DIFF_TERM = "FALSE";
+ parameter IBUF_DELAY_VALUE = "0";
+ parameter IOSTANDARD = "DEFAULT";
+
+ output O;
+ input I, IB;
+
+ reg o_out;
+
+ buf b_0 (O, o_out);
+
+ initial begin
+
+ case (CAPACITANCE)
+
+ "LOW", "NORMAL", "DONT_CARE" : ;
+ default : begin
+ $display("Attribute Syntax Error : The attribute CAPACITANCE on IBUFGDS instance %m is set to %s. Legal values for this attribute are DONT_CARE, LOW or NORMAL.", CAPACITANCE);
+ $finish;
+ end
+
+ endcase
+
+
+ case (DIFF_TERM)
+
+ "TRUE", "FALSE" : ;
+ default : begin
+ $display("Attribute Syntax Error : The attribute DIFF_TERM on IBUFGDS instance %m is set to %s. Legal values for this attribute are TRUE or FALSE.", DIFF_TERM);
+ $finish;
+ end
+
+ endcase
+
+
+ case (IBUF_DELAY_VALUE)
+
+ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16" : ;
+ default : begin
+ $display("Attribute Syntax Error : The attribute IBUF_DELAY_VALUE on IBUFGDS instance %m is set to %s. Legal values for this attribute are 0, 1, 2, ... or 16.", IBUF_DELAY_VALUE);
+ $finish;
+ end
+
+ endcase
+
+ end
+
+ always @(I or IB) begin
+ if (I == 1'b1 && IB == 1'b0)
+ o_out <= I;
+ else if (I == 1'b0 && IB == 1'b1)
+ o_out <= I;
+ else if (I == 1'bx && IB == 1'bx)
+ o_out <= 1'bx;
+ end
+
+endmodule
+
+
diff --git a/fpga/usrp2/models/IDDR2.v b/fpga/usrp2/models/IDDR2.v
new file mode 100644
index 000000000..727f1c568
--- /dev/null
+++ b/fpga/usrp2/models/IDDR2.v
@@ -0,0 +1,172 @@
+// $Header: /devl/xcs/repo/env/Databases/CAEInterfaces/verunilibs/data/spartan4/IDDR2.v,v 1.1 2004/06/21 21:45:36 wloo Exp $
+///////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 1995/2004 Xilinx, Inc.
+// All Right Reserved.
+///////////////////////////////////////////////////////////////////////////////
+// ____ ____
+// / /\/ /
+// /___/ \ / Vendor : Xilinx
+// \ \ \/ Version : 10.1
+// \ \ Description : Xilinx Functional Simulation Library Component
+// / / Dual Data Rate Input D Flip-Flop
+// /___/ /\ Filename : IDDR2.v
+// \ \ / \ Timestamp : Thu Mar 25 16:43:51 PST 2004
+// \___\/\___\
+//
+// Revision:
+// 03/23/04 - Initial version.
+
+`timescale 1 ps / 1 ps
+
+module IDDR2 (Q0, Q1, C0, C1, CE, D, R, S);
+
+ output Q0;
+ output Q1;
+
+ input C0;
+ input C1;
+ input CE;
+ input D;
+ tri0 GSR = glbl.GSR;
+ input R;
+ input S;
+
+ parameter DDR_ALIGNMENT = "NONE";
+ parameter INIT_Q0 = 1'b0;
+ parameter INIT_Q1 = 1'b0;
+ parameter SRTYPE = "SYNC";
+
+ reg q0_out, q1_out;
+ reg q0_out_int, q1_out_int;
+ reg q0_c1_out_int, q1_c0_out_int;
+
+ buf buf_q0 (Q0, q0_out);
+ buf buf_q1 (Q1, q1_out);
+
+
+ initial begin
+
+ if ((INIT_Q0 != 1'b0) && (INIT_Q0 != 1'b1)) begin
+ $display("Attribute Syntax Error : The attribute INIT_Q0 on IDDR2 instance %m is set to %d. Legal values for this attribute are 0 or 1.", INIT_Q0);
+ $finish;
+ end
+
+ if ((INIT_Q1 != 1'b0) && (INIT_Q1 != 1'b1)) begin
+ $display("Attribute Syntax Error : The attribute INIT_Q0 on IDDR2 instance %m is set to %d. Legal values for this attribute are 0 or 1.", INIT_Q1);
+ $finish;
+ end
+
+ if ((DDR_ALIGNMENT != "C1") && (DDR_ALIGNMENT != "C0") && (DDR_ALIGNMENT != "NONE")) begin
+ $display("Attribute Syntax Error : The attribute DDR_ALIGNMENT on IDDR2 instance %m is set to %s. Legal values for this attribute are C0, C1 or NONE.", DDR_ALIGNMENT);
+ $finish;
+ end
+
+ if ((SRTYPE != "ASYNC") && (SRTYPE != "SYNC")) begin
+ $display("Attribute Syntax Error : The attribute SRTYPE on IDDR2 instance %m is set to %s. Legal values for this attribute are ASYNC or SYNC.", SRTYPE);
+ $finish;
+ end
+
+ end // initial begin
+
+
+ always @(GSR or R or S) begin
+
+ if (GSR == 1) begin
+
+ assign q0_out_int = INIT_Q0;
+ assign q1_out_int = INIT_Q1;
+ assign q0_c1_out_int = INIT_Q0;
+ assign q1_c0_out_int = INIT_Q1;
+
+ end
+ else begin
+
+ deassign q0_out_int;
+ deassign q1_out_int;
+ deassign q0_c1_out_int;
+ deassign q1_c0_out_int;
+
+ if (SRTYPE == "ASYNC") begin
+ if (R == 1) begin
+ assign q0_out_int = 0;
+ assign q1_out_int = 0;
+ assign q0_c1_out_int = 0;
+ assign q1_c0_out_int = 0;
+ end
+ else if (R == 0 && S == 1) begin
+ assign q0_out_int = 1;
+ assign q1_out_int = 1;
+ assign q0_c1_out_int = 1;
+ assign q1_c0_out_int = 1;
+ end
+ end // if (SRTYPE == "ASYNC")
+
+ end // if (GSR == 1'b0)
+
+ end // always @ (GSR or R or S)
+
+
+ always @(posedge C0) begin
+ if (R == 1 && SRTYPE == "SYNC") begin
+ q0_out_int <= 0;
+ q1_c0_out_int <= 0;
+ end
+ else if (R == 0 && S == 1 && SRTYPE == "SYNC") begin
+ q0_out_int <= 1;
+ q1_c0_out_int <= 1;
+ end
+ else if (CE == 1 && R == 0 && S == 0) begin
+ q0_out_int <= D;
+ q1_c0_out_int <= q1_out_int;
+ end
+ end // always @ (posedge C0)
+
+
+ always @(posedge C1) begin
+ if (R == 1 && SRTYPE == "SYNC") begin
+ q1_out_int <= 0;
+ q0_c1_out_int <= 0;
+ end
+ else if (R == 0 && S == 1 && SRTYPE == "SYNC") begin
+ q1_out_int <= 1;
+ q0_c1_out_int <= 1;
+ end
+ else if (CE == 1 && R == 0 && S == 0) begin
+ q1_out_int <= D;
+ q0_c1_out_int <= q0_out_int;
+ end
+ end // always @ (posedge C1)
+
+
+ always @(q0_out_int or q1_out_int or q1_c0_out_int or q0_c1_out_int) begin
+
+ case (DDR_ALIGNMENT)
+ "NONE" : begin
+ q0_out <= q0_out_int;
+ q1_out <= q1_out_int;
+ end
+ "C0" : begin
+ q0_out <= q0_out_int;
+ q1_out <= q1_c0_out_int;
+ end
+ "C1" : begin
+ q0_out <= q0_c1_out_int;
+ q1_out <= q1_out_int;
+ end
+ endcase // case(DDR_ALIGNMENT)
+
+ end // always @ (q0_out_int or q1_out_int or q1_c0_out_int or q0_c1_out_int)
+
+
+ specify
+
+ if (C0) (C0 => Q0) = (100, 100);
+ if (C0) (C0 => Q1) = (100, 100);
+ if (C1) (C1 => Q1) = (100, 100);
+ if (C1) (C1 => Q0) = (100, 100);
+ specparam PATHPULSE$ = 0;
+
+ endspecify
+
+endmodule // IDDR2
+
diff --git a/fpga/usrp2/models/ODDR2.v b/fpga/usrp2/models/ODDR2.v
new file mode 100644
index 000000000..67e71761d
--- /dev/null
+++ b/fpga/usrp2/models/ODDR2.v
@@ -0,0 +1,157 @@
+// $Header: /devl/xcs/repo/env/Databases/CAEInterfaces/verunilibs/data/spartan4/ODDR2.v,v 1.1 2004/06/21 21:45:36 wloo Exp $
+///////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 1995/2004 Xilinx, Inc.
+// All Right Reserved.
+///////////////////////////////////////////////////////////////////////////////
+// ____ ____
+// / /\/ /
+// /___/ \ / Vendor : Xilinx
+// \ \ \/ Version : 10.1
+// \ \ Description : Xilinx Functional Simulation Library Component
+// / / Dual Data Rate Output D Flip-Flop
+// /___/ /\ Filename : ODDR2.v
+// \ \ / \ Timestamp : Thu Mar 25 16:43:52 PST 2004
+// \___\/\___\
+//
+// Revision:
+// 03/23/04 - Initial version.
+
+`timescale 1 ps / 1 ps
+
+module ODDR2 (Q, C0, C1, CE, D0, D1, R, S);
+
+ output Q;
+
+ input C0;
+ input C1;
+ input CE;
+ input D0;
+ input D1;
+ tri0 GSR = glbl.GSR;
+ input R;
+ input S;
+
+ parameter DDR_ALIGNMENT = "NONE";
+ parameter INIT = 1'b0;
+ parameter SRTYPE = "SYNC";
+
+ reg q_out, q_d0_c1_out_int, q_d1_c0_out_int;
+
+ buf buf_q (Q, q_out);
+
+
+ initial begin
+
+ if ((INIT != 1'b0) && (INIT != 1'b1)) begin
+ $display("Attribute Syntax Error : The attribute INIT on ODDR2 instance %m is set to %d. Legal values for this attribute are 0 or 1.", INIT);
+ $finish;
+ end
+
+ if ((DDR_ALIGNMENT != "NONE") && (DDR_ALIGNMENT != "C0") && (DDR_ALIGNMENT != "C1")) begin
+ $display("Attribute Syntax Error : The attribute DDR_ALIGNMENT on ODDR2 instance %m is set to %s. Legal values for this attribute are NONE, C0 or C1.", DDR_ALIGNMENT);
+ $finish;
+ end
+
+ if ((SRTYPE != "ASYNC") && (SRTYPE != "SYNC")) begin
+ $display("Attribute Syntax Error : The attribute SRTYPE on ODDR2 instance %m is set to %s. Legal values for this attribute are ASYNC or SYNC.", SRTYPE);
+ $finish;
+ end
+
+ end // initial begin
+
+
+ always @(GSR or R or S) begin
+
+ if (GSR == 1) begin
+
+ assign q_out = INIT;
+ assign q_d0_c1_out_int = INIT;
+ assign q_d1_c0_out_int = INIT;
+
+ end
+ else begin
+
+ deassign q_out;
+ deassign q_d0_c1_out_int;
+ deassign q_d1_c0_out_int;
+
+ if (SRTYPE == "ASYNC") begin
+ if (R == 1) begin
+ assign q_out = 0;
+ assign q_d0_c1_out_int = 0;
+ assign q_d1_c0_out_int = 0;
+ end
+ else if (R == 0 && S == 1) begin
+ assign q_out = 1;
+ assign q_d0_c1_out_int = 1;
+ assign q_d1_c0_out_int = 1;
+ end
+ end // if (SRTYPE == "ASYNC")
+
+ end // if (GSR == 1'b0)
+
+ end // always @ (GSR or R or S)
+
+
+ always @(posedge C0) begin
+
+ if (R == 1 && SRTYPE == "SYNC") begin
+ q_out <= 0;
+ q_d1_c0_out_int <= 0;
+ end
+ else if (R == 0 && S == 1 && SRTYPE == "SYNC") begin
+ q_out <= 1;
+ q_d1_c0_out_int <= 1;
+ end
+ else if (CE == 1 && R == 0 && S == 0) begin
+
+ if (DDR_ALIGNMENT == "C1")
+ q_out <= q_d0_c1_out_int;
+ else begin
+ q_out <= D0;
+
+ if (DDR_ALIGNMENT == "C0")
+ q_d1_c0_out_int <= D1;
+ end
+
+ end // if (CE == 1 && R == 0 && S == 0)
+
+ end // always @ (posedge C0)
+
+
+ always @(posedge C1) begin
+
+ if (R == 1 && SRTYPE == "SYNC") begin
+ q_out <= 0;
+ q_d0_c1_out_int <= 0;
+ end
+ else if (R == 0 && S == 1 && SRTYPE == "SYNC") begin
+ q_out <= 1;
+ q_d0_c1_out_int <= 1;
+ end
+ else if (CE == 1 && R == 0 && S == 0) begin
+
+ if (DDR_ALIGNMENT == "C0")
+ q_out <= q_d1_c0_out_int;
+ else begin
+ q_out <= D1;
+
+ if (DDR_ALIGNMENT == "C1")
+ q_d0_c1_out_int <= D0;
+ end
+
+ end // if (CE == 1 && R == 0 && S == 0)
+
+ end // always @ (negedge c_in)
+
+
+ specify
+
+ if (C0) (C0 => Q) = (100, 100);
+ if (C1) (C1 => Q) = (100, 100);
+ specparam PATHPULSE$ = 0;
+
+ endspecify
+
+endmodule // ODDR2
+
diff --git a/fpga/usrp2/models/PLL_ADV.v b/fpga/usrp2/models/PLL_ADV.v
new file mode 100644
index 000000000..d6a26e541
--- /dev/null
+++ b/fpga/usrp2/models/PLL_ADV.v
@@ -0,0 +1,2142 @@
+// $Header: /devl/xcs/repo/env/Databases/CAEInterfaces/verunilibs/data/rainier/PLL_ADV.v,v 1.43.4.1 2007/12/07 01:25:16 yanx Exp $
+///////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 1995/2004 Xilinx, Inc.
+// All Right Reserved.
+///////////////////////////////////////////////////////////////////////////////
+// ____ ____
+// / /\/ /
+// /___/ \ / Vendor : Xilinx
+// \ \ \/ Version : 10.1
+// \ \ Description : Xilinx Function Simulation Library Component
+// / / Phase Lock Loop Clock
+// /___/ /\ Filename : PLL_ADV.v
+// \ \ / \ Timestamp : Thu Mar 25 16:44:07 PST 2004
+// \___\/\___\
+//
+// Revision:
+// 03/15/05 - Initial version.
+// 10/14/05 - Add REL pin.
+// 11/07/05 - Add PMCD.
+// 12/02/05 - Change parameter default values. Add DRP read/write.
+// 12/22/05 - CR 222805 222809 fix.
+// 01/03/06 - Change RST_DEASSER_CLK value to CLKIN1 and CLKFB (BT#735).
+// 01/11/06 - Remove GSR from reset logic of PLL (CR 223099).
+// 01/26/06 - Add reset to locked logic (CR224502).
+// 02/16/06 - Support -360 6o +360 phase shifting (CR 225765)
+// 03/10/06 - Add parameter type declaration (CR 226003)
+// 03/17/06 - Using assign/deassign to reset pll_locked_tmp2 and reduce
+// lock time by MD (CR 224502).
+// 04/19/06 - Change i to i1 and i2 in clkvco_lk. (CR230260).
+// 07/17/06 - Remove i2 and first 4 clkvco_lk cycle generation (CR234931).
+// 08/23/06 - Use clkout_en_tmp to generate clkout_en0; Use block statement to
+// reset clock stop counter and flag. (CR422250)
+// 09/19/06 - md_product update (CR 424286).
+// 09/27/06 - Add error check for RESET_ON_LOSS_OF_LOCK (CR 425255).
+// 11/10/06 - Keep 3 digits for real in duty cycle check function. (CR 428703).
+// 01/12/07 - Add CLKOUT_DESKEW_ADJUST parameters (CR 432189).
+// 03/30/07 - Fix error message for CLKSEL change in RST=0 (CR 436927).
+// 04/09/07 - Enhance error message for RESET_ON_LOSS_OF_LOCK (CR 437405).
+// 04/10/07 - Using assign/deassign to reset signals with # delay (CR 437660).
+// 05/22/07 - Add setup check for REL (438781).
+// 06/04/07 - Add wire declaration to internal signal.
+// 06/8/07 - Generate clkfb_tst when GSR=0;
+// - Chang VCOCLK_FREQ_MAX and VCOCLK_FREQ_MIN to parameter for simprim (BT1485).
+// 06/18/07 - Improve error message for VCO (CR ). Initialize DRP mem (CR ).
+// - Add CLKFBIN pulse width check (BT1476).
+// 06/28/07 - Initial DRP memory (CR 434042), Error message improve (CR 438250).
+// 07/11/07 - change daddr_in to 5 bits (CR 443757).
+// 08/02/07 - Remove numbers from CLKOUT DESKEW_ADJUST check (CR443161).
+// 08/21/07 - Not check CLKIN period when PMCD mode set (445101).
+// Fix DUTY_CYCLE_MAX formula in case of divider larger than O_MAX_HT_LT (CR445945).
+// Add warning if phase shift over pll ability (63 vco) (CR446037).
+// 09/20/07 - Seperate fb_delay and delay_edge to handle 0 fb_delay (CR448938)
+// 10/23/07 - Add warnings to initial phase shift calculation (CR448965)
+// 11/01/07 - Remove zero check for CLKOUTx dly register bit15-8 (CR434042)
+// 12/06/07 - Add I/O buf to simprim (CR456124)
+// End Revision
+
+
+`timescale 1 ps / 1 ps
+`define PLL_LOCK_TIME 7
+
+
+module PLL_ADV (
+ CLKFBDCM,
+ CLKFBOUT,
+ CLKOUT0,
+ CLKOUT1,
+ CLKOUT2,
+ CLKOUT3,
+ CLKOUT4,
+ CLKOUT5,
+ CLKOUTDCM0,
+ CLKOUTDCM1,
+ CLKOUTDCM2,
+ CLKOUTDCM3,
+ CLKOUTDCM4,
+ CLKOUTDCM5,
+ DO,
+ DRDY,
+ LOCKED,
+ CLKFBIN,
+ CLKIN1,
+ CLKIN2,
+ CLKINSEL,
+ DADDR,
+ DCLK,
+ DEN,
+ DI,
+ DWE,
+ REL,
+ RST
+);
+
+parameter BANDWIDTH = "OPTIMIZED";
+parameter CLKFBOUT_DESKEW_ADJUST = "NONE";
+parameter CLKOUT0_DESKEW_ADJUST = "NONE";
+parameter CLKOUT1_DESKEW_ADJUST = "NONE";
+parameter CLKOUT2_DESKEW_ADJUST = "NONE";
+parameter CLKOUT3_DESKEW_ADJUST = "NONE";
+parameter CLKOUT4_DESKEW_ADJUST = "NONE";
+parameter CLKOUT5_DESKEW_ADJUST = "NONE";
+parameter integer CLKFBOUT_MULT = 1;
+parameter real CLKFBOUT_PHASE = 0.0;
+parameter real CLKIN1_PERIOD = 0.000;
+parameter real CLKIN2_PERIOD = 0.000;
+parameter integer CLKOUT0_DIVIDE = 1;
+parameter real CLKOUT0_DUTY_CYCLE = 0.5;
+parameter real CLKOUT0_PHASE = 0.0;
+parameter integer CLKOUT1_DIVIDE = 1;
+parameter real CLKOUT1_DUTY_CYCLE = 0.5;
+parameter real CLKOUT1_PHASE = 0.0;
+parameter integer CLKOUT2_DIVIDE = 1;
+parameter real CLKOUT2_DUTY_CYCLE = 0.5;
+parameter real CLKOUT2_PHASE = 0.0;
+parameter integer CLKOUT3_DIVIDE = 1;
+parameter real CLKOUT3_DUTY_CYCLE = 0.5;
+parameter real CLKOUT3_PHASE = 0.0;
+parameter integer CLKOUT4_DIVIDE = 1;
+parameter real CLKOUT4_DUTY_CYCLE = 0.5;
+parameter real CLKOUT4_PHASE = 0.0;
+parameter integer CLKOUT5_DIVIDE = 1;
+parameter real CLKOUT5_DUTY_CYCLE = 0.5;
+parameter real CLKOUT5_PHASE = 0.0;
+parameter COMPENSATION = "SYSTEM_SYNCHRONOUS";
+parameter integer DIVCLK_DIVIDE = 1;
+parameter EN_REL = "FALSE";
+parameter PLL_PMCD_MODE = "FALSE";
+parameter real REF_JITTER = 0.100;
+parameter RESET_ON_LOSS_OF_LOCK = "FALSE";
+parameter RST_DEASSERT_CLK = "CLKIN1";
+
+localparam VCOCLK_FREQ_MAX = 1100;
+localparam VCOCLK_FREQ_MIN = 400;
+
+output CLKFBDCM;
+output CLKFBOUT;
+output CLKOUT0;
+output CLKOUT1;
+output CLKOUT2;
+output CLKOUT3;
+output CLKOUT4;
+output CLKOUT5;
+output CLKOUTDCM0;
+output CLKOUTDCM1;
+output CLKOUTDCM2;
+output CLKOUTDCM3;
+output CLKOUTDCM4;
+output CLKOUTDCM5;
+output DRDY;
+output LOCKED;
+output [15:0] DO;
+
+input CLKFBIN;
+input CLKIN1;
+input CLKIN2;
+input CLKINSEL;
+input DCLK;
+input DEN;
+input DWE;
+input REL;
+input RST;
+input [15:0] DI;
+input [4:0] DADDR;
+
+localparam VCOCLK_FREQ_TARGET = 800;
+localparam CLKIN_FREQ_MAX = 1000;
+localparam CLKIN_FREQ_MIN = 1; //need check speed file, current is TBD
+localparam CLKPFD_FREQ_MAX = 550;
+localparam CLKPFD_FREQ_MIN = 1; //need check speed file, current is TBD
+localparam M_MIN = 1;
+localparam M_MAX = 74;
+localparam D_MIN = 1;
+localparam D_MAX = 52;
+localparam O_MIN = 1;
+localparam O_MAX = 128;
+localparam O_MAX_HT_LT = 64;
+localparam REF_CLK_JITTER_MAX = 350;
+localparam REF_CLK_JITTER_SCALE = 0.1;
+localparam MAX_FEEDBACK_DELAY = 10.0;
+localparam MAX_FEEDBACK_DELAY_SCALE = 1.0;
+
+tri0 GSR = glbl.GSR;
+
+reg [4:0] daddr_lat;
+reg valid_daddr;
+reg drdy_out;
+reg drp_lock, drp_lock1;
+reg [15:0] dr_sram [31:0];
+reg [160:0] tmp_string;
+
+wire CLKFBIN, CLKIN1, CLKIN2, CLKINSEL ;
+wire rst_in, RST, orig_rst_in ;
+wire locked_out;
+wire clkvco_lk_rst;
+
+reg clk0_out, clk1_out, clk2_out, clk3_out, clk4_out, clk5_out;
+reg clkfb_out, clkfbm1_out;
+reg clkout_en, clkout_en1, clkout_en0, clkout_en0_tmp;
+integer clkout_cnt, clkin_cnt, clkin_lock_cnt;
+integer clkout_en_time, locked_en_time, lock_cnt_max;
+reg clkvco_lk, clkvco_free, clkvco;
+reg fbclk_tmp;
+
+reg rst_in1, rst_unlock, rst_on_loss;
+time rst_edge, rst_ht;
+
+reg fb_delay_found, fb_delay_found_tmp;
+reg clkfb_tst;
+real fb_delay_max;
+time fb_delay, clkvco_delay, val_tmp, dly_tmp, fbm1_comp_delay;
+time clkin_edge, delay_edge;
+
+real period_clkin;
+integer clkin_period [4:0];
+integer period_vco, period_vco_half, period_vco_max, period_vco_min;
+integer period_vco1, period_vco2, period_vco3, period_vco4;
+integer period_vco5, period_vco6, period_vco7;
+integer period_vco_target, period_vco_target_half;
+integer period_fb, period_avg;
+
+real clkvco_freq_init_chk, clkfbm1pm_rl;
+real tmp_real;
+integer i, j, i1, i2;
+integer md_product, md_product_dbl, clkin_stop_max, clkfb_stop_max;
+
+time pll_locked_delay, clkin_dly_t, clkfb_dly_t;
+reg clkpll_dly, clkfbin_dly;
+wire pll_unlock;
+reg pll_locked_tmp1, pll_locked_tmp2;
+reg lock_period;
+reg pll_locked_tm, unlock_recover;
+reg clkin_stopped_p, clkin_stopped_n;
+reg clkfb_stopped_p, clkfb_stopped_n;
+wire clkin_stopped, clkfb_stopped;
+reg clkpll_jitter_unlock;
+integer clkstop_cnt_p, clkstop_cnt_n, clkfbstop_cnt_p, clkfbstop_cnt_n;
+integer clkin_jit, REF_CLK_JITTER_MAX_tmp;
+
+wire REL, DWE, DEN, DCLK, rel_o_mux_clk_tmp, clka1_in, clkb1_in;
+wire init_trig, clkpll_tmp, clkpll, clk0in, clk1in, clk2in, clk3in, clk4in, clk5in;
+wire clkfbm1in, clkfbm1ps_en;
+
+
+reg clkout0_out;
+reg clkout1_out;
+reg clkout2_out;
+reg clkout3_out;
+reg clkout4_out;
+reg clkout5_out;
+
+reg clka1_out, clkb1_out, clka1d2_out, clka1d4_out, clka1d8_out;
+reg clkdiv_rel_rst, qrel_o_reg1, qrel_o_reg2, qrel_o_reg3, rel_o_mux_sel;
+reg pmcd_mode;
+reg chk_ok;
+
+wire rel_rst_o, rel_o_mux_clk;
+wire clk0ps_en, clk1ps_en, clk2ps_en, clk3ps_en, clk4ps_en, clk5ps_en;
+
+reg [7:0] clkout_mux;
+reg [2:0] clk0pm_sel, clk1pm_sel, clk2pm_sel, clk3pm_sel, clk4pm_sel, clk5pm_sel;
+reg [2:0] clkfbm1pm_sel;
+reg clk0_edge, clk1_edge, clk2_edge, clk3_edge, clk4_edge, clk5_edge;
+reg clkfbm1_edge, clkind_edge;
+reg clk0_nocnt, clk1_nocnt, clk2_nocnt, clk3_nocnt, clk4_nocnt, clk5_nocnt;
+reg clkfbm1_nocnt, clkind_nocnt;
+reg clkind_edget, clkind_nocntt;
+reg [5:0] clk0_dly_cnt, clkout0_dly;
+reg [5:0] clk1_dly_cnt, clkout1_dly;
+reg [5:0] clk2_dly_cnt, clkout2_dly;
+reg [5:0] clk3_dly_cnt, clkout3_dly;
+reg [5:0] clk4_dly_cnt, clkout4_dly;
+reg [5:0] clk5_dly_cnt, clkout5_dly;
+reg [6:0] clk0_ht, clk0_lt;
+reg [6:0] clk1_ht, clk1_lt;
+reg [6:0] clk2_ht, clk2_lt;
+reg [6:0] clk3_ht, clk3_lt;
+reg [6:0] clk4_ht, clk4_lt;
+reg [6:0] clk5_ht, clk5_lt;
+reg [5:0] clkfbm1_dly_cnt, clkfbm1_dly;
+reg [6:0] clkfbm1_ht, clkfbm1_lt;
+reg [7:0] clkind_ht, clkind_lt;
+reg [7:0] clkind_htt, clkind_ltt;
+reg [7:0] clk0_ht1, clk0_cnt, clk0_div, clk0_div1;
+reg [7:0] clk1_ht1, clk1_cnt, clk1_div, clk1_div1;
+reg [7:0] clk2_ht1, clk2_cnt, clk2_div, clk2_div1;
+reg [7:0] clk3_ht1, clk3_cnt, clk3_div, clk3_div1;
+reg [7:0] clk4_ht1, clk4_cnt, clk4_div, clk4_div1;
+reg [7:0] clk5_ht1, clk5_cnt, clk5_div, clk5_div1;
+reg [7:0] clkfbm1_ht1, clkfbm1_cnt, clkfbm1_div, clkfbm1_div1;
+reg [7:0] clkind_div;
+reg [3:0] pll_cp, pll_res;
+reg [1:0] pll_lfhf;
+reg [1:0] pll_cpres = 2'b01;
+
+reg notifier;
+wire [15:0] do_out, di_in;
+wire clkin1_in, clkin2_in, clkfb_in, clkinsel_in, dwe_in, den_in, dclk_in;
+wire [4:0] daddr_in;
+wire rel_in, gsr_in, rst_input;
+
+ assign #100 LOCKED = locked_out;
+ assign #100 DRDY = drdy_out;
+ assign #100 DO = do_out;
+ assign clkin1_in = CLKIN1;
+ assign clkin2_in = CLKIN2;
+ assign clkfb_in = CLKFBIN;
+ assign clkinsel_in = CLKINSEL;
+ assign rst_input = RST;
+ assign daddr_in = DADDR;
+ assign di_in = DI;
+ assign dwe_in = DWE;
+ assign den_in = DEN;
+ assign dclk_in = DCLK;
+ assign rel_in = REL;
+
+
+
+initial begin
+ #1;
+ if ($realtime == 0) begin
+ $display ("Simulator Resolution Error : Simulator resolution is set to a value greater than 1 ps.");
+ $display ("In order to simulate the PLL_ADV, the simulator resolution must be set to 1ps or smaller.");
+ $finish;
+ end
+end
+
+initial begin
+
+ case (COMPENSATION)
+ "SYSTEM_SYNCHRONOUS" : ;
+ "SOURCE_SYNCHRONOUS" : ;
+ "INTERNAL" : ;
+ "EXTERNAL" : ;
+ "DCM2PLL" : ;
+ "PLL2DCM" : ;
+ default : begin
+ $display("Attribute Syntax Error : The Attribute COMPENSATION on PLL_ADV instance %m is set to %s. Legal values for this attribute are SYSTEM_SYNCHRONOUS, SOURCE_SYNCHRONOUS, INTERNAL, EXTERNAL, DCM2PLL or PLL2DCM.", COMPENSATION);
+ $finish;
+ end
+ endcase
+
+ case (BANDWIDTH)
+ "HIGH" : ;
+ "LOW" : ;
+ "OPTIMIZED" : ;
+ default : begin
+ $display("Attribute Syntax Error : The Attribute BANDWIDTH on PLL_ADV instance %m is set to %s. Legal values for this attribute are HIGH, LOW or OPTIMIZED.", BANDWIDTH);
+ $finish;
+ end
+ endcase
+
+ case (CLKOUT0_DESKEW_ADJUST)
+ "NONE" : ;
+ "PPC" : ;
+ default : begin
+ $display("Attribute Syntax Error : The Attribute CLKOUT0_DESKEW_ADJUST on PLL_ADV instance %m is set to %s. Legal values for this attribute are NONE or PPC.", CLKOUT0_DESKEW_ADJUST);
+ $finish;
+ end
+ endcase
+
+ case (CLKOUT1_DESKEW_ADJUST)
+ "NONE" : ;
+ "PPC" : ;
+ default : begin
+ $display("Attribute Syntax Error : The Attribute CLKOUT1_DESKEW_ADJUST on PLL_ADV instance %m is set to %s. Legal values for this attribute are NONE or PPC .", CLKOUT1_DESKEW_ADJUST);
+ $finish;
+ end
+ endcase
+
+ case (CLKOUT2_DESKEW_ADJUST)
+ "NONE" : ;
+ "PPC" : ;
+ default : begin
+ $display("Attribute Syntax Error : The Attribute CLKOUT2_DESKEW_ADJUST on PLL_ADV instance %m is set to %s. Legal values for this attribute are NONE or PPC.", CLKOUT2_DESKEW_ADJUST);
+ $finish;
+ end
+ endcase
+
+ case (CLKOUT3_DESKEW_ADJUST)
+ "NONE" : ;
+ "PPC" : ;
+ default : begin
+ $display("Attribute Syntax Error : The Attribute CLKOUT3_DESKEW_ADJUST on PLL_ADV instance %m is set to %s. Legal values for this attribute are NONE or PPC.", CLKOUT3_DESKEW_ADJUST);
+ $finish;
+ end
+ endcase
+
+ case (CLKOUT4_DESKEW_ADJUST)
+ "NONE" : ;
+ "PPC" : ;
+ default : begin
+ $display("Attribute Syntax Error : The Attribute CLKOUT4_DESKEW_ADJUST on PLL_ADV instance %m is set to %s. Legal values for this attribute are NONE or PPC.", CLKOUT4_DESKEW_ADJUST);
+ $finish;
+ end
+ endcase
+
+ case (CLKOUT5_DESKEW_ADJUST)
+ "NONE" : ;
+ "PPC" : ;
+ default : begin
+ $display("Attribute Syntax Error : The Attribute CLKOUT5_DESKEW_ADJUST on PLL_ADV instance %m is set to %s. Legal values for this attribute are NONE or PPC.", CLKOUT5_DESKEW_ADJUST);
+ $finish;
+ end
+ endcase
+
+ case (CLKFBOUT_DESKEW_ADJUST)
+ "NONE" : ;
+ "PPC" : ;
+ default : begin
+ $display("Attribute Syntax Error : The Attribute CLKFBOUT_DESKEW_ADJUST on PLL_ADV instance %m is set to %s. Legal values for this attribute are NONE or PPC.", CLKFBOUT_DESKEW_ADJUST);
+ $finish;
+ end
+ endcase
+
+
+ case (PLL_PMCD_MODE)
+ "TRUE" : pmcd_mode = 1'b1;
+ "FALSE" : pmcd_mode = 1'b0;
+ default : begin
+ $display("Attribute Syntax Error : The Attribute PLL_PMCD_MODE on PLL_ADV instance %m is set to %s. Legal values for this attribute are FALSE or TRUE.", PLL_PMCD_MODE);
+ $finish;
+ end
+ endcase
+
+ tmp_string = "CLKOUT0_DIVIDE";
+ chk_ok = para_int_pmcd_chk(CLKOUT0_DIVIDE, tmp_string, 1, 128, pmcd_mode, 8);
+ tmp_string = "CLKOUT0_PHASE";
+ chk_ok = para_real_pmcd_chk(CLKOUT0_PHASE, tmp_string, -360.0, 360.0, pmcd_mode, 0.0);
+ tmp_string = "CLKOUT0_DUTY_CYCLE";
+ chk_ok = para_real_pmcd_chk(CLKOUT0_DUTY_CYCLE, tmp_string, 0.0, 1.0, pmcd_mode, 0.5);
+
+ tmp_string = "CLKOUT1_DIVIDE";
+ chk_ok = para_int_pmcd_chk(CLKOUT1_DIVIDE, tmp_string, 1, 128, pmcd_mode, 4);
+ tmp_string = "CLKOUT1_PHASE";
+ chk_ok = para_real_pmcd_chk(CLKOUT1_PHASE, tmp_string, -360.0, 360.0, pmcd_mode, 0.0);
+ tmp_string = "CLKOUT1_DUTY_CYCLE";
+ chk_ok = para_real_pmcd_chk(CLKOUT1_DUTY_CYCLE, tmp_string, 0.0, 1.0, pmcd_mode, 0.5);
+
+ tmp_string = "CLKOUT2_DIVIDE";
+ chk_ok = para_int_pmcd_chk(CLKOUT2_DIVIDE, tmp_string, 1, 128, pmcd_mode, 2);
+ tmp_string = "CLKOUT2_PHASE";
+ chk_ok = para_real_pmcd_chk(CLKOUT2_PHASE, tmp_string, -360.0, 360.0, pmcd_mode, 0.0);
+ tmp_string = "CLKOUT2_DUTY_CYCLE";
+ chk_ok = para_real_pmcd_chk(CLKOUT2_DUTY_CYCLE, tmp_string, 0.0, 1.0, pmcd_mode, 0.5);
+
+ tmp_string = "CLKOUT3_DIVIDE";
+ chk_ok = para_int_pmcd_chk(CLKOUT3_DIVIDE, tmp_string, 1, 128, pmcd_mode, 1);
+ tmp_string = "CLKOUT3_PHASE";
+ chk_ok = para_real_pmcd_chk(CLKOUT3_PHASE, tmp_string, -360.0, 360.0, pmcd_mode, 0.0);
+ tmp_string = "CLKOUT3_DUTY_CYCLE";
+ chk_ok = para_real_pmcd_chk(CLKOUT3_DUTY_CYCLE, tmp_string, 0.0, 1.0, pmcd_mode, 0.5);
+
+ tmp_string = "CLKOUT4_DIVIDE";
+ chk_ok = para_int_range_chk(CLKOUT4_DIVIDE, tmp_string, 1, 128);
+ tmp_string = "CLKOUT4_PHASE";
+ chk_ok = para_real_range_chk(CLKOUT4_PHASE, tmp_string, -360.0, 360.0);
+ tmp_string = "CLKOUT4_DUTY_CYCLE";
+ chk_ok = para_real_range_chk(CLKOUT4_DUTY_CYCLE, tmp_string, 0.0, 1.0);
+
+ tmp_string = "CLKOUT5_DIVIDE";
+ chk_ok = para_int_range_chk (CLKOUT5_DIVIDE, tmp_string, 1, 128);
+ tmp_string = "CLKOUT5_PHASE";
+ chk_ok = para_real_range_chk(CLKOUT5_PHASE, tmp_string, -360.0, 360.0);
+ tmp_string = "CLKOUT5_DUTY_CYCLE";
+ chk_ok = para_real_range_chk (CLKOUT5_DUTY_CYCLE, tmp_string, 0.0, 1.0);
+
+ tmp_string = "CLKFBOUT_MULT";
+ chk_ok = para_int_pmcd_chk(CLKFBOUT_MULT, tmp_string, 1, 74, pmcd_mode, 1);
+ tmp_string = "CLKFBOUT_PHASE";
+ chk_ok = para_real_pmcd_chk(CLKFBOUT_PHASE, tmp_string, -360.0, 360.0, pmcd_mode, 0.0);
+ tmp_string = "DIVCLK_DIVIDE";
+ chk_ok = para_int_range_chk (DIVCLK_DIVIDE, tmp_string, 1, 52);
+
+ tmp_string = "REF_JITTER";
+ chk_ok = para_real_range_chk (REF_JITTER, tmp_string, 0.0, 0.999);
+ if (((CLKIN1_PERIOD < 1.0) || (CLKIN1_PERIOD > 52.630)) && (pmcd_mode == 0)) begin
+ $display("Attribute Syntax Error : CLKIN1_PERIOD is not in range 1.0 ... 52.630.");
+ end
+
+ if (((CLKIN2_PERIOD < 1.0) || (CLKIN2_PERIOD > 52.630)) && (pmcd_mode == 0)) begin
+ $display("Attribute Syntax Error : CLKIN1_PERIOD is not in range 1.0 ... 52.630.");
+ end
+
+
+ case (RESET_ON_LOSS_OF_LOCK)
+ "FALSE" : rst_on_loss = 1'b0;
+// "TRUE" : if (pmcd_mode) rst_on_loss = 1'b0; else rst_on_loss = 1'b1;
+ default : begin
+ $display("Attribute Syntax Error : The Attribute RESET_ON_LOSS_OF_LOCK on PLL_ADV instance %m is set to %s. This attribute must always be set to FALSE for X_PLL_ADV to function correctly. Please correct the setting for the attribute and re-run the simulation.", RESET_ON_LOSS_OF_LOCK);
+ $finish;
+ end
+ endcase
+
+ case (CLKFBOUT_MULT)
+ 1 : if (BANDWIDTH === "LOW") begin pll_cp = 4'b0001; pll_res = 4'b1101; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH === "HIGH") begin pll_cp = 4'b0101; pll_res = 4'b1111; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH === "OPTIMIZED") begin pll_cp = 4'b0101; pll_res = 4'b1111; pll_lfhf = 2'b11; end
+ 2 : if (BANDWIDTH === "LOW") begin pll_cp = 4'b0001; pll_res = 4'b1110; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH === "HIGH") begin pll_cp = 4'b1110; pll_res = 4'b1111; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH === "OPTIMIZED") begin pll_cp = 4'b1110; pll_res = 4'b1111; pll_lfhf = 2'b11; end
+ 3 : if (BANDWIDTH === "LOW") begin pll_cp = 4'b0001; pll_res = 4'b0110; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH === "HIGH") begin pll_cp = 4'b1111; pll_res = 4'b0111; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH === "OPTIMIZED") begin pll_cp = 4'b0110; pll_res = 4'b0101; pll_lfhf = 2'b11; end
+ 4 : if (BANDWIDTH === "LOW") begin pll_cp = 4'b0001; pll_res = 4'b1010; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH === "HIGH") begin pll_cp = 4'b1111; pll_res = 4'b1101; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH === "OPTIMIZED") begin pll_cp = 4'b0111; pll_res = 4'b1001; pll_lfhf = 2'b11; end
+ 5 : if (BANDWIDTH === "LOW") begin pll_cp = 4'b0001; pll_res = 4'b1100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH === "HIGH") begin pll_cp = 4'b1110; pll_res = 4'b0101; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH === "OPTIMIZED") begin pll_cp = 4'b1101; pll_res = 4'b1001; pll_lfhf = 2'b11; end
+ 6 : if (BANDWIDTH === "LOW") begin pll_cp = 4'b0001; pll_res = 4'b1100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH === "HIGH") begin pll_cp = 4'b1111; pll_res = 4'b0101; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH === "OPTIMIZED") begin pll_cp = 4'b0111; pll_res = 4'b0001; pll_lfhf = 2'b11; end
+ 7 : if (BANDWIDTH === "LOW") begin pll_cp = 4'b0001; pll_res = 4'b1100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH === "HIGH") begin pll_cp = 4'b1111; pll_res = 4'b1001; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH === "OPTIMIZED") begin pll_cp = 4'b1100; pll_res = 4'b0001; pll_lfhf = 2'b11; end
+ 8 : if (BANDWIDTH === "LOW") begin pll_cp = 4'b0001; pll_res = 4'b0010; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH === "HIGH") begin pll_cp = 4'b1111; pll_res = 4'b1110; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH === "OPTIMIZED") begin pll_cp = 4'b1111; pll_res = 4'b1110; pll_lfhf = 2'b11; end
+ 9 : if (BANDWIDTH === "LOW") begin pll_cp = 4'b0001; pll_res = 4'b0010; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH === "HIGH") begin pll_cp = 4'b1111; pll_res = 4'b1110; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH === "OPTIMIZED") begin pll_cp = 4'b1110; pll_res = 4'b0001; pll_lfhf = 2'b11; end
+ 10 : if (BANDWIDTH === "LOW") begin pll_cp = 4'b0001; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH === "HIGH") begin pll_cp = 4'b1111; pll_res = 4'b0001; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH === "OPTIMIZED") begin pll_cp = 4'b1111; pll_res = 4'b0001; pll_lfhf = 2'b11; end
+ 11 : if (BANDWIDTH === "LOW") begin pll_cp = 4'b0001; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH === "HIGH") begin pll_cp = 4'b1111; pll_res = 4'b0001; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH === "OPTIMIZED") begin pll_cp = 4'b1101; pll_res = 4'b0110; pll_lfhf = 2'b11; end
+ 12 : if (BANDWIDTH === "LOW") begin pll_cp = 4'b0001; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH === "HIGH") begin pll_cp = 4'b1110; pll_res = 4'b0110; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH === "OPTIMIZED") begin pll_cp = 4'b1110; pll_res = 4'b0110; pll_lfhf = 2'b11; end
+ 13 : if (BANDWIDTH === "LOW") begin pll_cp = 4'b0001; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH === "HIGH") begin pll_cp = 4'b1110; pll_res = 4'b0110; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH === "OPTIMIZED") begin pll_cp = 4'b1110; pll_res = 4'b0110; pll_lfhf = 2'b11; end
+ 14 : if (BANDWIDTH === "LOW") begin pll_cp = 4'b0001; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH === "HIGH") begin pll_cp = 4'b1111; pll_res = 4'b0110; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH === "OPTIMIZED") begin pll_cp = 4'b1111; pll_res = 4'b0110; pll_lfhf = 2'b11; end
+ 15 : if (BANDWIDTH === "LOW") begin pll_cp = 4'b0001; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH === "HIGH") begin pll_cp = 4'b1110; pll_res = 4'b1010; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH === "OPTIMIZED") begin pll_cp = 4'b1110; pll_res = 4'b1010; pll_lfhf = 2'b11; end
+ 16 : if (BANDWIDTH === "LOW") begin pll_cp = 4'b0001; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b1110; pll_res = 4'b1010; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b1110; pll_res = 4'b1010; pll_lfhf = 2'b11; end
+ 17 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0001; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b1111; pll_res = 4'b1010; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b1111; pll_res = 4'b1010; pll_lfhf = 2'b11; end
+ 18 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0001; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b1111; pll_res = 4'b1010; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b1111; pll_res = 4'b1010; pll_lfhf = 2'b11; end
+ 19 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0001; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b1111; pll_res = 4'b1010; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b1111; pll_res = 4'b1010; pll_lfhf = 2'b11; end
+ 20 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0001; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b1111; pll_res = 4'b1010; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b1100; pll_res = 4'b1100; pll_lfhf = 2'b11; end
+ 21 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0001; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b1111; pll_res = 4'b1010; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b1100; pll_res = 4'b1100; pll_lfhf = 2'b11; end
+ 22 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0001; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b1101; pll_res = 4'b1100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b1101; pll_res = 4'b1100; pll_lfhf = 2'b11; end
+ 23 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0001; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b1101; pll_res = 4'b1100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b1101; pll_res = 4'b1100; pll_lfhf = 2'b11; end
+ 24 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0001; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b1101; pll_res = 4'b1100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0111; pll_res = 4'b0010; pll_lfhf = 2'b11; end
+ 25 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0001; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b1110; pll_res = 4'b1100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b1110; pll_res = 4'b1100; pll_lfhf = 2'b11; end
+ 26 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0001; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b1110; pll_res = 4'b1100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b1110; pll_res = 4'b1100; pll_lfhf = 2'b11; end
+ 27 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0001; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b1111; pll_res = 4'b1100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b1111; pll_res = 4'b1100; pll_lfhf = 2'b11; end
+ 28 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0001; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b1110; pll_res = 4'b1100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b1100; pll_res = 4'b0010; pll_lfhf = 2'b11; end
+ 29 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0001; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b1110; pll_res = 4'b1100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b1100; pll_res = 4'b0010; pll_lfhf = 2'b11; end
+ 30 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0001; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b1110; pll_res = 4'b1100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b1100; pll_res = 4'b0010; pll_lfhf = 2'b11; end
+ 31 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b1100; pll_res = 4'b0010; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b1100; pll_res = 4'b0010; pll_lfhf = 2'b11; end
+ 32 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b1100; pll_res = 4'b0010; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b1100; pll_res = 4'b0010; pll_lfhf = 2'b11; end
+ 33 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b1111; pll_res = 4'b1010; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0100; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ 34 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0111; pll_res = 4'b0010; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0100; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ 35 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0111; pll_res = 4'b0010; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0100; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ 36 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0111; pll_res = 4'b0010; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0100; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ 37 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0110; pll_res = 4'b0010; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0100; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ 38 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0110; pll_res = 4'b0010; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0100; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ 39 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0100; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0100; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ 40 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0100; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0011; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ 41 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0100; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0011; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ 42 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0100; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0011; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ 43 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0100; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0011; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ 44 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0100; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0011; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ 45 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0011; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0011; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ 46 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0011; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0011; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ 47 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0101; pll_res = 4'b0010; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ 48 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0101; pll_res = 4'b0010; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ 49 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0011; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ 50 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0011; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ 51 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0011; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ 52 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0011; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ 53 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0011; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ 54 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0011; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ 55 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0011; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0011; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ 56 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0011; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0011; pll_res = 4'b0100; pll_lfhf = 2'b11; end
+ 57 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ 58 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ 59 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ 60 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ 61 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ 62 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ 63 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ 64 : if (BANDWIDTH == "LOW") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "HIGH") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ else if (BANDWIDTH == "OPTIMIZED") begin pll_cp = 4'b0010; pll_res = 4'b1000; pll_lfhf = 2'b11; end
+ endcase
+
+
+ tmp_string = "DIVCLK_DIVIDE";
+ chk_ok = para_int_range_chk (DIVCLK_DIVIDE, tmp_string, D_MIN, D_MAX);
+
+ tmp_string = "CLKFBOUT_MULT";
+ chk_ok = para_int_range_chk (CLKFBOUT_MULT, tmp_string, M_MIN, M_MAX);
+
+ tmp_string = "CLKOUT0_DUTY_CYCLE";
+ chk_ok = clkout_duty_chk (CLKOUT0_DIVIDE, CLKOUT0_DUTY_CYCLE, tmp_string);
+ tmp_string = "CLKOUT1_DUTY_CYCLE";
+ chk_ok = clkout_duty_chk (CLKOUT1_DIVIDE, CLKOUT1_DUTY_CYCLE, tmp_string);
+ tmp_string = "CLKOUT2_DUTY_CYCLE";
+ chk_ok = clkout_duty_chk (CLKOUT2_DIVIDE, CLKOUT2_DUTY_CYCLE, tmp_string);
+ tmp_string = "CLKOUT3_DUTY_CYCLE";
+ chk_ok = clkout_duty_chk (CLKOUT3_DIVIDE, CLKOUT3_DUTY_CYCLE, tmp_string);
+ tmp_string = "CLKOUT4_DUTY_CYCLE";
+ chk_ok = clkout_duty_chk (CLKOUT4_DIVIDE, CLKOUT4_DUTY_CYCLE, tmp_string);
+ tmp_string = "CLKOUT5_DUTY_CYCLE";
+ chk_ok = clkout_duty_chk (CLKOUT5_DIVIDE, CLKOUT5_DUTY_CYCLE, tmp_string);
+
+ period_vco_max = 1000000 / VCOCLK_FREQ_MIN;
+ period_vco_min = 1000000 / VCOCLK_FREQ_MAX;
+ period_vco_target = 1000000 / VCOCLK_FREQ_TARGET;
+ period_vco_target_half = period_vco_target / 2;
+ fb_delay_max = MAX_FEEDBACK_DELAY * MAX_FEEDBACK_DELAY_SCALE;
+ md_product = CLKFBOUT_MULT * DIVCLK_DIVIDE;
+ md_product_dbl = md_product * 2;
+ clkout_en_time = `PLL_LOCK_TIME + 2;
+// locked_en_time = md_product_dbl + clkout_en_time +2; // for DCM 3 cycle reset requirement
+ locked_en_time = md_product + clkout_en_time + 2; // for DCM 3 cycle reset requirement
+ lock_cnt_max = locked_en_time + 6;
+ clkfb_stop_max = 3;
+ clkin_stop_max = DIVCLK_DIVIDE + 1;
+ REF_CLK_JITTER_MAX_tmp = REF_CLK_JITTER_MAX;
+
+ clk_out_para_cal (clk0_ht, clk0_lt, clk0_nocnt, clk0_edge, CLKOUT0_DIVIDE, CLKOUT0_DUTY_CYCLE);
+ clk_out_para_cal (clk1_ht, clk1_lt, clk1_nocnt, clk1_edge, CLKOUT1_DIVIDE, CLKOUT1_DUTY_CYCLE);
+ clk_out_para_cal (clk2_ht, clk2_lt, clk2_nocnt, clk2_edge, CLKOUT2_DIVIDE, CLKOUT2_DUTY_CYCLE);
+ clk_out_para_cal (clk3_ht, clk3_lt, clk3_nocnt, clk3_edge, CLKOUT3_DIVIDE, CLKOUT3_DUTY_CYCLE);
+ clk_out_para_cal (clk4_ht, clk4_lt, clk4_nocnt, clk4_edge, CLKOUT4_DIVIDE, CLKOUT4_DUTY_CYCLE);
+ clk_out_para_cal (clk5_ht, clk5_lt, clk5_nocnt, clk5_edge, CLKOUT5_DIVIDE, CLKOUT5_DUTY_CYCLE);
+ clk_out_para_cal (clkfbm1_ht, clkfbm1_lt, clkfbm1_nocnt, clkfbm1_edge, CLKFBOUT_MULT, 0.50);
+ clk_out_para_cal (clkind_ht, clkind_lt, clkind_nocnt, clkind_edge, DIVCLK_DIVIDE, 0.50);
+ tmp_string = "CLKOUT0_PHASE";
+ clkout_dly_cal (clkout0_dly, clk0pm_sel, CLKOUT0_DIVIDE, CLKOUT0_PHASE, tmp_string);
+ tmp_string = "CLKOUT1_PHASE";
+ clkout_dly_cal (clkout1_dly, clk1pm_sel, CLKOUT1_DIVIDE, CLKOUT1_PHASE, tmp_string);
+ tmp_string = "CLKOUT2_PHASE";
+ clkout_dly_cal (clkout2_dly, clk2pm_sel, CLKOUT2_DIVIDE, CLKOUT2_PHASE, tmp_string);
+ tmp_string = "CLKOUT3_PHASE";
+ clkout_dly_cal (clkout3_dly, clk3pm_sel, CLKOUT3_DIVIDE, CLKOUT3_PHASE, tmp_string);
+ tmp_string = "CLKOUT4_PHASE";
+ clkout_dly_cal (clkout4_dly, clk4pm_sel, CLKOUT4_DIVIDE, CLKOUT4_PHASE, tmp_string);
+ tmp_string = "CLKOUT5_PHASE";
+ clkout_dly_cal (clkout5_dly, clk5pm_sel, CLKOUT5_DIVIDE, CLKOUT5_PHASE, tmp_string);
+ tmp_string = "CLKFBOUT_PHASE";
+ clkout_dly_cal (clkfbm1_dly, clkfbm1pm_sel, CLKFBOUT_MULT, CLKFBOUT_PHASE, tmp_string);
+
+ clkind_div = DIVCLK_DIVIDE;
+
+ dr_sram[5'b11100] = {8'bx, clk0_edge, clk0_nocnt, clkout0_dly[5:0]};
+ dr_sram[5'b11011] = {clk0pm_sel[2:0], 1'b1, clk0_ht[5:0], clk0_lt[5:0]};
+ dr_sram[5'b11010] = {8'bx, clk1_edge, clk1_nocnt, clkout1_dly[5:0]};
+ dr_sram[5'b11001] = {clk1pm_sel[2:0], 1'b1, clk1_ht[5:0], clk1_lt[5:0]};
+ dr_sram[5'b10111] = {8'bx, clk2_edge, clk2_nocnt, clkout2_dly[5:0]};
+ dr_sram[5'b10110] = {clk2pm_sel[2:0], 1'b1, clk2_ht[5:0], clk2_lt[5:0]};
+ dr_sram[5'b10101] = {8'bx, clk3_edge, clk3_nocnt, clkout3_dly[5:0]};
+ dr_sram[5'b10100] = {clk3pm_sel[2:0], 1'b1, clk3_ht[5:0], clk3_lt[5:0]};
+ dr_sram[5'b10011] = {8'bx, clk4_edge, clk4_nocnt, clkout4_dly[5:0]};
+ dr_sram[5'b10010] = {clk4pm_sel[2:0], 1'b1, clk4_ht[5:0], clk4_lt[5:0]};
+ dr_sram[5'b01111] = {8'bx, clk5_edge, clk5_nocnt, clkout5_dly[5:0]};
+ dr_sram[5'b01110] = {clk5pm_sel[2:0], 1'b1, clk5_ht[5:0], clk5_lt[5:0]};
+ dr_sram[5'b01101] = {8'bx, clkfbm1_edge, clkfbm1_nocnt, clkfbm1_dly[5:0]};
+ dr_sram[5'b01100] = {clkfbm1pm_sel[2:0], 1'b1, clkfbm1_ht[5:0], clkfbm1_lt[5:0]};
+ dr_sram[5'b00110] = {2'bx, clkind_edge, clkind_nocnt, clkind_ht[5:0], clkind_lt[5:0]};
+ dr_sram[5'b00001] = {8'bx, pll_lfhf, pll_cpres, pll_cp};
+ dr_sram[5'b00000] = {6'bx, pll_res, 6'bx};
+
+
+// **** PMCD *******
+
+//*** Clocks MUX
+
+ case (RST_DEASSERT_CLK)
+ "CLKIN1" : rel_o_mux_sel = 1'b1;
+ "CLKFBIN" : rel_o_mux_sel = 1'b0;
+ default : begin
+ $display("Attribute Syntax Error : The attribute RST_DEASSERT_CLK on PLL_ADV instance %m is set to %s. Legal values for this attribute are CLKIN1 and CLKFBIN.", RST_DEASSERT_CLK);
+ $finish;
+ end
+ endcase
+
+//*** CLKDIV_RST
+ case (EN_REL)
+ "FALSE" : clkdiv_rel_rst = 1'b0;
+ "TRUE" : clkdiv_rel_rst = 1'b1;
+ default : begin
+ $display("Attribute Syntax Error : The attribute EN_REL on PLL_ADV instance %m is set to %s. Legal values for this attribute are TRUE or FALSE.", EN_REL);
+ $finish;
+ end
+ endcase
+
+
+end
+
+initial begin
+ rst_in1 = 0;
+ rst_unlock = 0;
+ clkin_period[0] = 0;
+ clkin_period[1] = 0;
+ clkin_period[2] = 0;
+ clkin_period[3] = 0;
+ clkin_period[4] = 0;
+ period_avg = 0;
+ period_fb = 0;
+ fb_delay = 0;
+ clkfbm1_div = 1;
+ clkfbm1_div1 = 0;
+ clkvco_delay = 0;
+ fbm1_comp_delay = 0;
+ clkfbm1pm_rl = 0;
+ period_vco = 0;
+ period_vco1 = 0;
+ period_vco2 = 0;
+ period_vco3 = 0;
+ period_vco4 = 0;
+ period_vco5 = 0;
+ period_vco6 = 0;
+ period_vco7 = 0;
+ period_vco_half = 0;
+ fb_delay_found = 0;
+ fb_delay_found_tmp = 0;
+ clkin_edge = 0;
+ delay_edge = 0;
+ clkvco_free = 0;
+ clkvco_lk = 0;
+ fbclk_tmp = 0;
+ clkfb_tst = 0;
+ clkout_cnt = 0;
+ clkout_en = 0;
+ clkout_en0 = 0;
+ clkout_en0_tmp = 0;
+ clkout_en1 = 0;
+ pll_locked_tmp1 = 0;
+ pll_locked_tmp2 = 0;
+ pll_locked_tm = 0;
+ pll_locked_delay = 0;
+ clkout_mux = 3'b0;
+ unlock_recover = 0;
+ clkstop_cnt_p = 0;
+ clkstop_cnt_n = 0;
+ clkpll_jitter_unlock = 0;
+ clkin_jit = 0;
+ clkin_cnt = 0;
+ clkin_lock_cnt = 0;
+ clkin_stopped_p = 0;
+ clkin_stopped_n = 0;
+ clkfb_stopped_p = 0;
+ clkfb_stopped_n = 0;
+ clkpll_dly = 0;
+ clkfbin_dly = 0;
+ clkfbstop_cnt_p = 0;
+ clkfbstop_cnt_n = 0;
+ lock_period = 0;
+ rst_edge = 0;
+ rst_ht = 0;
+ drdy_out = 0;
+ drp_lock = 0;
+ clkout0_out = 0;
+ clkout1_out = 0;
+ clkout2_out = 0;
+ clkout3_out = 0;
+ clkout4_out = 0;
+ clkout5_out = 0;
+ clka1_out = 1'b0;
+ clkb1_out = 1'b0;
+ clka1d2_out = 1'b0;
+ clka1d4_out = 1'b0;
+ clka1d8_out = 1'b0;
+ qrel_o_reg1 = 1'b0;
+ qrel_o_reg2 = 1'b0;
+ qrel_o_reg3 = 1'b0;
+ clk0_dly_cnt = 6'b0;
+ clk1_dly_cnt = 6'b0;
+ clk2_dly_cnt = 6'b0;
+ clk3_dly_cnt = 6'b0;
+ clk4_dly_cnt = 6'b0;
+ clk5_dly_cnt = 6'b0;
+ clkfbm1_dly_cnt = 6'b0;
+ clk0_cnt = 8'b0;
+ clk1_cnt = 8'b0;
+ clk2_cnt = 8'b0;
+ clk3_cnt = 8'b0;
+ clk4_cnt = 8'b0;
+ clk5_cnt = 8'b0;
+ clkfbm1_cnt = 8'b0;
+ clk0_out = 0;
+ clk1_out = 0;
+ clk2_out = 0;
+ clk3_out = 0;
+ clk4_out = 0;
+ clk5_out = 0;
+ clkfb_out = 0;
+ clkfbm1_out = 0;
+end
+
+// PMCD function
+
+//*** asyn RST
+ always @(orig_rst_in)
+ if (orig_rst_in == 1'b1) begin
+ assign qrel_o_reg1 = 1'b1;
+ assign qrel_o_reg2 = 1'b1;
+ assign qrel_o_reg3 = 1'b1;
+ end
+ else if (orig_rst_in == 1'b0) begin
+ deassign qrel_o_reg1;
+ deassign qrel_o_reg2;
+ deassign qrel_o_reg3;
+ end
+
+//*** Clocks MUX
+
+ assign rel_o_mux_clk_tmp = rel_o_mux_sel ? clkin1_in : clkfb_in;
+ assign rel_o_mux_clk = (pmcd_mode) ? rel_o_mux_clk_tmp : 0;
+ assign clka1_in = (pmcd_mode) ? clkin1_in : 0;
+ assign clkb1_in = (pmcd_mode) ? clkfb_in : 0;
+
+
+//*** Rel and Rst
+ always @(posedge rel_o_mux_clk)
+ qrel_o_reg1 <= 1'b0;
+
+ always @(negedge rel_o_mux_clk)
+ qrel_o_reg2 <= qrel_o_reg1;
+
+ always @(posedge rel_in)
+ qrel_o_reg3 <= 1'b0;
+
+ assign rel_rst_o = clkdiv_rel_rst ? (qrel_o_reg3 || qrel_o_reg1) : qrel_o_reg1;
+
+//*** CLKA
+ always @(clka1_in or qrel_o_reg2)
+ if (qrel_o_reg2 == 1'b1)
+ clka1_out <= 1'b0;
+ else if (qrel_o_reg2 == 1'b0)
+ clka1_out <= clka1_in;
+
+//*** CLKB
+ always @(clkb1_in or qrel_o_reg2)
+ if (qrel_o_reg2 == 1'b1)
+ clkb1_out <= 1'b0;
+ else if (qrel_o_reg2 == 1'b0)
+ clkb1_out <= clkb1_in;
+
+
+//*** Clock divider
+ always @(posedge clka1_in or posedge rel_rst_o)
+ if (rel_rst_o == 1'b1)
+ clka1d2_out <= 1'b0;
+ else if (rel_rst_o == 1'b0)
+ clka1d2_out <= ~clka1d2_out;
+
+ always @(posedge clka1d2_out or posedge rel_rst_o)
+ if (rel_rst_o == 1'b1)
+ clka1d4_out <= 1'b0;
+ else if (rel_rst_o == 1'b0)
+ clka1d4_out <= ~clka1d4_out;
+
+ always @(posedge clka1d4_out or posedge rel_rst_o)
+ if (rel_rst_o == 1'b1)
+ clka1d8_out <= 1'b0;
+ else if (rel_rst_o == 1'b0)
+ clka1d8_out <= ~clka1d8_out;
+
+ assign CLKOUT5 = (pmcd_mode) ? 0 : clkout5_out;
+ assign CLKOUT4 = (pmcd_mode) ? 0 : clkout4_out;
+ assign CLKOUT3 = (pmcd_mode) ? clka1_out : clkout3_out;
+ assign CLKOUT2 = (pmcd_mode) ? clka1d2_out : clkout2_out;
+ assign CLKOUT1 = (pmcd_mode) ? clka1d4_out : clkout1_out;
+ assign CLKOUT0 = (pmcd_mode) ? clka1d8_out : clkout0_out;
+ assign CLKFBOUT = (pmcd_mode) ? clkb1_out : clkfb_out;
+ assign CLKOUTDCM5 = (pmcd_mode) ? 0 : clkout5_out;
+ assign CLKOUTDCM4 = (pmcd_mode) ? 0 : clkout4_out;
+ assign CLKOUTDCM3 = (pmcd_mode) ? clka1_out : clkout3_out;
+ assign CLKOUTDCM2 = (pmcd_mode) ? clka1d2_out : clkout2_out;
+ assign CLKOUTDCM1 = (pmcd_mode) ? clka1d4_out : clkout1_out;
+ assign CLKOUTDCM0 = (pmcd_mode) ? clka1d8_out : clkout0_out;
+ assign CLKFBDCM = (pmcd_mode) ? clkb1_out : clkfb_out;
+
+// PLL function
+
+always @(clkinsel_in )
+ if (pmcd_mode != 1) begin
+ if ($time >1 && rst_in != 1'b1) begin
+ $display("Input Error : PLL input clock can only be switched when RST=1. CLKINSEL on instance %m at time %t changed when RST low, should change at RST high.", $time);
+ $finish;
+ end
+ if (clkinsel_in ==1) begin
+ if (CLKIN1_PERIOD > (1000.0 /CLKIN_FREQ_MIN) || CLKIN1_PERIOD < (1000.0 / CLKIN_FREQ_MAX)) begin
+ $display (" Attribute Syntax Error : The attribute CLKIN1_PERIOD is set to %f ns and out the allowed range %f ns to %f ns.", CLKIN1_PERIOD, 1000.0/CLKIN_FREQ_MAX, 1000.0/CLKIN_FREQ_MIN);
+ $finish;
+ end
+ end
+ else if (clkinsel_in ==0) begin
+ if (CLKIN2_PERIOD > (1000.0 /CLKIN_FREQ_MIN) || CLKIN2_PERIOD < (1000.0 / CLKIN_FREQ_MAX)) begin
+ $display (" Attribute Syntax Error : The attribute CLKIN2_PERIOD is set to %f ns and out the allowed range %f ns to %f ns.", CLKIN2_PERIOD, 1000.0/CLKIN_FREQ_MAX, 1000.0/CLKIN_FREQ_MIN);
+ $finish;
+ end
+ end
+
+ period_clkin = (clkinsel_in) ? CLKIN1_PERIOD : CLKIN2_PERIOD;
+ clkvco_freq_init_chk = 1000.0 * CLKFBOUT_MULT / (period_clkin * DIVCLK_DIVIDE);
+
+ if (clkvco_freq_init_chk > VCOCLK_FREQ_MAX || clkvco_freq_init_chk < VCOCLK_FREQ_MIN) begin
+ $display (" Attribute Syntax Error : The calculation of VCO frequency=%f Mhz. This exceeds the permitted VCO frequency range of %f Mhz to %f Mhz. The VCO frequency is calculated with formula: VCO frequency = CLKFBOUT_MULT / (DIVCLK_DIVIDE * CLKIN_PERIOD). Please adjust the attributes to the permitted VCO frequency range.", clkvco_freq_init_chk, VCOCLK_FREQ_MIN, VCOCLK_FREQ_MAX);
+ $finish;
+ end
+end
+
+ assign init_trig = 1;
+
+
+ assign clkpll_tmp = (clkinsel_in) ? clkin1_in : clkin2_in;
+ assign clkpll = (pmcd_mode) ? 0 : clkpll_tmp;
+
+ assign orig_rst_in = rst_input;
+
+always @(posedge clkpll or posedge orig_rst_in)
+ if (orig_rst_in)
+ rst_in1 <= 1;
+ else
+ rst_in1 <= orig_rst_in;
+
+ assign rst_in = (rst_in1 || rst_unlock);
+
+ always @(posedge pll_unlock)
+ if (rst_on_loss ) begin
+ rst_unlock <= 1'b1;
+ rst_unlock <= #10000 1'b0;
+ end
+
+always @(rst_input )
+ if (rst_input==1)
+ rst_edge = $time;
+ else if (rst_input==0 && rst_edge > 1) begin
+ rst_ht = $time - rst_edge;
+ if (rst_ht < 10000)
+ $display("Input Error : RST on instance %m at time %t must be asserted at least for 10 ns.", $time);
+ end
+
+//
+// DRP port read and write
+//
+
+ assign do_out = dr_sram[daddr_lat];
+
+always @(posedge dclk_in or posedge gsr_in)
+ if (gsr_in == 1) begin
+ drp_lock <= 0;
+ end
+ else begin
+ if (den_in == 1) begin
+ valid_daddr = addr_is_valid(daddr_in);
+ if (drp_lock == 1) begin
+ $display(" Warning : DEN is high at PLL_ADV instance %m at time %t. Need wait for DRDY signal before next read/write operation through DRP. ", $time);
+ $finish;
+ end
+ else begin
+ drp_lock <= 1;
+ daddr_lat <= daddr_in;
+ end
+
+ if (valid_daddr && ( daddr_in == 5'b00110 || daddr_in == 5'b00001 || daddr_in == 5'b00000 ||
+ (daddr_in >= 5'b01100 && daddr_in <= 5'b11100 && daddr_in != 5'b10000 &&
+ daddr_in != 5'b10001 && daddr_in != 5'b11000 ))) begin
+ end
+ else begin
+ $display(" Warning : Address DADDR=%b is unsupported at PLL_ADV instance %m at time %t. ", DADDR, $time);
+ end
+
+ if (dwe_in == 1) begin // write process
+ if (rst_input == 1) begin
+ if (valid_daddr && ( daddr_in == 5'b00110 || daddr_in == 5'b00001 || daddr_in == 5'b00000 ||
+ (daddr_in >= 5'b01100 && daddr_in <= 5'b11100 && daddr_in != 5'b10000 &&
+ daddr_in != 5'b10001 && daddr_in != 5'b11000 ))) begin
+ dr_sram[daddr_in] <= di_in;
+ end
+
+ if (daddr_in == 5'b11100)
+ clkout_delay_para_drp (clkout0_dly, clk0_nocnt, clk0_edge, di_in, daddr_in);
+
+ if (daddr_in == 5'b11011)
+ clkout_hl_para_drp (clk0_lt, clk0_ht, clk0pm_sel, di_in, daddr_in);
+
+ if (daddr_in == 5'b11010)
+ clkout_delay_para_drp (clkout1_dly, clk1_nocnt, clk1_edge, di_in, daddr_in);
+
+ if (daddr_in == 5'b11001)
+ clkout_hl_para_drp (clk1_lt, clk1_ht, clk1pm_sel, di_in, daddr_in);
+
+ if (daddr_in == 5'b10111)
+ clkout_delay_para_drp (clkout2_dly, clk2_nocnt, clk2_edge, di_in, daddr_in);
+
+ if (daddr_in == 5'b10110)
+ clkout_hl_para_drp (clk2_lt, clk2_ht, clk2pm_sel, di_in, daddr_in);
+
+ if (daddr_in == 5'b10101)
+ clkout_delay_para_drp (clkout3_dly, clk3_nocnt, clk3_edge, di_in, daddr_in);
+
+ if (daddr_in == 5'b10100)
+ clkout_hl_para_drp (clk3_lt, clk3_ht, clk3pm_sel, di_in, daddr_in);
+
+ if (daddr_in == 5'b10011)
+ clkout_delay_para_drp (clkout4_dly, clk4_nocnt, clk4_edge, di_in, daddr_in);
+
+ if (daddr_in == 5'b10010)
+ clkout_hl_para_drp (clk4_lt, clk4_ht, clk4pm_sel, di_in, daddr_in);
+
+ if (daddr_in == 5'b01111)
+ clkout_delay_para_drp (clkout5_dly, clk5_nocnt, clk5_edge, di_in, daddr_in);
+
+ if (daddr_in == 5'b01110)
+ clkout_hl_para_drp (clk5_lt, clk5_ht, clk5pm_sel, di_in, daddr_in);
+
+ if (daddr_in == 5'b01101)
+ clkout_delay_para_drp (clkfbm1_dly, clkfbm1_nocnt, clkfbm1_edge, di_in, daddr_in);
+
+ if (daddr_in == 5'b01100)
+ clkout_hl_para_drp (clkfbm1_lt, clkfbm1_ht, clkfbm1pm_sel, di_in, daddr_in);
+
+ if (daddr_in == 5'b00110) begin
+ clkind_lt <= di_in[5:0];
+ clkind_ht <= di_in[11:6];
+ if ( di_in[5:0] == 6'b0 && di_in[11:6] == 6'b0 )
+ clkind_div <= 8'b10000000;
+ else if (di_in[5:0] == 6'b0 && di_in[11:6] != 6'b0 )
+ clkind_div <= 64 + di_in[11:6];
+ else if (di_in[5:0] == 6'b0 && di_in[11:6] != 6'b0 )
+ clkind_div <= 64 + di_in[5:0];
+ else
+ clkind_div <= di_in[5:0] + di_in[11:6];
+ clkind_nocnt <= di_in[12];
+ clkind_edge <= di_in[13];
+ end
+
+ end
+ else begin
+ $display(" Error : RST is low at PLL_ADV instance %m at time %t. RST need to be high when change X_PLL_ADV paramters through DRP. ", $time);
+ end
+
+ end //DWE
+
+ end //DEN
+ if ( drp_lock == 1) begin
+ drp_lock <= 0;
+ drp_lock1 <= 1;
+ end
+ if (drp_lock1 == 1) begin
+ drp_lock1 <= 0;
+ drdy_out <= 1;
+ end
+ if (drdy_out == 1)
+ drdy_out <= 0;
+end
+
+function addr_is_valid;
+input [6:0] daddr_funcin;
+begin
+ addr_is_valid = 1;
+ for (i=0; i<=6; i=i+1)
+ if ( daddr_funcin[i] != 0 && daddr_funcin[i] != 1)
+ addr_is_valid = 0;
+end
+endfunction
+
+
+// end process drp;
+
+
+//
+// determine clock period
+//
+
+ always @(posedge clkpll or posedge rst_in)
+ if (rst_in)
+ begin
+ clkin_period[0] <= period_vco_target;
+ clkin_period[1] <= period_vco_target;
+ clkin_period[2] <= period_vco_target;
+ clkin_period[3] <= period_vco_target;
+ clkin_period[4] <= period_vco_target;
+ clkin_jit <= 0;
+ clkin_lock_cnt <= 0;
+ pll_locked_tm <= 0;
+ lock_period <= 0;
+ pll_locked_tmp1 <= 0;
+ clkout_en0_tmp <= 0;
+ unlock_recover <= 0;
+ clkin_edge <= 0;
+ end
+ else begin
+ clkin_edge <= $time;
+ clkin_period[4] <= clkin_period[3];
+ clkin_period[3] <= clkin_period[2];
+ clkin_period[2] <= clkin_period[1];
+ clkin_period[1] <= clkin_period[0];
+ if (clkin_edge != 0 && clkin_stopped_p == 0 && clkin_stopped_n == 0)
+ clkin_period[0] <= $time - clkin_edge;
+
+ if (pll_unlock == 0)
+ clkin_jit <= $time - clkin_edge - clkin_period[0];
+ else
+ clkin_jit <= 0;
+
+ if ( (clkin_lock_cnt < lock_cnt_max) && fb_delay_found && pll_unlock == 0)
+ clkin_lock_cnt <= clkin_lock_cnt + 1;
+ else if (pll_unlock == 1 && rst_on_loss ==0 && pll_locked_tmp1 ==1 ) begin
+ clkin_lock_cnt <= locked_en_time;
+ unlock_recover <= 1;
+ end
+
+ if ( clkin_lock_cnt >= `PLL_LOCK_TIME && pll_unlock == 0)
+ pll_locked_tm <= 1;
+
+ if ( clkin_lock_cnt == 6 )
+ lock_period <= 1;
+
+ if (clkin_lock_cnt >= clkout_en_time) begin
+ clkout_en0_tmp <= 1;
+ end
+
+ if (clkin_lock_cnt >= locked_en_time)
+ pll_locked_tmp1 <= 1;
+
+ if (unlock_recover ==1 && clkin_lock_cnt >= lock_cnt_max)
+ unlock_recover <= 0;
+ end
+
+ always @(clkout_en0_tmp)
+ if (clkout_en0_tmp==0)
+ clkout_en0 = 0;
+ else
+ @(negedge clkpll)
+ clkout_en0 <= #(clkin_period[0]/2) clkout_en0_tmp;
+
+ always @(clkout_en0)
+ clkout_en <= #(clkvco_delay) clkout_en0;
+
+ always @(pll_locked_tmp1 )
+ if (pll_locked_tmp1==0)
+ pll_locked_tmp2 = pll_locked_tmp1;
+ else begin
+ pll_locked_tmp2 <= #pll_locked_delay pll_locked_tmp1;
+ end
+
+
+ always @(rst_in)
+ if (rst_in) begin
+ assign pll_locked_tmp2 = 0;
+ assign clkout_en0 = 0;
+ assign clkout_en = 0;
+ end
+ else begin
+ deassign pll_locked_tmp2;
+ deassign clkout_en0;
+ deassign clkout_en;
+ end
+
+ assign locked_out = (pll_locked_tm && pll_locked_tmp2 && ~pll_unlock && !unlock_recover) ? 1 : 0;
+
+
+ always @(clkin_period[0] or clkin_period[1] or clkin_period[2] or
+ clkin_period[3] or clkin_period[4] or period_avg)
+ if ( clkin_period[0] != period_avg)
+ period_avg = (clkin_period[0] + clkin_period[1] + clkin_period[2]
+ + clkin_period[3] + clkin_period[4])/5;
+
+ always @(period_avg or clkind_div or clkfbm1_div) begin
+ period_fb = period_avg * clkind_div;
+ period_vco = period_fb / clkfbm1_div;
+ period_vco_half = period_vco /2;
+ pll_locked_delay = period_fb * clkfbm1_div;
+ clkin_dly_t = period_avg * (clkind_div + 1.25);
+ clkfb_dly_t = period_fb * 2.25 ;
+ period_vco1 = period_vco / 8;
+ period_vco2 = period_vco / 4;
+ period_vco3 = period_vco * 3/ 8;
+ period_vco4 = period_vco / 2;
+ period_vco5 = period_vco * 5 / 8;
+ period_vco6 = period_vco *3 / 4;
+ period_vco7 = period_vco * 7 / 8;
+ md_product = clkind_div * clkfbm1_div;
+ md_product_dbl = clkind_div * clkfbm1_div * 2;
+ end
+
+ assign clkvco_lk_rst = ( rst_in == 1 || pll_unlock == 1 || pll_locked_tm == 0) ? 1 : 0;
+
+ always @(clkvco_lk_rst)
+ if (clkvco_lk_rst)
+ assign clkvco_lk = 0;
+ else
+ deassign clkvco_lk;
+
+
+// always @(posedge clkpll or posedge rst_in or posedge pll_unlock)
+// if ( rst_in == 1 || pll_unlock == 1 || pll_locked_tm == 0) begin
+// clkvco_lk <= 0;
+// end
+// else begin
+ always @(posedge clkpll)
+ if (pll_locked_tm ==1) begin
+ clkvco_lk <= 1;
+ for (i1=1; i1 < md_product_dbl; i1=i1+1)
+ #(period_vco_half) clkvco_lk <= ~clkvco_lk;
+ end
+
+
+ always @(fb_delay or period_vco or clkfbm1_dly or clkfbm1pm_rl) begin
+ val_tmp = period_vco * md_product;
+ fbm1_comp_delay = period_vco *(clkfbm1_dly + clkfbm1pm_rl );
+ dly_tmp = fb_delay + fbm1_comp_delay;
+ if (fb_delay == 0)
+ clkvco_delay = 0;
+ else if ( dly_tmp < val_tmp)
+ clkvco_delay = val_tmp - dly_tmp;
+ else
+ clkvco_delay = val_tmp - dly_tmp % val_tmp ;
+ end
+
+ always @(clkfbm1pm_sel)
+ case (clkfbm1pm_sel)
+ 3'b000 : clkfbm1pm_rl = 0.0;
+ 3'b001 : clkfbm1pm_rl = 0.125;
+ 3'b010 : clkfbm1pm_rl = 0.25;
+ 3'b011 : clkfbm1pm_rl = 0.375;
+ 3'b100 : clkfbm1pm_rl = 0.50;
+ 3'b101 : clkfbm1pm_rl = 0.625;
+ 3'b110 : clkfbm1pm_rl = 0.75;
+ 3'b111 : clkfbm1pm_rl = 0.875;
+ endcase
+
+ always @(clkvco_free )
+ if (pmcd_mode != 1 && pll_locked_tm == 0)
+ clkvco_free <= #period_vco_target_half ~clkvco_free;
+
+ always @(clkvco_lk or clkvco_free or pll_locked_tm)
+ if ( pll_locked_tm)
+ clkvco <= #clkvco_delay clkvco_lk;
+ else
+ clkvco <= #clkvco_delay clkvco_free;
+
+ always @(clk0_ht or clk0_lt or clk0_nocnt or init_trig)
+ clkout_pm_cal(clk0_ht1, clk0_div, clk0_div1, clk0_ht, clk0_lt, clk0_nocnt, clk0_edge);
+
+ always @(clk1_ht or clk1_lt or clk1_nocnt or init_trig)
+ clkout_pm_cal(clk1_ht1, clk1_div, clk1_div1, clk1_ht, clk1_lt, clk1_nocnt, clk1_edge);
+
+ always @(clk2_ht or clk2_lt or clk2_nocnt or init_trig)
+ clkout_pm_cal(clk2_ht1, clk2_div, clk2_div1, clk2_ht, clk2_lt, clk2_nocnt, clk2_edge);
+
+ always @(clk3_ht or clk3_lt or clk3_nocnt or init_trig)
+ clkout_pm_cal(clk3_ht1, clk3_div, clk3_div1, clk3_ht, clk3_lt, clk3_nocnt, clk3_edge);
+
+ always @(clk4_ht or clk4_lt or clk4_nocnt or init_trig)
+ clkout_pm_cal(clk4_ht1, clk4_div, clk4_div1, clk4_ht, clk4_lt, clk4_nocnt, clk4_edge);
+
+ always @(clk5_ht or clk5_lt or clk5_nocnt or init_trig)
+ clkout_pm_cal(clk5_ht1, clk5_div, clk5_div1, clk5_ht, clk5_lt, clk5_nocnt, clk5_edge);
+
+ always @(clkfbm1_ht or clkfbm1_lt or clkfbm1_nocnt or init_trig)
+ clkout_pm_cal(clkfbm1_ht1, clkfbm1_div, clkfbm1_div1, clkfbm1_ht, clkfbm1_lt, clkfbm1_nocnt, clkfbm1_edge);
+
+ always @(rst_in)
+ if (rst_in)
+ assign clkout_mux = 8'b0;
+ else
+ deassign clkout_mux;
+
+ always @(clkvco or clkout_en )
+ if (clkout_en) begin
+ clkout_mux[0] <= clkvco;
+ clkout_mux[1] <= #(period_vco1) clkvco;
+ clkout_mux[2] <= #(period_vco2) clkvco;
+ clkout_mux[3] <= #(period_vco3) clkvco;
+ clkout_mux[4] <= #(period_vco4) clkvco;
+ clkout_mux[5] <= #(period_vco5) clkvco;
+ clkout_mux[6] <= #(period_vco6) clkvco;
+ clkout_mux[7] <= #(period_vco7) clkvco;
+ end
+
+ assign clk0in = clkout_mux[clk0pm_sel];
+ assign clk1in = clkout_mux[clk1pm_sel];
+ assign clk2in = clkout_mux[clk2pm_sel];
+ assign clk3in = clkout_mux[clk3pm_sel];
+ assign clk4in = clkout_mux[clk4pm_sel];
+ assign clk5in = clkout_mux[clk5pm_sel];
+ assign clkfbm1in = clkout_mux[clkfbm1pm_sel];
+
+ assign clk0ps_en = (clk0_dly_cnt == clkout0_dly) ? clkout_en : 0;
+ assign clk1ps_en = (clk1_dly_cnt == clkout1_dly) ? clkout_en : 0;
+ assign clk2ps_en = (clk2_dly_cnt == clkout2_dly) ? clkout_en : 0;
+ assign clk3ps_en = (clk3_dly_cnt == clkout3_dly) ? clkout_en : 0;
+ assign clk4ps_en = (clk4_dly_cnt == clkout4_dly) ? clkout_en : 0;
+ assign clk5ps_en = (clk5_dly_cnt == clkout5_dly) ? clkout_en : 0;
+ assign clkfbm1ps_en = (clkfbm1_dly_cnt == clkfbm1_dly) ? clkout_en : 0;
+
+ always @(negedge clk0in or posedge rst_in)
+ if (rst_in)
+ clk0_dly_cnt <= 6'b0;
+ else
+ if (clk0_dly_cnt < clkout0_dly && clkout_en ==1)
+ clk0_dly_cnt <= clk0_dly_cnt + 1;
+
+ always @(negedge clk1in or posedge rst_in)
+ if (rst_in)
+ clk1_dly_cnt <= 6'b0;
+ else
+ if (clk1_dly_cnt < clkout1_dly && clkout_en ==1)
+ clk1_dly_cnt <= clk1_dly_cnt + 1;
+
+ always @(negedge clk2in or posedge rst_in)
+ if (rst_in)
+ clk2_dly_cnt <= 6'b0;
+ else
+ if (clk2_dly_cnt < clkout2_dly && clkout_en ==1)
+ clk2_dly_cnt <= clk2_dly_cnt + 1;
+
+ always @(negedge clk3in or posedge rst_in)
+ if (rst_in)
+ clk3_dly_cnt <= 6'b0;
+ else
+ if (clk3_dly_cnt < clkout3_dly && clkout_en ==1)
+ clk3_dly_cnt <= clk3_dly_cnt + 1;
+
+ always @(negedge clk4in or posedge rst_in)
+ if (rst_in)
+ clk4_dly_cnt <= 6'b0;
+ else
+ if (clk4_dly_cnt < clkout4_dly && clkout_en ==1)
+ clk4_dly_cnt <= clk4_dly_cnt + 1;
+
+ always @(negedge clk5in or posedge rst_in)
+ if (rst_in)
+ clk5_dly_cnt <= 6'b0;
+ else
+ if (clk5_dly_cnt < clkout5_dly && clkout_en ==1)
+ clk5_dly_cnt <= clk5_dly_cnt + 1;
+
+ always @(negedge clkfbm1in or posedge rst_in)
+ if (rst_in)
+ clkfbm1_dly_cnt <= 6'b0;
+ else
+ if (clkfbm1_dly_cnt < clkfbm1_dly && clkout_en ==1)
+ clkfbm1_dly_cnt <= clkfbm1_dly_cnt + 1;
+
+ always @(posedge clk0in or negedge clk0in or posedge rst_in)
+ if (rst_in) begin
+ clk0_cnt <= 8'b0;
+ clk0_out <= 0;
+ end
+ else if (clk0ps_en) begin
+ if (clk0_cnt < clk0_div1)
+ clk0_cnt <= clk0_cnt + 1;
+ else
+ clk0_cnt <= 8'b0;
+
+ if (clk0_cnt < clk0_ht1)
+ clk0_out <= 1;
+ else
+ clk0_out <= 0;
+ end
+ else begin
+ clk0_cnt <= 8'b0;
+ clk0_out <= 0;
+ end
+
+ always @(posedge clk1in or negedge clk1in or posedge rst_in)
+ if (rst_in) begin
+ clk1_cnt <= 8'b0;
+ clk1_out <= 0;
+ end
+ else if (clk1ps_en) begin
+ if (clk1_cnt < clk1_div1)
+ clk1_cnt <= clk1_cnt + 1;
+ else
+ clk1_cnt <= 8'b0;
+
+ if (clk1_cnt < clk1_ht1)
+ clk1_out <= 1;
+ else
+ clk1_out <= 0;
+ end
+ else begin
+ clk1_cnt <= 8'b0;
+ clk1_out <= 0;
+ end
+
+ always @(posedge clk2in or negedge clk2in or posedge rst_in)
+ if (rst_in) begin
+ clk2_cnt <= 8'b0;
+ clk2_out <= 0;
+ end
+ else if (clk2ps_en) begin
+ if (clk2_cnt < clk2_div1)
+ clk2_cnt <= clk2_cnt + 1;
+ else
+ clk2_cnt <= 8'b0;
+
+ if (clk2_cnt < clk2_ht1)
+ clk2_out <= 1;
+ else
+ clk2_out <= 0;
+ end
+ else begin
+ clk2_cnt <= 8'b0;
+ clk2_out <= 0;
+ end
+
+ always @(posedge clk3in or negedge clk3in or posedge rst_in)
+ if (rst_in) begin
+ clk3_cnt <= 8'b0;
+ clk3_out <= 0;
+ end
+ else if (clk3ps_en) begin
+ if (clk3_cnt < clk3_div1)
+ clk3_cnt <= clk3_cnt + 1;
+ else
+ clk3_cnt <= 8'b0;
+
+ if (clk3_cnt < clk3_ht1)
+ clk3_out <= 1;
+ else
+ clk3_out <= 0;
+ end
+ else begin
+ clk3_cnt <= 8'b0;
+ clk3_out <= 0;
+ end
+
+
+ always @(posedge clk4in or negedge clk4in or posedge rst_in)
+ if (rst_in) begin
+ clk4_cnt <= 8'b0;
+ clk4_out <= 0;
+ end
+ else if (clk4ps_en) begin
+ if (clk4_cnt < clk4_div1)
+ clk4_cnt <= clk4_cnt + 1;
+ else
+ clk4_cnt <= 8'b0;
+
+ if (clk4_cnt < clk4_ht1)
+ clk4_out <= 1;
+ else
+ clk4_out <= 0;
+ end
+ else begin
+ clk4_cnt <= 8'b0;
+ clk4_out <= 0;
+ end
+
+
+ always @(posedge clk5in or negedge clk5in or posedge rst_in)
+ if (rst_in) begin
+ clk5_cnt <= 8'b0;
+ clk5_out <= 0;
+ end
+ else if (clk5ps_en) begin
+ if (clk5_cnt < clk5_div1)
+ clk5_cnt <= clk5_cnt + 1;
+ else
+ clk5_cnt <= 8'b0;
+
+ if (clk5_cnt < clk5_ht1)
+ clk5_out <= 1;
+ else
+ clk5_out <= 0;
+ end
+ else begin
+ clk5_cnt <= 8'b0;
+ clk5_out <= 0;
+ end
+
+
+ always @(posedge clkfbm1in or negedge clkfbm1in or posedge rst_in)
+ if (rst_in) begin
+ clkfbm1_cnt <= 8'b0;
+ clkfbm1_out <= 0;
+ end
+ else if (clkfbm1ps_en) begin
+ if (clkfbm1_cnt < clkfbm1_div1)
+ clkfbm1_cnt <= clkfbm1_cnt + 1;
+ else
+ clkfbm1_cnt <= 8'b0;
+
+ if (clkfbm1_cnt < clkfbm1_ht1)
+ clkfbm1_out <= 1;
+ else
+ clkfbm1_out <= 0;
+ end
+ else begin
+ clkfbm1_cnt <= 8'b0;
+ clkfbm1_out <= 0;
+ end
+
+
+
+ always @(clk0_out or clkfb_tst or fb_delay_found)
+ if (fb_delay_found == 1)
+ clkout0_out = clk0_out;
+ else
+ clkout0_out = clkfb_tst;
+
+ always @(clk1_out or clkfb_tst or fb_delay_found)
+ if (fb_delay_found == 1)
+ clkout1_out = clk1_out;
+ else
+ clkout1_out = clkfb_tst;
+
+ always @(clk2_out or clkfb_tst or fb_delay_found)
+ if (fb_delay_found == 1)
+ clkout2_out = clk2_out;
+ else
+ clkout2_out = clkfb_tst;
+
+ always @(clk3_out or clkfb_tst or fb_delay_found)
+ if (fb_delay_found == 1)
+ clkout3_out = clk3_out;
+ else
+ clkout3_out = clkfb_tst;
+
+ always @(clk4_out or clkfb_tst or fb_delay_found)
+ if (fb_delay_found == 1)
+ clkout4_out = clk4_out;
+ else
+ clkout4_out = clkfb_tst;
+
+ always @(clk5_out or clkfb_tst or fb_delay_found)
+ if (fb_delay_found == 1)
+ clkout5_out = clk5_out;
+ else
+ clkout5_out = clkfb_tst;
+
+ always @(clkfbm1_out or clkfb_tst or fb_delay_found)
+ if (fb_delay_found == 1)
+ clkfb_out = clkfbm1_out;
+ else
+ clkfb_out = clkfb_tst;
+
+//
+// determine feedback delay
+//
+
+always @(rst_in1)
+ if (rst_in1)
+ assign clkfb_tst = 0;
+ else
+ deassign clkfb_tst;
+
+always @(posedge clkpll )
+ if (fb_delay_found_tmp == 0 && GSR == 0 && rst_in1 == 0) begin
+ clkfb_tst <= 1'b1;
+ end
+ else
+ clkfb_tst <= 1'b0;
+
+
+always @( posedge clkfb_tst or posedge rst_in1 )
+ if (rst_in1)
+ delay_edge <= 0;
+ else
+ delay_edge <= $time;
+
+always @(posedge clkfb_in or posedge rst_in1 )
+ if (rst_in1) begin
+ fb_delay <= 0;
+ fb_delay_found_tmp <= 0;
+ end
+ else
+ if (fb_delay_found_tmp ==0 ) begin
+ if ( delay_edge != 0)
+ fb_delay <= ($time - delay_edge);
+ else
+ fb_delay <= 0;
+ fb_delay_found_tmp <= 1;
+ end
+
+always @(rst_in1)
+ if (rst_in1)
+ assign fb_delay_found = 0;
+ else
+ deassign fb_delay_found;
+
+always @(fb_delay_found_tmp or clkvco_delay )
+ fb_delay_found <= #(clkvco_delay) fb_delay_found_tmp;
+
+
+always @(fb_delay)
+ if (rst_in1==0 && (fb_delay/1000.0 > fb_delay_max)) begin
+ $display("Warning : The feedback delay on PLL_ADV instance %m at time %t is %f ns. It is over the maximun value %f ns.", $time, fb_delay / 1000.0, fb_delay_max);
+ end
+
+//
+// generate unlock signal
+//
+
+always @(clkpll)
+ clkpll_dly <= #clkin_dly_t clkpll;
+
+always @(clkfb_in)
+ if (pmcd_mode != 1)
+ clkfbin_dly <= #clkfb_dly_t clkfb_in;
+ else
+ clkfbin_dly = 0;
+
+always @( posedge clkpll_dly or negedge clkpll or posedge rst_in)
+ if (rst_in || clkpll == 0) begin
+ clkstop_cnt_p = 0;
+ clkin_stopped_p = 0;
+ end
+ else
+ if (fb_delay_found && pll_locked_tmp2) begin
+ if (clkpll && clkpll_jitter_unlock == 0)
+ clkstop_cnt_p <= clkstop_cnt_p +1;
+ else
+ clkstop_cnt_p = 0;
+
+ if (clkstop_cnt_p > clkin_stop_max)
+ clkin_stopped_p <= 1;
+ else
+ clkin_stopped_p = 0;
+ end
+ else begin
+ clkstop_cnt_p = 0;
+ clkin_stopped_p = 0;
+ end
+
+always @( posedge clkpll_dly or posedge clkpll or posedge rst_in)
+ if (rst_in || clkpll == 1) begin
+ clkstop_cnt_n = 0;
+ clkin_stopped_n = 0;
+ end
+ else
+ if (fb_delay_found && pll_locked_tmp2) begin
+ if (clkpll==0 && clkpll_jitter_unlock == 0)
+ clkstop_cnt_n <= clkstop_cnt_n +1;
+ else
+ clkstop_cnt_n = 0;
+
+ if (clkstop_cnt_n > clkin_stop_max)
+ clkin_stopped_n <= 1;
+ else
+ clkin_stopped_n = 0;
+ end
+ else begin
+ clkstop_cnt_n = 0;
+ clkin_stopped_n = 0;
+ end
+
+
+always @( posedge clkfbin_dly or negedge clkfb_in or posedge rst_in)
+ if (rst_in || clkfb_in == 0) begin
+ clkfbstop_cnt_p = 0;
+ clkfb_stopped_p = 0;
+ end
+ else
+ if (fb_delay_found && pll_locked_tmp2) begin
+ if (clkfb_in && clkpll_jitter_unlock == 0)
+ clkfbstop_cnt_p <= clkfbstop_cnt_p +1;
+ else
+ clkfbstop_cnt_p = 0;
+
+ if (clkfbstop_cnt_p > clkfb_stop_max)
+ clkfb_stopped_p <= 1;
+ else
+ clkfb_stopped_p = 0;
+ end
+ else begin
+ clkfbstop_cnt_p = 0;
+ clkfb_stopped_p = 0;
+ end
+
+always @( posedge clkfbin_dly or posedge clkfb_in or posedge rst_in)
+ if (rst_in==1 || clkfb_in == 1) begin
+ clkfbstop_cnt_n = 0;
+ clkfb_stopped_n = 0;
+ end
+ else
+ if (fb_delay_found && pll_locked_tmp2) begin
+ if (clkfb_in==0 && clkpll_jitter_unlock == 0)
+ clkfbstop_cnt_n <= clkfbstop_cnt_n +1;
+ else
+ clkfbstop_cnt_n = 0;
+
+ if (clkfbstop_cnt_n > clkfb_stop_max)
+ clkfb_stopped_n <= 1;
+ else
+ clkfb_stopped_n = 0;
+ end
+ else begin
+ clkfbstop_cnt_n = 0;
+ clkfb_stopped_n = 0;
+ end
+
+always @(clkin_jit or rst_in )
+ if (rst_in)
+ clkpll_jitter_unlock = 0;
+ else
+ if ( pll_locked_tmp2 && clkfb_stopped == 0 && clkin_stopped == 0) begin
+ if ((clkin_jit > REF_CLK_JITTER_MAX_tmp) || (clkin_jit < -REF_CLK_JITTER_MAX_tmp))
+ clkpll_jitter_unlock = 1;
+ else
+ clkpll_jitter_unlock = 0;
+ end
+ else
+ clkpll_jitter_unlock = 0;
+
+ assign clkin_stopped = (clkin_stopped_p || clkin_stopped_n) ? 1 : 0;
+ assign clkfb_stopped = (clkfb_stopped_p ||clkfb_stopped_n) ? 1 : 0;
+ assign pll_unlock = (clkin_stopped || clkfb_stopped || clkpll_jitter_unlock) ? 1 : 0;
+
+// tasks
+
+
+task clkout_dly_cal;
+output [5:0] clkout_dly;
+output [2:0] clkpm_sel;
+input clkdiv;
+input clk_ps;
+input reg [160:0] clk_ps_name;
+
+integer clkdiv;
+real clk_ps;
+real clk_ps_rl;
+
+real clk_dly_rl, clk_dly_rem;
+integer clkout_dly_tmp;
+
+begin
+
+ if (clk_ps < 0.0)
+ clk_dly_rl = (360.0 + clk_ps) * clkdiv / 360.0;
+ else
+ clk_dly_rl = clk_ps * clkdiv / 360.0;
+
+ clkout_dly_tmp = $rtoi(clk_dly_rl);
+
+ if (clkout_dly_tmp > 63) begin
+ $display(" Warning : Attribute %s of PLL_ADV on instance %m is set to %f. Required phase shifting can not be reached since it is over the maximum phase shifting ability of X_PLL_ADV", clk_ps_name, clk_ps);
+ clkout_dly = 6'b111111;
+ end
+ else
+ clkout_dly = clkout_dly_tmp;
+
+ clk_dly_rem = clk_dly_rl - clkout_dly;
+
+ if (clk_dly_rem < 0.125)
+ clkpm_sel = 0;
+ else if (clk_dly_rem >= 0.125 && clk_dly_rem < 0.25)
+ clkpm_sel = 1;
+ else if (clk_dly_rem >= 0.25 && clk_dly_rem < 0.375)
+ clkpm_sel = 2;
+ else if (clk_dly_rem >= 0.375 && clk_dly_rem < 0.5)
+ clkpm_sel = 3;
+ else if (clk_dly_rem >= 0.5 && clk_dly_rem < 0.625)
+ clkpm_sel = 4;
+ else if (clk_dly_rem >= 0.625 && clk_dly_rem < 0.75)
+ clkpm_sel = 5;
+ else if (clk_dly_rem >= 0.75 && clk_dly_rem < 0.875)
+ clkpm_sel = 6;
+ else if (clk_dly_rem >= 0.875 )
+ clkpm_sel = 7;
+
+ if (clk_ps < 0.0)
+ clk_ps_rl = (clkout_dly + 0.125 * clkpm_sel)* 360.0 / clkdiv - 360.0;
+ else
+ clk_ps_rl = (clkout_dly + 0.125 * clkpm_sel) * 360.0 / clkdiv;
+
+ if (((clk_ps_rl- clk_ps) > 0.001) || ((clk_ps_rl- clk_ps) < -0.001))
+ $display(" Warning : Attribute %s of PLL_ADV on instance %m is set to %f. Real phase shifting is %f. Required phase shifting can not be reached.", clk_ps_name, clk_ps, clk_ps_rl);
+
+end
+endtask
+
+
+task clk_out_para_cal;
+output [6:0] clk_ht;
+output [6:0] clk_lt;
+output clk_nocnt;
+output clk_edge;
+input CLKOUT_DIVIDE;
+input CLKOUT_DUTY_CYCLE;
+
+integer CLKOUT_DIVIDE;
+real CLKOUT_DUTY_CYCLE;
+
+real tmp_value;
+integer tmp_value1;
+real tmp_value2;
+
+begin
+ tmp_value = CLKOUT_DIVIDE * CLKOUT_DUTY_CYCLE;
+ tmp_value1 = $rtoi(tmp_value * 2) % 2;
+ tmp_value2 = CLKOUT_DIVIDE - tmp_value;
+
+
+ if ((tmp_value) >= O_MAX_HT_LT) begin
+// clk_ht = O_MAX_HT_LT;
+ clk_ht = 7'b1000000;
+ end
+ else begin
+ if (tmp_value < 1.0)
+ clk_ht = 1;
+ else
+ if ( tmp_value1 != 0)
+ clk_ht = $rtoi(tmp_value) + 1;
+ else
+ clk_ht = $rtoi(tmp_value);
+ end
+
+ if ( (CLKOUT_DIVIDE - clk_ht) >= O_MAX_HT_LT)
+ clk_lt = 7'b1000000;
+ else
+ clk_lt = CLKOUT_DIVIDE - clk_ht;
+
+ clk_nocnt = (CLKOUT_DIVIDE ==1) ? 1 : 0;
+ if ( tmp_value < 1.0)
+ clk_edge = 1;
+ else if (tmp_value1 != 0)
+ clk_edge = 1;
+ else
+ clk_edge = 0;
+end
+endtask
+
+
+function clkout_duty_chk;
+ input CLKOUT_DIVIDE;
+ input CLKOUT_DUTY_CYCLE;
+ input reg [160:0] CLKOUT_DUTY_CYCLE_N;
+
+ integer CLKOUT_DIVIDE, step_tmp;
+ real CLKOUT_DUTY_CYCLE;
+
+ real CLK_DUTY_CYCLE_MIN, CLK_DUTY_CYCLE_MAX, CLK_DUTY_CYCLE_STEP;
+ real CLK_DUTY_CYCLE_MIN_rnd;
+ reg clk_duty_tmp_int;
+
+begin
+
+ if (CLKOUT_DIVIDE > O_MAX_HT_LT) begin
+ CLK_DUTY_CYCLE_MIN = (CLKOUT_DIVIDE - O_MAX_HT_LT)/CLKOUT_DIVIDE;
+ CLK_DUTY_CYCLE_MAX = (O_MAX_HT_LT + 0.5)/CLKOUT_DIVIDE;
+ CLK_DUTY_CYCLE_MIN_rnd = CLK_DUTY_CYCLE_MIN;
+ end
+ else begin
+ if (CLKOUT_DIVIDE == 1) begin
+ CLK_DUTY_CYCLE_MIN = 0.0;
+ CLK_DUTY_CYCLE_MIN_rnd = 0.0;
+ end
+ else begin
+ step_tmp = 1000 / CLKOUT_DIVIDE;
+ CLK_DUTY_CYCLE_MIN_rnd = step_tmp / 1000.0;
+ CLK_DUTY_CYCLE_MIN = 1.0 /CLKOUT_DIVIDE;
+ end
+ CLK_DUTY_CYCLE_MAX = 1.0;
+ end
+
+ if (CLKOUT_DUTY_CYCLE > CLK_DUTY_CYCLE_MAX || CLKOUT_DUTY_CYCLE < CLK_DUTY_CYCLE_MIN_rnd) begin
+ $display(" Attribute Syntax Warning : %s is set to %f on instance %m and is not in the allowed range %f to %f.", CLKOUT_DUTY_CYCLE_N, CLKOUT_DUTY_CYCLE, CLK_DUTY_CYCLE_MIN, CLK_DUTY_CYCLE_MAX );
+ end
+
+ clk_duty_tmp_int = 0;
+ CLK_DUTY_CYCLE_STEP = 0.5 / CLKOUT_DIVIDE;
+ for (j = 0; j < (2 * CLKOUT_DIVIDE - CLK_DUTY_CYCLE_MIN/CLK_DUTY_CYCLE_STEP); j = j + 1)
+ if (((CLK_DUTY_CYCLE_MIN + CLK_DUTY_CYCLE_STEP * j) - CLKOUT_DUTY_CYCLE) > -0.001 &&
+ ((CLK_DUTY_CYCLE_MIN + CLK_DUTY_CYCLE_STEP * j) - CLKOUT_DUTY_CYCLE) < 0.001)
+ clk_duty_tmp_int = 1;
+
+ if ( clk_duty_tmp_int != 1) begin
+ $display(" Attribute Syntax Warning : %s is set to %f on instance %m and is not an allowed value. Allowed values are:", CLKOUT_DUTY_CYCLE_N, CLKOUT_DUTY_CYCLE);
+ for (j = 0; j < (2 * CLKOUT_DIVIDE - CLK_DUTY_CYCLE_MIN/CLK_DUTY_CYCLE_STEP); j = j + 1)
+ $display("%f", CLK_DUTY_CYCLE_MIN + CLK_DUTY_CYCLE_STEP * j);
+ end
+
+ clkout_duty_chk = 1'b1;
+end
+endfunction
+
+
+function para_int_pmcd_chk;
+ input para_in;
+ input reg [160:0] para_name;
+ input range_low;
+ input range_high;
+ input pmcd_mode;
+ input pmcd_value;
+
+ integer para_in;
+ integer range_low;
+ integer range_high;
+ integer pmcd_value;
+begin
+
+ if (para_in < range_low || para_in > range_high)
+ begin
+ $display("Attribute Syntax Error : The Attribute %s on PLL_ADV instance %m is set to %d. Legal values for this attribute are %d to %d.", para_name, para_in, range_low, range_high);
+ $finish;
+ end
+ else if (pmcd_mode == 1 && para_in != pmcd_value) begin
+ $display("Attribute Syntax Error : The Attribute %s on PLL_ADV instance %m is set to %d when attribute PLL_PMCD_MODE is set to TRUE. Legal values for this attribute is %d when PLL in PMCD MODE.", para_name, para_in, pmcd_value);
+ $finish;
+ end
+
+ para_int_pmcd_chk = 1'b1;
+end
+endfunction
+
+function para_real_pmcd_chk;
+ input para_in;
+ input reg [160:0] para_name;
+ input range_low;
+ input range_high;
+ input pmcd_mode;
+ input pmcd_value;
+
+ real para_in;
+ real range_low;
+ real range_high;
+ real pmcd_value;
+begin
+
+ if (para_in < range_low || para_in > range_high)
+ begin
+ $display("Attribute Syntax Error : The Attribute %s on PLL_ADV instance %m is set to %f. Legal values for this attribute are %f to %f.", para_name, para_in, range_low, range_high);
+ $finish;
+ end
+ else if (pmcd_mode == 1 && para_in != pmcd_value) begin
+ $display("Attribute Syntax Error : The Attribute %s on PLL_ADV instance %m is set to %f when attribute PLL_PMCD_MODE is set to TRUE. Legal values for this attribute is %f when PLL in PMCD MODE.", para_name, para_in, pmcd_value);
+ $finish;
+ end
+
+ para_real_pmcd_chk = 1'b0;
+end
+endfunction
+
+function para_int_range_chk;
+ input para_in;
+ input reg [160:0] para_name;
+ input range_low;
+ input range_high;
+
+ integer para_in;
+ integer range_low;
+ integer range_high;
+begin
+ if ( para_in < range_low || para_in > range_high) begin
+ $display("Attribute Syntax Error : The Attribute %s on PLL_ADV instance %m is set to %d. Legal values for this attribute are %d to %d.", para_name, para_in, range_low, range_high);
+ $finish;
+ end
+ para_int_range_chk = 1'b1;
+end
+endfunction
+
+function para_real_range_chk;
+ input para_in;
+ input reg [160:0] para_name;
+ input range_low;
+ input range_high;
+
+ real para_in;
+ real range_low;
+ real range_high;
+begin
+ if ( para_in < range_low || para_in > range_high) begin
+ $display("Attribute Syntax Error : The Attribute %s on PLL_ADV instance %m is set to %f. Legal values for this attribute are %f to %f.", para_name, para_in, range_low, range_high);
+ $finish;
+ end
+
+ para_real_range_chk = 1'b0;
+end
+endfunction
+
+task clkout_pm_cal;
+ output [7:0] clk_ht1;
+ output [7:0] clk_div;
+ output [7:0] clk_div1;
+ input [6:0] clk_ht;
+ input [6:0] clk_lt;
+ input clk_nocnt;
+ input clk_edge;
+
+begin
+ if (clk_nocnt ==1) begin
+ clk_div = 8'b00000001;
+ clk_div1 = 8'b00000001;
+ clk_ht1 = 8'b00000001;
+ end
+ else begin
+ if ( clk_edge == 1)
+ clk_ht1 = 2 * clk_ht -1;
+ else
+ clk_ht1 = 2 * clk_ht;
+ clk_div = clk_ht + clk_lt ;
+ clk_div1 = 2 * clk_div -1;
+ end
+end
+endtask
+
+task clkout_delay_para_drp;
+ output [5:0] clkout_dly;
+ output clk_nocnt;
+ output clk_edge;
+ input [15:0] di_in;
+ input [4:0] daddr_in;
+begin
+
+// if (di_in[15:8] != 8'h00) begin
+// $display(" Error : PLL_ADV on instance %m input DI[15:8] is set to %h and need to be set to 00h at address DADDR=%b at time %t.", di_in[15:8], daddr_in, $time);
+// $finish;
+// end
+ clkout_dly = di_in[5:0];
+ clk_nocnt = di_in[6];
+ clk_edge = di_in[7];
+end
+endtask
+
+task clkout_hl_para_drp;
+ output [6:0] clk_lt;
+ output [6:0] clk_ht;
+ output [2:0] clkpm_sel;
+ input [15:0] di_in_tmp;
+ input [4:0] daddr_in_tmp;
+begin
+ if (di_in_tmp[12] != 1) begin
+ $display(" Error : PLL_ADV on instance %m input DI is %h at address DADDR=%b at time %t. The bit 12 need to be set to 1 .", di_in_tmp, daddr_in_tmp, $time);
+// $finish;
+ end
+ if ( di_in_tmp[5:0] == 6'b0)
+ clk_lt = 7'b1000000;
+ else
+ clk_lt = { 1'b0, di_in[5:0]};
+ if (di_in_tmp[11:6] == 6'b0)
+ clk_ht = 7'b1000000;
+ else
+ clk_ht = { 1'b0, di_in_tmp[11:6]};
+ clkpm_sel = di_in_tmp[15:13];
+end
+endtask
+
+
+
+endmodule
diff --git a/fpga/usrp2/models/PLL_BASE.v b/fpga/usrp2/models/PLL_BASE.v
new file mode 100644
index 000000000..f2180a25a
--- /dev/null
+++ b/fpga/usrp2/models/PLL_BASE.v
@@ -0,0 +1,150 @@
+// $Header: /devl/xcs/repo/env/Databases/CAEInterfaces/verunilibs/data/rainier/PLL_BASE.v,v 1.5 2006/03/13 21:53:44 yanx Exp $
+///////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 1995/2004 Xilinx, Inc.
+// All Right Reserved.
+///////////////////////////////////////////////////////////////////////////////
+// ____ ____
+// / /\/ /
+// /___/ \ / Vendor : Xilinx
+// \ \ \/ Version : 10.1
+// \ \ Description : Xilinx Timing Simulation Library Component
+// / / Phase Lock Loop Clock
+// /___/ /\ Filename : PLL_BASE.v
+// \ \ / \ Timestamp :
+// \___\/\___\
+//
+// Revision:
+// 12/02/05 - Initial version.
+// 02/24/06 - Add real/integer to parameter.
+// End Revision
+
+
+`timescale 1 ps / 1 ps
+
+module PLL_BASE (
+ CLKFBOUT,
+ CLKOUT0,
+ CLKOUT1,
+ CLKOUT2,
+ CLKOUT3,
+ CLKOUT4,
+ CLKOUT5,
+ LOCKED,
+ CLKFBIN,
+ CLKIN,
+ RST
+
+);
+
+parameter BANDWIDTH = "OPTIMIZED";
+parameter integer CLKFBOUT_MULT = 1;
+parameter real CLKFBOUT_PHASE = 0.0;
+parameter real CLKIN_PERIOD = 0.000;
+parameter integer CLKOUT0_DIVIDE = 1;
+parameter real CLKOUT0_DUTY_CYCLE = 0.5;
+parameter real CLKOUT0_PHASE = 0.0;
+parameter integer CLKOUT1_DIVIDE = 1;
+parameter real CLKOUT1_DUTY_CYCLE = 0.5;
+parameter real CLKOUT1_PHASE = 0.0;
+parameter integer CLKOUT2_DIVIDE = 1;
+parameter real CLKOUT2_DUTY_CYCLE = 0.5;
+parameter real CLKOUT2_PHASE = 0.0;
+parameter integer CLKOUT3_DIVIDE = 1;
+parameter real CLKOUT3_DUTY_CYCLE = 0.5;
+parameter real CLKOUT3_PHASE = 0.0;
+parameter integer CLKOUT4_DIVIDE = 1;
+parameter real CLKOUT4_DUTY_CYCLE = 0.5;
+parameter real CLKOUT4_PHASE = 0.0;
+parameter integer CLKOUT5_DIVIDE = 1;
+parameter real CLKOUT5_DUTY_CYCLE = 0.5;
+parameter real CLKOUT5_PHASE = 0.0;
+parameter COMPENSATION = "SYSTEM_SYNCHRONOUS";
+parameter integer DIVCLK_DIVIDE = 1;
+parameter real REF_JITTER = 0.100;
+parameter RESET_ON_LOSS_OF_LOCK = "FALSE";
+
+
+output CLKFBOUT;
+output CLKOUT0;
+output CLKOUT1;
+output CLKOUT2;
+output CLKOUT3;
+output CLKOUT4;
+output CLKOUT5;
+output LOCKED;
+
+input CLKFBIN;
+input CLKIN;
+input RST;
+
+
+wire OPEN_CLKFBDCM;
+wire OPEN_CLKOUTDCM0;
+wire OPEN_CLKOUTDCM1;
+wire OPEN_CLKOUTDCM2;
+wire OPEN_CLKOUTDCM3;
+wire OPEN_CLKOUTDCM4;
+wire OPEN_CLKOUTDCM5;
+wire OPEN_DRDY;
+wire [15:0] OPEN_DO;
+
+PLL_ADV pll_adv_1 (
+ .CLKFBDCM (OPEN_CLKFBDCM),
+ .CLKFBIN (CLKFBIN),
+ .CLKFBOUT (CLKFBOUT),
+ .CLKIN1 (CLKIN),
+ .CLKIN2 (1'b0),
+ .CLKOUT0 (CLKOUT0),
+ .CLKOUT1 (CLKOUT1),
+ .CLKOUT2 (CLKOUT2),
+ .CLKOUT3 (CLKOUT3),
+ .CLKOUT4 (CLKOUT4),
+ .CLKOUT5 (CLKOUT5),
+ .CLKOUTDCM0 (OPEN_CLKOUTDCM0),
+ .CLKOUTDCM1 (OPEN_CLKOUTDCM1),
+ .CLKOUTDCM2 (OPEN_CLKOUTDCM2),
+ .CLKOUTDCM3 (OPEN_CLKOUTDCM3),
+ .CLKOUTDCM4 (OPEN_CLKOUTDCM4),
+ .CLKOUTDCM5 (OPEN_CLKOUTDCM5),
+ .DADDR (5'b0),
+ .DCLK (1'b0),
+ .DEN (1'b0),
+ .DI (16'b0),
+ .DO (OPEN_DO),
+ .DRDY (OPEN_DRDY),
+ .DWE (1'b0),
+ .LOCKED (LOCKED),
+ .CLKINSEL(1'b1),
+ .REL (1'b0),
+ .RST (RST)
+);
+
+defparam pll_adv_1.BANDWIDTH = BANDWIDTH;
+defparam pll_adv_1.CLKFBOUT_MULT = CLKFBOUT_MULT;
+defparam pll_adv_1.CLKFBOUT_PHASE = CLKFBOUT_PHASE;
+defparam pll_adv_1.CLKIN1_PERIOD = CLKIN_PERIOD;
+defparam pll_adv_1.CLKIN2_PERIOD = 10.0;
+defparam pll_adv_1.CLKOUT0_DIVIDE = CLKOUT0_DIVIDE;
+defparam pll_adv_1.CLKOUT0_DUTY_CYCLE = CLKOUT0_DUTY_CYCLE;
+defparam pll_adv_1.CLKOUT0_PHASE = CLKOUT0_PHASE;
+defparam pll_adv_1.CLKOUT1_DIVIDE = CLKOUT1_DIVIDE;
+defparam pll_adv_1.CLKOUT1_DUTY_CYCLE = CLKOUT1_DUTY_CYCLE;
+defparam pll_adv_1.CLKOUT1_PHASE = CLKOUT1_PHASE;
+defparam pll_adv_1.CLKOUT2_DIVIDE = CLKOUT2_DIVIDE;
+defparam pll_adv_1.CLKOUT2_DUTY_CYCLE = CLKOUT2_DUTY_CYCLE;
+defparam pll_adv_1.CLKOUT2_PHASE = CLKOUT2_PHASE;
+defparam pll_adv_1.CLKOUT3_DIVIDE = CLKOUT3_DIVIDE;
+defparam pll_adv_1.CLKOUT3_DUTY_CYCLE = CLKOUT3_DUTY_CYCLE;
+defparam pll_adv_1.CLKOUT3_PHASE = CLKOUT3_PHASE;
+defparam pll_adv_1.CLKOUT4_DIVIDE = CLKOUT4_DIVIDE;
+defparam pll_adv_1.CLKOUT4_DUTY_CYCLE = CLKOUT4_DUTY_CYCLE;
+defparam pll_adv_1.CLKOUT4_PHASE = CLKOUT4_PHASE;
+defparam pll_adv_1.CLKOUT5_DIVIDE = CLKOUT5_DIVIDE;
+defparam pll_adv_1.CLKOUT5_DUTY_CYCLE = CLKOUT5_DUTY_CYCLE;
+defparam pll_adv_1.CLKOUT5_PHASE = CLKOUT5_PHASE;
+defparam pll_adv_1.COMPENSATION = COMPENSATION;
+defparam pll_adv_1.DIVCLK_DIVIDE = DIVCLK_DIVIDE;
+defparam pll_adv_1.REF_JITTER = REF_JITTER;
+defparam pll_adv_1.RESET_ON_LOSS_OF_LOCK = RESET_ON_LOSS_OF_LOCK;
+
+endmodule
diff --git a/fpga/usrp2/top/B100/B100.v b/fpga/usrp2/top/B100/B100.v
index dcda974b4..59bed6066 100644
--- a/fpga/usrp2/top/B100/B100.v
+++ b/fpga/usrp2/top/B100/B100.v
@@ -1,5 +1,5 @@
//
-// Copyright 2011 Ettus Research LLC
+// Copyright 2011-2012 Ettus Research LLC
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -50,6 +50,8 @@ module B100
// /////////////////////////////////////////////////////////////////////////
// Clocking
wire clk_fpga, clk_fpga_in, reset;
+ wire gpif_clk = IFCLK;
+ wire gpif_rst;
IBUFGDS #(.IOSTANDARD("LVDS_33"), .DIFF_TERM("TRUE"))
clk_fpga_pin (.O(clk_fpga_in),.I(CLK_FPGA_P),.IB(CLK_FPGA_N));
@@ -57,6 +59,7 @@ module B100
BUFG clk_fpga_BUFG (.I(clk_fpga_in), .O(clk_fpga));
reset_sync reset_sync(.clk(clk_fpga), .reset_in((~reset_n) | (~ext_reset)), .reset_out(reset));
+ reset_sync reset_sync_gpif(.clk(gpif_clk), .reset_in((~reset_n) | (~ext_reset)), .reset_out(gpif_rst));
// /////////////////////////////////////////////////////////////////////////
// SPI
@@ -105,6 +108,7 @@ module B100
// /////////////////////////////////////////////////////////////////////////
// RX ADC -- handles deinterleaving
+ wire rxsync_0, rxsync_1;
reg [11:0] rx_i, rx_q;
wire [11:0] rx_a, rx_b;
@@ -151,24 +155,64 @@ module B100
rx_i <= rx_a;
rx_q <= rx_b;
end
-
+
// /////////////////////////////////////////////////////////////////////////
- // Main U1E Core
- u1plus_core u1p_c(.clk_fpga(clk_fpga), .rst_fpga(reset),
- .debug_led(debug_led), .debug(debug), .debug_clk(debug_clk),
- .debug_txd(), .debug_rxd(1'b1),
-
- .gpif_d(GPIF_D), .gpif_ctl(GPIF_CTL), .gpif_pktend(GPIF_PKTEND),
- .gpif_sloe(GPIF_SLOE), .gpif_slwr(GPIF_SLWR), .gpif_slrd(GPIF_SLRD),
- .gpif_fifoadr(GPIF_ADR), .gpif_clk(IFCLK),
-
- .db_sda(SDA_FPGA), .db_scl(SCL_FPGA),
- .sclk(sclk), .sen({SEN_CODEC,SEN_TX_DB,SEN_RX_DB}), .mosi(mosi), .miso(miso),
- .cgen_st_status(cgen_st_status), .cgen_st_ld(cgen_st_ld),.cgen_st_refmon(cgen_st_refmon),
- .cgen_sync_b(cgen_sync_b), .cgen_ref_sel(cgen_ref_sel),
- .io_tx(io_tx), .io_rx(io_rx),
- .tx_i(tx_i), .tx_q(tx_q),
- .rx_i(rx_i), .rx_q(rx_q),
- .pps_in(PPS_IN) );
+ // Main Core
+ wire [35:0] rx_data, tx_data, ctrl_data, resp_data;
+ wire rx_src_rdy, rx_dst_rdy, tx_src_rdy, tx_dst_rdy, resp_src_rdy, resp_dst_rdy, ctrl_src_rdy, ctrl_dst_rdy;
+ wire dsp_rx_run, dsp_tx_run;
+ wire [7:0] sen8;
+ assign {SEN_CODEC,SEN_TX_DB,SEN_RX_DB} = sen8[2:0];
+ wire [31:0] core_debug;
+
+ assign debug_led = {dsp_tx_run, dsp_rx_run, cgen_st_ld};
+ wire cgen_sync;
+ assign { cgen_sync_b, cgen_ref_sel } = {~cgen_sync, 1'b1};
+
+ u1plus_core #(
+`ifdef NUM_RX_DSP
+ .NUM_RX_DSPS(`NUM_RX_DSP),
+`else
+ .NUM_RX_DSPS(1),
+`endif
+ .DSP_RX_XTRA_FIFOSIZE(11),
+ .DSP_TX_XTRA_FIFOSIZE(12),
+ .USE_PACKET_PADDER(1)
+ ) core(
+ .clk(clk_fpga), .reset(reset),
+ .debug(core_debug), .debug_clk(debug_clk),
+
+ .rx_data(rx_data), .rx_src_rdy(rx_src_rdy), .rx_dst_rdy(rx_dst_rdy),
+ .tx_data(tx_data), .tx_src_rdy(tx_src_rdy), .tx_dst_rdy(tx_dst_rdy),
+ .ctrl_data(ctrl_data), .ctrl_src_rdy(ctrl_src_rdy), .ctrl_dst_rdy(ctrl_dst_rdy),
+ .resp_data(resp_data), .resp_src_rdy(resp_src_rdy), .resp_dst_rdy(resp_dst_rdy),
+
+ .dsp_rx_run(dsp_rx_run), .dsp_tx_run(dsp_tx_run),
+ .clock_sync(cgen_sync),
+
+ .db_sda(SDA_FPGA), .db_scl(SCL_FPGA),
+ .sclk(sclk), .sen(sen8), .mosi(mosi), .miso(miso),
+ .io_tx(io_tx), .io_rx(io_rx),
+ .tx_i(tx_i), .tx_q(tx_q),
+ .rx_i(rx_i), .rx_q(rx_q),
+ .pps_in(PPS_IN) );
+
+ // /////////////////////////////////////////////////////////////////////////
+ // Interface from host to/from GPIF
+ wire [31:0] gpif_debug;
+ slave_fifo slave_fifo (.gpif_clk(gpif_clk), .gpif_rst(gpif_rst), .gpif_d(GPIF_D),
+ .gpif_ctl(GPIF_CTL), .sloe(GPIF_SLOE), .slwr(GPIF_SLWR), .slrd(GPIF_SLRD),
+ .pktend(GPIF_PKTEND), .fifoadr(GPIF_ADR),
+
+ .fifo_clk(clk_fpga), .fifo_rst(reset),
+ .rx_data(rx_data), .rx_src_rdy(rx_src_rdy), .rx_dst_rdy(rx_dst_rdy),
+ .tx_data(tx_data), .tx_src_rdy(tx_src_rdy), .tx_dst_rdy(tx_dst_rdy),
+ .ctrl_data(ctrl_data), .ctrl_src_rdy(ctrl_src_rdy), .ctrl_dst_rdy(ctrl_dst_rdy),
+ .resp_data(resp_data), .resp_src_rdy(resp_src_rdy), .resp_dst_rdy(resp_dst_rdy),
+
+ .debug(gpif_debug));
+
+ //assign debug = gpif_debug;
+ assign debug = core_debug;
endmodule // B100
diff --git a/fpga/usrp2/top/B100/Makefile b/fpga/usrp2/top/B100/Makefile
index 3ddef1024..fdd507394 100644
--- a/fpga/usrp2/top/B100/Makefile
+++ b/fpga/usrp2/top/B100/Makefile
@@ -2,7 +2,7 @@
# Copyright 2011 Ettus Research LLC
#
-all: B100
+all: B100 B100_2RX
find -name "*.twr" | xargs grep constraint | grep met
clean:
@@ -11,4 +11,7 @@ clean:
B100:
make -f Makefile.$@ bin
+B100_2RX:
+ make -f Makefile.$@ bin
+
.PHONY: all clean
diff --git a/fpga/usrp2/top/B100/Makefile.B100_2RX b/fpga/usrp2/top/B100/Makefile.B100_2RX
new file mode 100644
index 000000000..ba535dfb0
--- /dev/null
+++ b/fpga/usrp2/top/B100/Makefile.B100_2RX
@@ -0,0 +1,106 @@
+#
+# Copyright 2008-2012 Ettus Research LLC
+#
+
+##################################################
+# Project Setup
+##################################################
+TOP_MODULE := B100
+BUILD_DIR := build-B100_2RX/
+
+# set me in a custom makefile
+CUSTOM_SRCS =
+CUSTOM_DEFS =
+
+##################################################
+# Include other makefiles
+##################################################
+
+include ../Makefile.common
+include ../../fifo/Makefile.srcs
+include ../../control_lib/Makefile.srcs
+include ../../sdr_lib/Makefile.srcs
+include ../../serdes/Makefile.srcs
+include ../../simple_gemac/Makefile.srcs
+include ../../timing/Makefile.srcs
+include ../../opencores/Makefile.srcs
+include ../../vrt/Makefile.srcs
+include ../../udp/Makefile.srcs
+include ../../coregen/Makefile.srcs
+include ../../gpif/Makefile.srcs
+
+##################################################
+# Project Properties
+##################################################
+export PROJECT_PROPERTIES := \
+family "Spartan3A" \
+device XC3S1400A \
+package ft256 \
+speed -4 \
+top_level_module_type "HDL" \
+synthesis_tool "XST (VHDL/Verilog)" \
+simulator "ISE Simulator (VHDL/Verilog)" \
+"Preferred Language" "Verilog" \
+"Enable Message Filtering" FALSE \
+"Display Incremental Messages" FALSE
+
+##################################################
+# Sources
+##################################################
+TOP_SRCS = \
+B100.v \
+u1plus_core.v \
+B100.ucf \
+timing.ucf
+
+SOURCES = $(abspath $(TOP_SRCS)) $(FIFO_SRCS) \
+$(CONTROL_LIB_SRCS) $(SDR_LIB_SRCS) $(SERDES_SRCS) \
+$(SIMPLE_GEMAC_SRCS) $(TIMING_SRCS) $(OPENCORES_SRCS) \
+$(VRT_SRCS) $(UDP_SRCS) $(COREGEN_SRCS) $(EXTRAM_SRCS) \
+$(GPIF_SRCS)
+
+##################################################
+# Process Properties
+##################################################
+SYNTHESIZE_PROPERTIES = \
+"Number of Clock Buffers" 8 \
+"Pack I/O Registers into IOBs" Yes \
+"Optimization Effort" High \
+"Optimize Instantiated Primitives" TRUE \
+"Register Balancing" Yes \
+"Use Clock Enable" Auto \
+"Use Synchronous Reset" Auto \
+"Use Synchronous Set" Auto \
+"Verilog Macros" "NUM_RX_DSP=2 DISABLE_TX_DSP=1 $(CUSTOM_DEFS)"
+
+TRANSLATE_PROPERTIES = \
+"Macro Search Path" "$(shell pwd)/../../coregen/"
+
+MAP_PROPERTIES = \
+"Generate Detailed MAP Report" TRUE \
+"Allow Logic Optimization Across Hierarchy" TRUE \
+"Map to Input Functions" 4 \
+"Optimization Strategy (Cover Mode)" Speed \
+"Pack I/O Registers/Latches into IOBs" "For Inputs and Outputs" \
+"Perform Timing-Driven Packing and Placement" TRUE \
+"Map Effort Level" High \
+"Extra Effort" Normal \
+"Combinatorial Logic Optimization" TRUE \
+"Register Duplication" TRUE
+
+PLACE_ROUTE_PROPERTIES = \
+"Place & Route Effort Level (Overall)" High
+
+STATIC_TIMING_PROPERTIES = \
+"Number of Paths in Error/Verbose Report" 10 \
+"Report Type" "Error Report"
+
+GEN_PROG_FILE_PROPERTIES = \
+"Configuration Rate" 6 \
+"Create Binary Configuration File" TRUE \
+"Done (Output Events)" 5 \
+"Enable Bitstream Compression" TRUE \
+"Enable Outputs (Output Events)" 6 \
+"Unused IOB Pins" "Pull Up"
+
+SIM_MODEL_PROPERTIES = ""
diff --git a/fpga/usrp2/top/B100/core_compile b/fpga/usrp2/top/B100/core_compile
index b62cbaee0..2192bfa94 100755
--- a/fpga/usrp2/top/B100/core_compile
+++ b/fpga/usrp2/top/B100/core_compile
@@ -1 +1 @@
-iverilog -Wall -y. -y ../../control_lib/ -y ../../custom/ -y ../../fifo/ -y ../../gpif/ -y ../../models/ -y ../../sdr_lib/ -y ../../coregen/ -y ../../vrt/ -y ../../opencores/i2c/rtl/verilog/ -y ../../opencores/spi/rtl/verilog/ -y ../../timing/ -y ../../opencores/8b10b/ -I ../../opencores/spi/rtl/verilog/ -I ../../opencores/i2c/rtl/verilog/ -y ../../simple_gemac u1plus_core.v 2>&1 | grep -v timescale | grep -v coregen | grep -v models
+iverilog -Wall -y. -y ../../control_lib/ -y ../../custom/ -y ../../fifo/ -y ../../gpif/ -y ../../models/ -y ../../sdr_lib/ -y ../../coregen/ -y ../../vrt/ -y ../../opencores/i2c/rtl/verilog/ -y ../../opencores/spi/rtl/verilog/ -y ../../timing/ -y ../../opencores/8b10b/ -I ../../opencores/spi/rtl/verilog/ -I ../../opencores/i2c/rtl/verilog/ -y ../../simple_gemac B100.v 2>&1 | grep -v timescale | grep -v coregen | grep -v models
diff --git a/fpga/usrp2/top/B100/timing.ucf b/fpga/usrp2/top/B100/timing.ucf
index 96c47cf2c..c4404e1d0 100644
--- a/fpga/usrp2/top/B100/timing.ucf
+++ b/fpga/usrp2/top/B100/timing.ucf
@@ -5,10 +5,15 @@ NET "IFCLK" TNM_NET = "IFCLK";
TIMESPEC "TS_IFCLK" = PERIOD "IFCLK" 20833 ps HIGH 50 %;
#constrain FX2 IO
-NET "GPIF_D<*>" MAXDELAY = 5.5 ns;
-NET "GPIF_CTL<*>" MAXDELAY = 5.5 ns;
-NET "GPIF_ADR<*>" MAXDELAY = 5.5ns;
-NET "GPIF_SLWR" MAXDELAY = 5.5 ns;
-NET "GPIF_SLRD" MAXDELAY = 5.5 ns;
-NET "GPIF_SLOE" MAXDELAY = 5.5 ns;
-NET "GPIF_PKTEND" MAXDELAY = 5.5 ns;
+INST "GPIF_D<*>" TNM = gpif_net_in;
+INST "GPIF_CTL<*>" TNM = gpif_net_in;
+
+INST "GPIF_D<*>" TNM = gpif_net_out;
+INST "GPIF_ADR<*>" TNM = gpif_net_out;
+INST "GPIF_SLWR" TNM = gpif_net_out;
+INST "GPIF_SLOE" TNM = gpif_net_out;
+INST "GPIF_SLRD" TNM = gpif_net_out;
+INST "GPIF_PKTEND" TNM = gpif_net_out;
+
+TIMEGRP "gpif_net_in" OFFSET = IN 7 ns VALID 14 ns BEFORE "IFCLK" RISING;
+TIMEGRP "gpif_net_out" OFFSET = OUT 7 ns AFTER "IFCLK" RISING;
diff --git a/fpga/usrp2/top/B100/u1plus.ucf b/fpga/usrp2/top/B100/u1plus.ucf
deleted file mode 100644
index 3ecc4daf2..000000000
--- a/fpga/usrp2/top/B100/u1plus.ucf
+++ /dev/null
@@ -1,203 +0,0 @@
-## Main Clock
-NET "CLK_FPGA_P" LOC = "R7" ;
-NET "CLK_FPGA_N" LOC = "T7" ;
-
-## UART
-NET "FPGA_TXD" LOC = "H16" ;
-NET "FPGA_RXD" LOC = "H12" ;
-
-## I2C
-NET "SDA_FPGA" LOC = "T13" ;
-NET "SCL_FPGA" LOC = "R13" ;
-
-## CGEN
-NET "cgen_st_ld" LOC = "M13" ;
-NET "cgen_st_refmon" LOC = "J14" ;
-NET "cgen_st_status" LOC = "P6" ;
-NET "cgen_ref_sel" LOC = "T2" ;
-NET "cgen_sync_b" LOC = "H15" ;
-
-## FPGA Config
-#NET "fpga_cfg_din" LOC = "T14" ;
-#NET "fpga_cfg_cclk" LOC = "R14" ;
-#NET "fpga_cfg_init_b" LOC = "T12" ;
-
-## MISC
-#NET "mystery_bus<2>" LOC = "T11" ;
-#NET "mystery_bus<1>" LOC = "C4" ;
-#NET "mystery_bus<0>" LOC = "E7" ;
-NET "reset_n" LOC = "D5" ;
-NET "PPS_IN" LOC = "M14" ;
-NET "reset_codec" LOC = "B14" ;
-
-## GPIF
-NET "GPIF_D<15>" LOC = "P7" ;
-NET "GPIF_D<14>" LOC = "N8" ;
-NET "GPIF_D<13>" LOC = "T5" ;
-NET "GPIF_D<12>" LOC = "T6" ;
-NET "GPIF_D<11>" LOC = "N6" ;
-NET "GPIF_D<10>" LOC = "P5" ;
-NET "GPIF_D<9>" LOC = "R3" ;
-NET "GPIF_D<8>" LOC = "T3" ;
-NET "GPIF_D<7>" LOC = "N12" ;
-NET "GPIF_D<6>" LOC = "P13" ;
-NET "GPIF_D<5>" LOC = "P11" ;
-NET "GPIF_D<4>" LOC = "R9" ;
-NET "GPIF_D<3>" LOC = "T9" ;
-NET "GPIF_D<2>" LOC = "N9" ;
-NET "GPIF_D<1>" LOC = "P9" ;
-NET "GPIF_D<0>" LOC = "P8" ;
-
-NET "GPIF_CTL<3>" LOC = "N5" ;
-NET "GPIF_CTL<2>" LOC = "M11" ;
-NET "GPIF_CTL<1>" LOC = "M9" ;
-NET "GPIF_CTL<0>" LOC = "M7" ;
-
-NET "GPIF_RDY<3>" LOC = "N11" ;
-NET "GPIF_RDY<2>" LOC = "T10" ;
-NET "GPIF_RDY<1>" LOC = "T4" ;
-NET "GPIF_RDY<0>" LOC = "R5" ;
-
-NET "FX2_PA7_FLAGD" LOC = "P12" ;
-NET "FX2_PA6_PKTEND" LOC = "R11" ;
-NET "FX2_PA2_SLOE" LOC = "P10" ;
-
-NET "IFCLK" LOC = "T8" ;
-
-## LEDs
-NET "debug_led<2>" LOC = "R2" ;
-NET "debug_led<1>" LOC = "N4" ;
-NET "debug_led<0>" LOC = "P4" ;
-
-## Debug bus
-NET "debug_clk<0>" LOC = "K15" ;
-NET "debug_clk<1>" LOC = "K14" ;
-NET "debug<0>" LOC = "K16" ;
-NET "debug<1>" LOC = "J16" ;
-NET "debug<2>" LOC = "C16" ;
-NET "debug<3>" LOC = "C15" ;
-NET "debug<4>" LOC = "E13" ;
-NET "debug<5>" LOC = "D14" ;
-NET "debug<6>" LOC = "D16" ;
-NET "debug<7>" LOC = "D15" ;
-NET "debug<8>" LOC = "E14" ;
-NET "debug<9>" LOC = "F13" ;
-NET "debug<10>" LOC = "G13" ;
-NET "debug<11>" LOC = "F14" ;
-NET "debug<12>" LOC = "E16" ;
-NET "debug<13>" LOC = "F15" ;
-NET "debug<14>" LOC = "H13" ;
-NET "debug<15>" LOC = "G14" ;
-NET "debug<16>" LOC = "G16" ;
-NET "debug<17>" LOC = "F16" ;
-NET "debug<18>" LOC = "J12" ;
-NET "debug<19>" LOC = "J13" ;
-NET "debug<20>" LOC = "L14" ;
-NET "debug<21>" LOC = "L16" ;
-NET "debug<22>" LOC = "M15" ;
-NET "debug<23>" LOC = "M16" ;
-NET "debug<24>" LOC = "L13" ;
-NET "debug<25>" LOC = "K13" ;
-NET "debug<26>" LOC = "P16" ;
-NET "debug<27>" LOC = "N16" ;
-NET "debug<28>" LOC = "R15" ;
-NET "debug<29>" LOC = "P15" ;
-NET "debug<30>" LOC = "N13" ;
-NET "debug<31>" LOC = "N14" ;
-
-## ADC
-NET "adc<11>" LOC = "B15" ;
-NET "adc<10>" LOC = "A8" ;
-NET "adc<9>" LOC = "B8" ;
-NET "adc<8>" LOC = "C8" ;
-NET "adc<7>" LOC = "D8" ;
-NET "adc<6>" LOC = "C9" ;
-NET "adc<5>" LOC = "A9" ;
-NET "adc<4>" LOC = "C10" ;
-NET "adc<3>" LOC = "D9" ;
-NET "adc<2>" LOC = "A3" ;
-NET "adc<1>" LOC = "B3" ;
-NET "adc<0>" LOC = "A4" ;
-NET "RXSYNC" LOC = "D10" ;
-
-## DAC
-NET "TXBLANK" LOC = "K1" ;
-NET "TXSYNC" LOC = "J2" ;
-NET "dac<0>" LOC = "J1" ;
-NET "dac<1>" LOC = "H3" ;
-NET "dac<2>" LOC = "J3" ;
-NET "dac<3>" LOC = "G2" ;
-NET "dac<4>" LOC = "H1" ;
-NET "dac<5>" LOC = "N3" ;
-NET "dac<6>" LOC = "M4" ;
-NET "dac<7>" LOC = "R1" ;
-NET "dac<8>" LOC = "P2" ;
-NET "dac<9>" LOC = "P1" ;
-NET "dac<10>" LOC = "M1" ;
-NET "dac<11>" LOC = "N1" ;
-NET "dac<12>" LOC = "M3" ;
-NET "dac<13>" LOC = "L4" ;
-
-## TX DB
-NET "io_tx<0>" LOC = "K4" ;
-NET "io_tx<1>" LOC = "L3" ;
-NET "io_tx<2>" LOC = "L2" ;
-NET "io_tx<3>" LOC = "F1" ;
-NET "io_tx<4>" LOC = "F3" ;
-NET "io_tx<5>" LOC = "G3" ;
-NET "io_tx<6>" LOC = "E3" ;
-NET "io_tx<7>" LOC = "E2" ;
-NET "io_tx<8>" LOC = "E4" ;
-NET "io_tx<9>" LOC = "F4" ;
-NET "io_tx<10>" LOC = "D1" ;
-NET "io_tx<11>" LOC = "E1" ;
-NET "io_tx<12>" LOC = "D4" ;
-NET "io_tx<13>" LOC = "D3" ;
-NET "io_tx<14>" LOC = "C2" ;
-NET "io_tx<15>" LOC = "C1" ;
-
-## RX DB
-NET "io_rx<0>" LOC = "D7" ;
-NET "io_rx<1>" LOC = "C6" ;
-NET "io_rx<2>" LOC = "A6" ;
-NET "io_rx<3>" LOC = "B6" ;
-NET "io_rx<4>" LOC = "E9" ;
-NET "io_rx<5>" LOC = "A7" ;
-NET "io_rx<6>" LOC = "C7" ;
-NET "io_rx<7>" LOC = "B10" ;
-NET "io_rx<8>" LOC = "A10" ;
-NET "io_rx<9>" LOC = "C11" ;
-NET "io_rx<10>" LOC = "A11" ;
-NET "io_rx<11>" LOC = "D11" ;
-NET "io_rx<12>" LOC = "B12" ;
-NET "io_rx<13>" LOC = "A12" ;
-NET "io_rx<14>" LOC = "A14" ;
-NET "io_rx<15>" LOC = "A13" ;
-
-## SPI
-#NET "SEN_AUX" LOC = "C12" ;
-#NET "SCLK_AUX" LOC = "D12" ;
-#NET "MISO_AUX" LOC = "J5" ;
-NET "SCLK_CODEC" LOC = "K3" ;
-NET "SEN_CODEC" LOC = "D13" ;
-NET "MOSI_CODEC" LOC = "C13" ;
-NET "MISO_CODEC" LOC = "G4" ;
-
-NET "MISO_RX_DB" LOC = "E6" ;
-NET "SEN_RX_DB" LOC = "B4" ;
-NET "MOSI_RX_DB" LOC = "A5" ;
-NET "SCLK_RX_DB" LOC = "C5" ;
-
-NET "MISO_TX_DB" LOC = "J4" ;
-NET "SEN_TX_DB" LOC = "N2" ;
-NET "MOSI_TX_DB" LOC = "L1" ;
-NET "SCLK_TX_DB" LOC = "G1" ;
-
-## Dedicated pins
-#NET "TMS" LOC = "B2" ;
-#NET "TDO" LOC = "B16" ;
-#NET "TDI" LOC = "B1" ;
-#NET "TCK" LOC = "A15" ;
-
-#NET "fpga_cfg_prog_b" LOC = "A2" ;
-#NET "fpga_cfg_done" LOC = "T15" ;
diff --git a/fpga/usrp2/top/B100/u1plus.v b/fpga/usrp2/top/B100/u1plus.v
deleted file mode 100644
index 5e3200580..000000000
--- a/fpga/usrp2/top/B100/u1plus.v
+++ /dev/null
@@ -1,173 +0,0 @@
-//
-// Copyright 2011 Ettus Research LLC
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see <http://www.gnu.org/licenses/>.
-//
-
-`timescale 1ns / 1ps
-//////////////////////////////////////////////////////////////////////////////////
-
-module u1plus
- (input CLK_FPGA_P, input CLK_FPGA_N, // Diff
- output [2:0] debug_led, output [31:0] debug, output [1:0] debug_clk,
- output FPGA_TXD, input FPGA_RXD,
-
- // GPIF
- inout [15:0] GPIF_D, input [3:0] GPIF_CTL, output [3:0] GPIF_RDY,
- output FX2_PA7_FLAGD, output FX2_PA6_PKTEND, output FX2_PA2_SLOE,
- input IFCLK,
-
- inout SDA_FPGA, inout SCL_FPGA, // I2C
-
- output SCLK_TX_DB, output SEN_TX_DB, output MOSI_TX_DB, input MISO_TX_DB, // DB TX SPI
- output SCLK_RX_DB, output SEN_RX_DB, output MOSI_RX_DB, input MISO_RX_DB, // DB TX SPI
- output SCLK_CODEC, output SEN_CODEC, output MOSI_CODEC, input MISO_CODEC, // AD9862 main SPI
-
- input cgen_st_status, input cgen_st_ld, input cgen_st_refmon, output cgen_sync_b, output cgen_ref_sel,
-
- inout [15:0] io_tx, inout [15:0] io_rx,
-
- output [13:0] dac, output TXSYNC, output TXBLANK,
- input [11:0] adc, input RXSYNC,
-
- input PPS_IN,
- input reset_n, output reset_codec
- );
-
- assign reset_codec = 1; // Believed to be active low
-
- // /////////////////////////////////////////////////////////////////////////
- // Clocking
- wire clk_fpga, clk_fpga_in, reset;
-
- IBUFGDS #(.IOSTANDARD("LVDS_33"), .DIFF_TERM("TRUE"))
- clk_fpga_pin (.O(clk_fpga_in),.I(CLK_FPGA_P),.IB(CLK_FPGA_N));
-
- BUFG clk_fpga_BUFG (.I(clk_fpga_in), .O(clk_fpga));
-
- reset_sync reset_sync(.clk(clk_fpga), .reset_in(~reset_n), .reset_out(reset));
-
- // /////////////////////////////////////////////////////////////////////////
- // SPI
- wire mosi, sclk, miso;
- assign { SCLK_TX_DB, MOSI_TX_DB } = ~SEN_TX_DB ? {sclk,mosi} : 2'b0;
- assign { SCLK_RX_DB, MOSI_RX_DB } = ~SEN_RX_DB ? {sclk,mosi} : 2'b0;
- assign { SCLK_CODEC, MOSI_CODEC } = ~SEN_CODEC ? {sclk,mosi} : 2'b0;
- assign miso = (~SEN_TX_DB & MISO_TX_DB) | (~SEN_RX_DB & MISO_RX_DB) |
- (~SEN_CODEC & MISO_CODEC);
-
- // /////////////////////////////////////////////////////////////////////////
- // TX DAC -- handle the interleaved data bus to DAC, with clock doubling DLL
-
- assign TXBLANK = 0;
- wire [13:0] tx_i, tx_q;
-
- genvar i;
- generate
- for(i=0;i<14;i=i+1)
- begin : gen_dacout
- ODDR2 #(.DDR_ALIGNMENT("NONE"), // Sets output alignment to "NONE", "C0" or "C1"
- .INIT(1'b0), // Sets initial state of the Q output to 1'b0 or 1'b1
- .SRTYPE("SYNC")) // Specifies "SYNC" or "ASYNC" set/reset
- ODDR2_inst (.Q(dac[i]), // 1-bit DDR output data
- .C0(clk_fpga), // 1-bit clock input
- .C1(~clk_fpga), // 1-bit clock input
- .CE(1'b1), // 1-bit clock enable input
- .D0(tx_i[i]), // 1-bit data input (associated with C0)
- .D1(tx_q[i]), // 1-bit data input (associated with C1)
- .R(1'b0), // 1-bit reset input
- .S(1'b0)); // 1-bit set input
- end // block: gen_dacout
- endgenerate
- ODDR2 #(.DDR_ALIGNMENT("NONE"), // Sets output alignment to "NONE", "C0" or "C1"
- .INIT(1'b0), // Sets initial state of the Q output to 1'b0 or 1'b1
- .SRTYPE("SYNC")) // Specifies "SYNC" or "ASYNC" set/reset
- ODDR2_txsnc (.Q(TXSYNC), // 1-bit DDR output data
- .C0(clk_fpga), // 1-bit clock input
- .C1(~clk_fpga), // 1-bit clock input
- .CE(1'b1), // 1-bit clock enable input
- .D0(1'b0), // 1-bit data input (associated with C0)
- .D1(1'b1), // 1-bit data input (associated with C1)
- .R(1'b0), // 1-bit reset input
- .S(1'b0)); // 1-bit set input
-
- // /////////////////////////////////////////////////////////////////////////
- // RX ADC -- handles deinterleaving
-
- reg [11:0] rx_i, rx_q;
- wire [11:0] rx_a, rx_b;
-
- genvar j;
- generate
- for(j=0;j<12;j=j+1)
- begin : gen_adcin
- IDDR2 #(.DDR_ALIGNMENT("NONE"), // Sets output alignment to "NONE", "C0" or "C1"
- .INIT_Q0(1'b0), // Sets initial state of the Q0 output to 1’b0 or 1’b1
- .INIT_Q1(1'b0), // Sets initial state of the Q1 output to 1’b0 or 1’b1
- .SRTYPE("SYNC")) // Specifies "SYNC" or "ASYNC" set/reset
- IDDR2_inst (.Q0(rx_a[j]), // 1-bit output captured with C0 clock
- .Q1(rx_b[j]), // 1-bit output captured with C1 clock
- .C0(clk_fpga), // 1-bit clock input
- .C1(~clk_fpga), // 1-bit clock input
- .CE(1'b1), // 1-bit clock enable input
- .D(adc[j]), // 1-bit DDR data input
- .R(1'b0), // 1-bit reset input
- .S(1'b0)); // 1-bit set input
- end // block: gen_adcin
- endgenerate
-
- IDDR2 #(.DDR_ALIGNMENT("NONE"), // Sets output alignment to "NONE", "C0" or "C1"
- .INIT_Q0(1'b0), // Sets initial state of the Q0 output to 1’b0 or 1’b1
- .INIT_Q1(1'b0), // Sets initial state of the Q1 output to 1’b0 or 1’b1
- .SRTYPE("SYNC")) // Specifies "SYNC" or "ASYNC" set/reset
- IDDR2_sync (.Q0(rxsync_0), // 1-bit output captured with C0 clock
- .Q1(rxsync_1), // 1-bit output captured with C1 clock
- .C0(clk_fpga), // 1-bit clock input
- .C1(~clk_fpga), // 1-bit clock input
- .CE(1'b1), // 1-bit clock enable input
- .D(RXSYNC), // 1-bit DDR data input
- .R(1'b0), // 1-bit reset input
- .S(1'b0)); // 1-bit set input
-
- always @(posedge clk_fpga)
- if(rxsync_0)
- begin
- rx_i <= rx_b;
- rx_q <= rx_a;
- end
- else
- begin
- rx_i <= rx_a;
- rx_q <= rx_b;
- end
-
- // /////////////////////////////////////////////////////////////////////////
- // Main U1E Core
- u1plus_core u1p_c(.clk_fpga(clk_fpga), .rst_fpga(reset),
- .debug_led(debug_led), .debug(debug), .debug_clk(debug_clk),
- .debug_txd(FPGA_TXD), .debug_rxd(FPGA_RXD),
- .gpif_d(GPIF_D), .gpif_ctl(GPIF_CTL), .gpif_rdy(GPIF_RDY),
- .gpif_misc({FX2_PA7_FLAGD,FX2_PA6_PKTEND,FX2_PA2_SLOE}),
- .gpif_clk(IFCLK),
-
- .db_sda(SDA_FPGA), .db_scl(SCL_FPGA),
- .sclk(sclk), .sen({SEN_CODEC,SEN_TX_DB,SEN_RX_DB}), .mosi(mosi), .miso(miso),
- .cgen_st_status(cgen_st_status), .cgen_st_ld(cgen_st_ld),.cgen_st_refmon(cgen_st_refmon),
- .cgen_sync_b(cgen_sync_b), .cgen_ref_sel(cgen_ref_sel),
- .io_tx(io_tx), .io_rx(io_rx),
- .tx_i(tx_i), .tx_q(tx_q),
- .rx_i(rx_i), .rx_q(rx_q),
- .pps_in(PPS_IN) );
-
-endmodule // u1plus
diff --git a/fpga/usrp2/top/B100/u1plus_core.v b/fpga/usrp2/top/B100/u1plus_core.v
index c1d6767d1..ef0ce51f7 100644
--- a/fpga/usrp2/top/B100/u1plus_core.v
+++ b/fpga/usrp2/top/B100/u1plus_core.v
@@ -18,435 +18,345 @@
module u1plus_core
- (input clk_fpga, input rst_fpga,
- output [2:0] debug_led, output [31:0] debug, output [1:0] debug_clk,
- output debug_txd, input debug_rxd,
-
- // GPIF
- inout [15:0] gpif_d, input [3:0] gpif_ctl, output gpif_sloe,
- output gpif_slwr, output gpif_slrd, output gpif_pktend, output [1:0] gpif_fifoadr,
- input gpif_clk,
-
+#(
+ parameter NUM_RX_DSPS = 2,
+ parameter CTRL_ACK_SID = 20, //needed for reply
+
+ parameter DSP_TX_FIFOSIZE = 10, //4K MTU
+ parameter DSP_RX_FIFOSIZE = 10, //4K MTU
+
+ parameter DSP_RX_XTRA_FIFOSIZE = 11,
+ parameter DSP_TX_XTRA_FIFOSIZE = 11,
+
+ parameter USE_PACKET_PADDER = 0
+)
+ (input clk, input reset,
+ output [31:0] debug, output [1:0] debug_clk,
+
+ // Host Interface
+ input [35:0] tx_data, input tx_src_rdy, output tx_dst_rdy,
+ output [35:0] rx_data, output rx_src_rdy, input rx_dst_rdy,
+ input [35:0] ctrl_data, input ctrl_src_rdy, output ctrl_dst_rdy,
+ output [35:0] resp_data, output resp_src_rdy, input resp_dst_rdy,
+
+ output dsp_rx_run, output dsp_tx_run, output clock_sync,
+
inout db_sda, inout db_scl,
- output sclk, output [15:0] sen, output mosi, input miso,
+ output sclk, output [7:0] sen, output mosi, input miso,
- input cgen_st_status, input cgen_st_ld, input cgen_st_refmon, output cgen_sync_b, output cgen_ref_sel,
- inout [15:0] io_tx, inout [15:0] io_rx,
- output [13:0] tx_i, output [13:0] tx_q,
- input [11:0] rx_i, input [11:0] rx_q,
+ inout [15:0] io_tx, inout [15:0] io_rx,
+ output [13:0] tx_i, output [13:0] tx_q,
+ input [11:0] rx_i, input [11:0] rx_q,
input pps_in
);
- localparam TXFIFOSIZE = 11;
- localparam RXFIFOSIZE = 12;
-
- // 64 total regs in address space
- localparam SR_RX_CTRL0 = 0; // 9 regs (+0 to +8)
- localparam SR_RX_DSP0 = 10; // 4 regs (+0 to +3)
- localparam SR_RX_CTRL1 = 16; // 9 regs (+0 to +8)
- localparam SR_RX_DSP1 = 26; // 4 regs (+0 to +3)
- localparam SR_TX_CTRL = 32; // 4 regs (+0 to +3)
- localparam SR_TX_DSP = 38; // 3 regs (+0 to +2)
-
- localparam SR_TIME64 = 42; // 6 regs (+0 to +5)
- localparam SR_RX_FRONT = 48; // 5 regs (+0 to +4)
- localparam SR_TX_FRONT = 54; // 5 regs (+0 to +4)
-
- localparam SR_REG_TEST32 = 60; // 1 reg
- localparam SR_CLEAR_FIFO = 61; // 1 reg
- localparam SR_GLOBAL_RESET = 63; // 1 reg
- localparam SR_USER_REGS = 64; // 2 regs
-
- localparam SR_GPIO = 128; // 5 regs
-
- wire wb_clk = clk_fpga;
- wire wb_rst, global_reset;
-
- wire pps_int;
- wire [63:0] vita_time, vita_time_pps;
- reg [15:0] reg_cgen_ctrl, reg_test;
-
- wire [7:0] set_addr, set_addr_user;
- wire [31:0] set_data, set_data_user;
- wire set_stb, set_stb_user;
-
- wire [31:0] debug0;
- wire [31:0] debug1;
-
- wire [31:0] debug_vt;
- wire gpif_rst;
-
- reg [7:0] frames_per_packet;
-
- wire rx_overrun_dsp0, rx_overrun_dsp1, rx_overrun_gpif, tx_underrun_dsp, tx_underrun_gpif;
- wire rx_overrun = rx_overrun_gpif | rx_overrun_dsp0 | rx_overrun_dsp1;
- wire tx_underrun = tx_underrun_gpif | tx_underrun_dsp;
-
- setting_reg #(.my_addr(SR_GLOBAL_RESET), .width(1)) sr_reset
- (.clk(wb_clk),.rst(wb_rst),.strobe(set_stb),.addr(set_addr),
- .in(set_data),.out(),.changed(global_reset));
-
- reset_sync reset_sync_wb(.clk(wb_clk), .reset_in(rst_fpga | global_reset), .reset_out(wb_rst));
- reset_sync reset_sync_gp(.clk(gpif_clk), .reset_in(rst_fpga | global_reset), .reset_out(gpif_rst));
-
- // /////////////////////////////////////////////////////////////////////////////////////
- // GPIF Slave to Wishbone Master
- localparam dw = 16;
- localparam aw = 11;
- localparam sw = 2;
-
- wire [dw-1:0] m0_dat_mosi, m0_dat_miso;
- wire [aw-1:0] m0_adr;
- wire [sw-1:0] m0_sel;
- wire m0_cyc, m0_stb, m0_we, m0_ack, m0_err, m0_rty;
-
- wire [31:0] debug_gpif;
-
- wire [35:0] tx_data, rx_data, tx_err_data;
- wire tx_src_rdy, tx_dst_rdy, rx_src_rdy, rx_dst_rdy,
- tx_err_src_rdy, tx_err_dst_rdy;
-
- wire clear_fifo;
-
- setting_reg #(.my_addr(SR_CLEAR_FIFO), .width(1)) sr_clear_fifo
- (.clk(wb_clk),.rst(wb_rst),.strobe(set_stb),.addr(set_addr),
- .in(set_data),.out(),.changed(clear_fifo));
-
- wire run_rx0, run_rx1;
-
- slave_fifo #(.TXFIFOSIZE(TXFIFOSIZE), .RXFIFOSIZE(RXFIFOSIZE))
- slave_fifo (.gpif_clk(gpif_clk), .gpif_rst(gpif_rst), .gpif_d(gpif_d),
- .gpif_ctl(gpif_ctl), .sloe(gpif_sloe), .slwr(gpif_slwr), .slrd(gpif_slrd),
- .pktend(gpif_pktend), .fifoadr(gpif_fifoadr),
-
- .wb_clk(wb_clk), .wb_rst(wb_rst),
- .wb_adr_o(m0_adr), .wb_dat_mosi(m0_dat_mosi), .wb_dat_miso(m0_dat_miso),
- .wb_sel_o(m0_sel), .wb_cyc_o(m0_cyc), .wb_stb_o(m0_stb), .wb_we_o(m0_we),
- .wb_ack_i(m0_ack), .triggers(8'd0),
-
- .dsp_rx_run(run_rx0 | run_rx1),
-
- .fifo_clk(wb_clk), .fifo_rst(wb_rst), .clear_tx(clear_fifo), .clear_rx(clear_fifo),
- .tx_data_o(tx_data), .tx_src_rdy_o(tx_src_rdy), .tx_dst_rdy_i(tx_dst_rdy),
- .rx_data_i(rx_data), .rx_src_rdy_i(rx_src_rdy), .rx_dst_rdy_o(rx_dst_rdy),
- .tx_err_data_i(tx_err_data), .tx_err_src_rdy_i(tx_err_src_rdy), .tx_err_dst_rdy_o(tx_err_dst_rdy),
-
- .tx_underrun(tx_underrun_gpif), .rx_overrun(rx_overrun_gpif),
-
- .test_len(0), .test_rate(0), .test_ctrl(0),
- .debug0(debug0), .debug1(debug1));
+ localparam SR_MISC = 0; // 5
+ localparam SR_USER_REGS = 5; // 2
+ localparam SR_PADDER = 10; // 2
+
+ localparam SR_TX_CTRL = 32; // 6
+ localparam SR_TX_DSP = 40; // 5
+ localparam SR_TX_FE = 48; // 5
+
+ localparam SR_RX_CTRL0 = 96; // 9
+ localparam SR_RX_DSP0 = 106; // 7
+ localparam SR_RX_FE = 114; // 5
+
+ localparam SR_RX_CTRL1 = 128; // 9
+ localparam SR_RX_DSP1 = 138; // 7
+
+ localparam SR_TIME64 = 192; // 6
+ localparam SR_SPI = 208; // 3
+ localparam SR_I2C = 216; // 1
+ localparam SR_GPIO = 224; // 5
+
+ //compatibility number -> increment when the fpga has been sufficiently altered
+ localparam compat_num = {16'd11, 16'd0}; //major, minor
+
+ //assign run signals used for ATR logic
+ wire [NUM_RX_DSPS-1:0] run_rx_n;
+ wire run_tx;
+ wire run_rx = |(run_rx_n);
+ assign dsp_rx_run = run_rx;
+ assign dsp_tx_run = run_tx;
+
+ //shared time core signals
+ wire [63:0] vita_time, vita_time_pps;
+
+ //shared settings bus signals
+ wire set_stb, set_stb_user;
+ wire [31:0] set_data, set_data_user;
+ wire [7:0] set_addr, set_addr_user;
+
+ //shared SPI core signals
+ wire [31:0] spi_readback;
+ wire spi_ready;
+
+ //shared I2C core signals
+ wire [31:0] i2c_readback;
+ wire i2c_ready;
+
+ //shared GPIO core signals
+ wire [31:0] gpio_readback;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Misc Registers - persistent across resets
+ ///////////////////////////////////////////////////////////////////////////
+ wire [31:0] config_word0;
+ setting_reg #(.my_addr(SR_MISC+0), .width(32)) sr_misc_config0
+ (.clk(clk), .rst(1'b0/*reset*/), .strobe(set_stb), .addr(set_addr), .in(set_data), .out(config_word0));
+
+ wire [31:0] config_word1;
+ setting_reg #(.my_addr(SR_MISC+1), .width(32)) sr_misc_config1
+ (.clk(clk), .rst(1'b0/*reset*/), .strobe(set_stb), .addr(set_addr), .in(set_data), .out(config_word1));
+
+ wire clock_sync_inv, clock_sync_enb;
+ setting_reg #(.my_addr(SR_MISC+2), .width(2)) sr_misc_clock_sync
+ (.clk(clk), .rst(reset), .strobe(set_stb), .addr(set_addr), .in(set_data),
+ .out({clock_sync_inv, clock_sync_enb}));
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Settings Bus and Readback
+ ///////////////////////////////////////////////////////////////////////////
+ user_settings #(.BASE(SR_USER_REGS)) user_settings
+ (.clk(clk),.rst(reset),
+ .set_stb(set_stb), .set_addr(set_addr),.set_data(set_data),
+ .set_addr_user(set_addr_user),.set_data_user(set_data_user), .set_stb_user(set_stb_user) );
+
+ wire [35:0] ctrl_out_data, ctrl_int_data;
+ wire ctrl_out_src_rdy, ctrl_out_dst_rdy;
+ wire ctrl_int_src_rdy, ctrl_int_dst_rdy;
+
+ fifo_cascade #(.WIDTH(36), .SIZE(9)) ctrl_fifo
+ (.clk(clk), .reset(reset), .clear(1'b0),
+ .datain(ctrl_data), .src_rdy_i(ctrl_src_rdy), .dst_rdy_o(ctrl_dst_rdy), .space(),
+ .dataout(ctrl_int_data), .src_rdy_o(ctrl_int_src_rdy), .dst_rdy_i(ctrl_int_dst_rdy), .occupied());
+
+ wire [31:0] num_rx_dsps_rb = NUM_RX_DSPS;
+
+ wire [31:0] sfc_debug;
+ settings_fifo_ctrl #(.PROT_HDR(0), .ACK_SID(CTRL_ACK_SID), .XPORT_HDR(0)) sfc
+ (
+ .clock(clk), .reset(reset), .clear(1'b0),
+ .vita_time(vita_time), .perfs_ready(spi_ready & i2c_ready),
+ .in_data(ctrl_int_data), .in_valid(ctrl_int_src_rdy), .in_ready(ctrl_int_dst_rdy),
+ .out_data(ctrl_out_data), .out_valid(ctrl_out_src_rdy), .out_ready(ctrl_out_dst_rdy),
+ .strobe(set_stb), .addr(set_addr), .data(set_data),
+ .word00(spi_readback),.word01(compat_num),.word02(i2c_readback),.word03(gpio_readback),
+ .word04(config_word0),.word05(config_word1),.word06(num_rx_dsps_rb),.word07(32'hffff_ffff),
+ .word08(32'hffff_ffff),.word09(32'hffff_ffff),.word10(vita_time[63:32]),
+ .word11(vita_time[31:0]),.word12(32'hffff_ffff),.word13(32'hffff_ffff),
+ .word14(vita_time_pps[63:32]),.word15(vita_time_pps[31:0]),
+ .debug(sfc_debug)
+ );
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Time Core
+ ///////////////////////////////////////////////////////////////////////////
+ time_64bit #(.BASE(SR_TIME64)) time_64bit
+ (.clk(clk), .rst(reset), .set_stb(set_stb), .set_addr(set_addr), .set_data(set_data),
+ .pps(pps_in), .vita_time(vita_time), .vita_time_pps(vita_time_pps),
+ .exp_time_in(0));
+
+ assign clock_sync = (clock_sync_enb)? (pps_in ^ clock_sync_inv) : 1'b0;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // SPI Core
+ ///////////////////////////////////////////////////////////////////////////
+ simple_spi_core #(.BASE(SR_SPI), .WIDTH(8), .CLK_IDLE(0), .SEN_IDLE(8'hff))
+ simple_spi_core (.clock(clk), .reset(reset),
+ .set_stb(set_stb), .set_addr(set_addr), .set_data(set_data),
+ .readback(spi_readback), .ready(spi_ready),
+ .sen(sen), .sclk(sclk), .mosi(mosi), .miso(miso));
+
+ ///////////////////////////////////////////////////////////////////////////
+ // I2C Core
+ ///////////////////////////////////////////////////////////////////////////
+ wire scl_pad_i, scl_pad_o, scl_pad_oen_o, sda_pad_i, sda_pad_o, sda_pad_oen_o;
+ simple_i2c_core #(.BASE(SR_I2C)) i2c_core
+ (.clock(clk),.reset(reset),
+ .set_stb(set_stb), .set_addr(set_addr), .set_data(set_data),
+ .readback(i2c_readback), .ready(i2c_ready),
+ .scl_pad_i(scl_pad_i),.scl_pad_o(scl_pad_o),.scl_padoen_o(scl_pad_oen_o),
+ .sda_pad_i(sda_pad_i),.sda_pad_o(sda_pad_o),.sda_padoen_o(sda_pad_oen_o) );
+
+ // I2C -- Don't use external transistors for open drain, the FPGA implements this
+ IOBUF scl_pin(.O(scl_pad_i), .IO(db_scl), .I(scl_pad_o), .T(scl_pad_oen_o));
+ IOBUF sda_pin(.O(sda_pad_i), .IO(db_sda), .I(sda_pad_o), .T(sda_pad_oen_o));
+
+ ///////////////////////////////////////////////////////////////////////////
+ // GPIO Core
+ ///////////////////////////////////////////////////////////////////////////
+ gpio_atr #(.BASE(SR_GPIO), .WIDTH(32))
+ gpio_atr(.clk(clk),.reset(reset),
+ .set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
+ .rx(run_rx), .tx(run_tx), .gpio({io_tx, io_rx}), .gpio_readback(gpio_readback) );
// /////////////////////////////////////////////////////////////////////////
// RX ADC Frontend, does IQ Balance, DC Offset, muxing
wire [23:0] rx_fe_i, rx_fe_q; // 24 bits is total overkill here, but it matches u2/u2p
- rx_frontend #(.BASE(SR_RX_FRONT)) rx_frontend
- (.clk(wb_clk),.rst(wb_rst),
+ rx_frontend #(.BASE(SR_RX_FE)) rx_frontend
+ (.clk(clk),.rst(reset),
.set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
.adc_a({rx_i,4'b00}),.adc_ovf_a(0),
.adc_b({rx_q,4'b00}),.adc_ovf_b(0),
- .i_out(rx_fe_i), .q_out(rx_fe_q), .run(run_rx0 | run_rx1), .debug());
-
- // /////////////////////////////////////////////////////////////////////////
- // DSP RX 0
-
- wire [31:0] sample_rx0;
- wire strobe_rx0, clear_rx0;
- wire [35:0] vita_rx_data0;
- wire vita_rx_src_rdy0, vita_rx_dst_rdy0;
-
- ddc_chain #(.BASE(SR_RX_DSP0), .DSPNO(0)) ddc_chain0
- (.clk(wb_clk), .rst(wb_rst), .clr(clear_rx0),
- .set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
- .set_stb_user(set_stb_user), .set_addr_user(set_addr_user), .set_data_user(set_data_user),
- .rx_fe_i(rx_fe_i),.rx_fe_q(rx_fe_q),
- .sample(sample_rx0), .run(run_rx0), .strobe(strobe_rx0),
- .debug() );
+ .i_out(rx_fe_i), .q_out(rx_fe_q), .run(run_rx), .debug());
- vita_rx_chain #(.BASE(SR_RX_CTRL0), .UNIT(0), .FIFOSIZE(10), .PROT_ENG_FLAGS(0), .DSP_NUMBER(0)) vita_rx_chain0
- (.clk(wb_clk),.reset(wb_rst),
- .set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
- .set_stb_user(set_stb_user), .set_addr_user(set_addr_user), .set_data_user(set_data_user),
- .vita_time(vita_time), .overrun(rx_overrun_dsp0),
- .sample(sample_rx0), .run(run_rx0), .strobe(strobe_rx0), .clear_o(clear_rx0),
- .rx_data_o(vita_rx_data0), .rx_dst_rdy_i(vita_rx_dst_rdy0), .rx_src_rdy_o(vita_rx_src_rdy0),
- .debug() );
-
// /////////////////////////////////////////////////////////////////////////
- // DSP RX 1
-
- wire [31:0] sample_rx1;
- wire strobe_rx1, clear_rx1;
- wire [35:0] vita_rx_data1;
- wire vita_rx_src_rdy1, vita_rx_dst_rdy1;
-
- ddc_chain #(.BASE(SR_RX_DSP1), .DSPNO(1)) ddc_chain1
- (.clk(wb_clk),.rst(wb_rst), .clr(clear_rx1),
- .set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
- .set_stb_user(set_stb_user), .set_addr_user(set_addr_user), .set_data_user(set_data_user),
- .rx_fe_i(rx_fe_i),.rx_fe_q(rx_fe_q),
- .sample(sample_rx1), .run(run_rx1), .strobe(strobe_rx1),
- .debug() );
-
- vita_rx_chain #(.BASE(SR_RX_CTRL1), .UNIT(1), .FIFOSIZE(10), .PROT_ENG_FLAGS(0), .DSP_NUMBER(1)) vita_rx_chain1
- (.clk(wb_clk),.reset(wb_rst),
- .set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
- .set_stb_user(set_stb_user), .set_addr_user(set_addr_user), .set_data_user(set_data_user),
- .vita_time(vita_time), .overrun(rx_overrun_dsp1),
- .sample(sample_rx1), .run(run_rx1), .strobe(strobe_rx1), .clear_o(clear_rx1),
- .rx_data_o(vita_rx_data1), .rx_dst_rdy_i(vita_rx_dst_rdy1), .rx_src_rdy_o(vita_rx_src_rdy1),
- .debug() );
+ // DSP RX *
+
+ wire [35:0] rx_int2_data [NUM_RX_DSPS-1:0];
+ wire rx_int2_src_rdy [NUM_RX_DSPS-1:0];
+ wire rx_int2_dst_rdy [NUM_RX_DSPS-1:0];
+
+ genvar dspno;
+ generate
+ for(dspno = 0; dspno < NUM_RX_DSPS; dspno = dspno + 1) begin:gen_rx_dsps
+
+ wire [31:0] sample_rx;
+ wire strobe_rx, clear_rx;
+ wire [35:0] vita_rx_data;
+ wire vita_rx_src_rdy, vita_rx_dst_rdy;
+ wire [35:0] int_rx_data;
+ wire int_rx_src_rdy, int_rx_dst_rdy;
+
+ ddc_chain #(.BASE(SR_RX_DSP0+dspno*32), .DSPNO(dspno)) ddc_chain
+ (.clk(clk), .rst(reset), .clr(clear_rx),
+ .set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
+ .set_stb_user(set_stb_user), .set_addr_user(set_addr_user), .set_data_user(set_data_user),
+ .rx_fe_i(rx_fe_i),.rx_fe_q(rx_fe_q),
+ .sample(sample_rx), .run(run_rx_n[dspno]), .strobe(strobe_rx),
+ .debug() );
+
+ vita_rx_chain #(.BASE(SR_RX_CTRL0+dspno*32), .UNIT(dspno), .FIFOSIZE(DSP_RX_FIFOSIZE), .PROT_ENG_FLAGS(0), .DSP_NUMBER(dspno)) vita_rx_chain
+ (.clk(clk),.reset(reset),
+ .set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
+ .set_stb_user(set_stb_user), .set_addr_user(set_addr_user), .set_data_user(set_data_user),
+ .vita_time(vita_time), .overrun(),
+ .sample(sample_rx), .run(run_rx_n[dspno]), .strobe(strobe_rx), .clear_o(clear_rx),
+ .rx_data_o(vita_rx_data), .rx_dst_rdy_i(vita_rx_dst_rdy), .rx_src_rdy_o(vita_rx_src_rdy),
+ .debug() );
+
+ fifo_cascade #(.WIDTH(36), .SIZE(DSP_RX_FIFOSIZE+1)) rx_data_fifo
+ (.clk(clk), .reset(reset), .clear(1'b0),
+ .datain(vita_rx_data), .src_rdy_i(vita_rx_src_rdy), .dst_rdy_o(vita_rx_dst_rdy), .space(),
+ .dataout(int_rx_data), .src_rdy_o(int_rx_src_rdy), .dst_rdy_i(int_rx_dst_rdy), .occupied());
+
+ if (dspno == 0) begin
+ assign rx_int2_data[dspno] = int_rx_data;
+ assign rx_int2_src_rdy[dspno] = int_rx_src_rdy;
+ assign int_rx_dst_rdy = rx_int2_dst_rdy[dspno];
+ end
+ else begin
+ fifo36_mux #(.prio(0)) // No priority, fair sharing
+ combine_rx_dsps (
+ .clk(clk), .reset(reset), .clear(1'b0/*noclear*/),
+ .data0_i(rx_int2_data[dspno-1]), .src0_rdy_i(rx_int2_src_rdy[dspno-1]), .dst0_rdy_o(rx_int2_dst_rdy[dspno-1]),
+ .data1_i(int_rx_data), .src1_rdy_i(int_rx_src_rdy), .dst1_rdy_o(int_rx_dst_rdy),
+ .data_o(rx_int2_data[dspno]), .src_rdy_o(rx_int2_src_rdy[dspno]), .dst_rdy_i(rx_int2_dst_rdy[dspno])
+ );
+ end
+
+ end
+ endgenerate
// /////////////////////////////////////////////////////////////////////////
// RX Stream muxing
- fifo36_mux #(.prio(0)) mux_data_streams
- (.clk(wb_clk), .reset(wb_rst), .clear(clear_fifo),
- .data0_i(vita_rx_data0), .src0_rdy_i(vita_rx_src_rdy0), .dst0_rdy_o(vita_rx_dst_rdy0),
- .data1_i(vita_rx_data1), .src1_rdy_i(vita_rx_src_rdy1), .dst1_rdy_o(vita_rx_dst_rdy1),
- .data_o(rx_data), .src_rdy_o(rx_src_rdy), .dst_rdy_i(rx_dst_rdy));
+ wire [35:0] rx_int3_data;
+ wire rx_int3_src_rdy, rx_int3_dst_rdy;
+
+ fifo_cascade #(.WIDTH(36), .SIZE(DSP_RX_XTRA_FIFOSIZE)) rx_data_fifo_combined
+ (.clk(clk), .reset(reset), .clear(1'b0),
+ .datain(rx_int2_data[NUM_RX_DSPS-1]), .src_rdy_i(rx_int2_src_rdy[NUM_RX_DSPS-1]), .dst_rdy_o(rx_int2_dst_rdy[NUM_RX_DSPS-1]), .space(),
+ .dataout(rx_int3_data), .src_rdy_o(rx_int3_src_rdy), .dst_rdy_i(rx_int3_dst_rdy), .occupied());
+
+ generate
+ if (USE_PACKET_PADDER) begin
+ packet_padder36 #(.BASE(SR_PADDER)) packet_padder_rx_data36(
+ .clk(clk), .reset(reset),
+ .set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
+ .data_i(rx_int3_data), .src_rdy_i(rx_int3_src_rdy), .dst_rdy_o(rx_int3_dst_rdy),
+ .data_o(rx_data), .src_rdy_o(rx_src_rdy), .dst_rdy_i(rx_dst_rdy),
+ .always_flush(~dsp_rx_run));
+ end
+ else begin
+ assign rx_data = rx_int3_data;
+ assign rx_src_rdy = rx_int3_src_rdy;
+ assign rx_int3_dst_rdy = rx_dst_rdy;
+ end
+ endgenerate
+
+ ///////////////////////////////////////////////////////////////////////////
+ // MUX for TX async and resp data
+ ///////////////////////////////////////////////////////////////////////////
+ wire [35:0] tx_err_data, resp_data_int;
+ wire tx_err_src_rdy, resp_src_rdy_int;
+ wire tx_err_dst_rdy, resp_dst_rdy_int;
+
+ fifo36_mux #(.prio(0)) // No priority, fair sharing
+ combine_async_and_resp (
+ .clk(clk), .reset(reset), .clear(1'b0/*noclear*/),
+ .data0_i(ctrl_out_data), .src0_rdy_i(ctrl_out_src_rdy), .dst0_rdy_o(ctrl_out_dst_rdy),
+ .data1_i(tx_err_data), .src1_rdy_i(tx_err_src_rdy), .dst1_rdy_o(tx_err_dst_rdy),
+ .data_o(resp_data_int), .src_rdy_o(resp_src_rdy_int), .dst_rdy_i(resp_dst_rdy_int)
+ );
+
+ fifo_cascade #(.WIDTH(36), .SIZE(9)) resp_fifo
+ (.clk(clk), .reset(reset), .clear(1'b0),
+ .datain(resp_data_int), .src_rdy_i(resp_src_rdy_int), .dst_rdy_o(resp_dst_rdy_int), .space(),
+ .dataout(resp_data), .src_rdy_o(resp_src_rdy), .dst_rdy_i(resp_dst_rdy), .occupied());
// ///////////////////////////////////////////////////////////////////////////////////
// DSP TX
- wire run_tx;
wire [23:0] tx_fe_i, tx_fe_q;
wire [31:0] sample_tx;
wire strobe_tx, clear_tx;
- vita_tx_chain #(.BASE(SR_TX_CTRL), .FIFOSIZE(10), .POST_ENGINE_FIFOSIZE(11),
+`ifdef DISABLE_TX_DSP
+ assign tx_dst_rdy = 1; //null sink
+ assign run_tx = 0;
+ assign tx_i = 0;
+ assign tx_q = 0;
+`else
+ vita_tx_chain #(.BASE(SR_TX_CTRL),
+ .FIFOSIZE(DSP_TX_FIFOSIZE),
+ .POST_ENGINE_FIFOSIZE(DSP_TX_XTRA_FIFOSIZE),
.REPORT_ERROR(1), .DO_FLOW_CONTROL(0),
.PROT_ENG_FLAGS(0), .USE_TRANS_HEADER(0),
- .DSP_NUMBER(0))
+ .DSP_NUMBER(0))
vita_tx_chain
- (.clk(wb_clk), .reset(wb_rst),
+ (.clk(clk), .reset(reset),
.set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
.set_stb_user(set_stb_user), .set_addr_user(set_addr_user), .set_data_user(set_data_user),
.vita_time(vita_time),
.tx_data_i(tx_data), .tx_src_rdy_i(tx_src_rdy), .tx_dst_rdy_o(tx_dst_rdy),
.err_data_o(tx_err_data), .err_src_rdy_o(tx_err_src_rdy), .err_dst_rdy_i(tx_err_dst_rdy),
.sample(sample_tx), .strobe(strobe_tx),
- .underrun(tx_underrun_dsp), .run(run_tx), .clear_o(clear_tx),
- .debug(debug_vt));
+ .underrun(), .run(run_tx), .clear_o(clear_tx),
+ .debug());
duc_chain #(.BASE(SR_TX_DSP), .DSPNO(0)) duc_chain
- (.clk(wb_clk), .rst(wb_rst), .clr(clear_tx),
+ (.clk(clk), .rst(reset), .clr(clear_tx),
.set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
.set_stb_user(set_stb_user), .set_addr_user(set_addr_user), .set_data_user(set_data_user),
.tx_fe_i(tx_fe_i),.tx_fe_q(tx_fe_q),
.sample(sample_tx), .run(run_tx), .strobe(strobe_tx),
.debug() );
- tx_frontend #(.BASE(SR_TX_FRONT), .WIDTH_OUT(14)) tx_frontend
- (.clk(wb_clk), .rst(wb_rst),
+ tx_frontend #(.BASE(SR_TX_FE), .WIDTH_OUT(14)) tx_frontend
+ (.clk(clk), .rst(reset),
.set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
.tx_i(tx_fe_i), .tx_q(tx_fe_q), .run(1'b1),
.dac_a(tx_i), .dac_b(tx_q));
-
- // /////////////////////////////////////////////////////////////////////////////////////
- // Wishbone Intercon, single master
- wire [dw-1:0] s0_dat_mosi, s1_dat_mosi, s0_dat_miso, s1_dat_miso, s2_dat_mosi, s3_dat_mosi, s2_dat_miso, s3_dat_miso,
- s4_dat_mosi, s5_dat_mosi, s4_dat_miso, s5_dat_miso, s6_dat_mosi, s7_dat_mosi, s6_dat_miso, s7_dat_miso,
- s8_dat_mosi, s9_dat_mosi, s8_dat_miso, s9_dat_miso, sa_dat_mosi, sb_dat_mosi, sa_dat_miso, sb_dat_miso,
- sc_dat_mosi, sd_dat_mosi, sc_dat_miso, sd_dat_miso, se_dat_mosi, sf_dat_mosi, se_dat_miso, sf_dat_miso;
- wire [aw-1:0] s0_adr,s1_adr,s2_adr,s3_adr,s4_adr,s5_adr,s6_adr,s7_adr;
- wire [aw-1:0] s8_adr,s9_adr,sa_adr,sb_adr,sc_adr, sd_adr, se_adr, sf_adr;
- wire [sw-1:0] s0_sel,s1_sel,s2_sel,s3_sel,s4_sel,s5_sel,s6_sel,s7_sel;
- wire [sw-1:0] s8_sel,s9_sel,sa_sel,sb_sel,sc_sel, sd_sel, se_sel, sf_sel;
- wire s0_ack,s1_ack,s2_ack,s3_ack,s4_ack,s5_ack,s6_ack,s7_ack;
- wire s8_ack,s9_ack,sa_ack,sb_ack,sc_ack, sd_ack, se_ack, sf_ack;
- wire s0_stb,s1_stb,s2_stb,s3_stb,s4_stb,s5_stb,s6_stb,s7_stb;
- wire s8_stb,s9_stb,sa_stb,sb_stb,sc_stb, sd_stb, se_stb, sf_stb;
- wire s0_cyc,s1_cyc,s2_cyc,s3_cyc,s4_cyc,s5_cyc,s6_cyc,s7_cyc;
- wire s8_cyc,s9_cyc,sa_cyc,sb_cyc,sc_cyc, sd_cyc, se_cyc, sf_cyc;
- wire s0_we,s1_we,s2_we,s3_we,s4_we,s5_we,s6_we,s7_we;
- wire s8_we,s9_we,sa_we,sb_we,sc_we,sd_we, se_we, sf_we;
-
- wb_1master #(.dw(dw), .aw(aw), .sw(sw), .decode_w(4),
- .s0_addr(4'h0), .s0_mask(4'hF), // Misc Regs
- .s1_addr(4'h1), .s1_mask(4'hF), // Unused
- .s2_addr(4'h2), .s2_mask(4'hF), // SPI
- .s3_addr(4'h3), .s3_mask(4'hF), // I2C
- .s4_addr(4'h4), .s4_mask(4'hF), // Unused
- .s5_addr(4'h5), .s5_mask(4'hF), // Unused on B1x0, Async Msg on E1x0
- .s6_addr(4'h6), .s6_mask(4'hF), // Unused
- .s7_addr(4'h7), .s7_mask(4'hF), // Readback MUX
- .s8_addr(4'h8), .s8_mask(4'h8), // Setting Regs -- slave 8 is 8 slaves wide
- // slaves 9-f alias to slave 1, all are unused
- .s9_addr(4'h1), .s9_mask(4'hF),
- .sa_addr(4'h1), .sa_mask(4'hF), .sb_addr(4'h1), .sb_mask(4'hF),
- .sc_addr(4'h1), .sc_mask(4'hF), .sd_addr(4'h1), .sd_mask(4'hF),
- .se_addr(4'h1), .se_mask(4'hF), .sf_addr(4'h1), .sf_mask(4'hF))
- wb_1master
- (.clk_i(wb_clk),.rst_i(wb_rst),
- .m0_dat_o(m0_dat_miso),.m0_ack_o(m0_ack),.m0_err_o(m0_err),.m0_rty_o(m0_rty),.m0_dat_i(m0_dat_mosi),
- .m0_adr_i(m0_adr),.m0_sel_i(m0_sel),.m0_we_i(m0_we),.m0_cyc_i(m0_cyc),.m0_stb_i(m0_stb),
- .s0_dat_o(s0_dat_mosi),.s0_adr_o(s0_adr),.s0_sel_o(s0_sel),.s0_we_o(s0_we),.s0_cyc_o(s0_cyc),.s0_stb_o(s0_stb),
- .s0_dat_i(s0_dat_miso),.s0_ack_i(s0_ack),.s0_err_i(0),.s0_rty_i(0),
- .s1_dat_o(s1_dat_mosi),.s1_adr_o(s1_adr),.s1_sel_o(s1_sel),.s1_we_o(s1_we),.s1_cyc_o(s1_cyc),.s1_stb_o(s1_stb),
- .s1_dat_i(s1_dat_miso),.s1_ack_i(s1_ack),.s1_err_i(0),.s1_rty_i(0),
- .s2_dat_o(s2_dat_mosi),.s2_adr_o(s2_adr),.s2_sel_o(s2_sel),.s2_we_o(s2_we),.s2_cyc_o(s2_cyc),.s2_stb_o(s2_stb),
- .s2_dat_i(s2_dat_miso),.s2_ack_i(s2_ack),.s2_err_i(0),.s2_rty_i(0),
- .s3_dat_o(s3_dat_mosi),.s3_adr_o(s3_adr),.s3_sel_o(s3_sel),.s3_we_o(s3_we),.s3_cyc_o(s3_cyc),.s3_stb_o(s3_stb),
- .s3_dat_i(s3_dat_miso),.s3_ack_i(s3_ack),.s3_err_i(0),.s3_rty_i(0),
- .s4_dat_o(s4_dat_mosi),.s4_adr_o(s4_adr),.s4_sel_o(s4_sel),.s4_we_o(s4_we),.s4_cyc_o(s4_cyc),.s4_stb_o(s4_stb),
- .s4_dat_i(s4_dat_miso),.s4_ack_i(s4_ack),.s4_err_i(0),.s4_rty_i(0),
- .s5_dat_o(s5_dat_mosi),.s5_adr_o(s5_adr),.s5_sel_o(s5_sel),.s5_we_o(s5_we),.s5_cyc_o(s5_cyc),.s5_stb_o(s5_stb),
- .s5_dat_i(s5_dat_miso),.s5_ack_i(s5_ack),.s5_err_i(0),.s5_rty_i(0),
- .s6_dat_o(s6_dat_mosi),.s6_adr_o(s6_adr),.s6_sel_o(s6_sel),.s6_we_o(s6_we),.s6_cyc_o(s6_cyc),.s6_stb_o(s6_stb),
- .s6_dat_i(s6_dat_miso),.s6_ack_i(s6_ack),.s6_err_i(0),.s6_rty_i(0),
- .s7_dat_o(s7_dat_mosi),.s7_adr_o(s7_adr),.s7_sel_o(s7_sel),.s7_we_o(s7_we),.s7_cyc_o(s7_cyc),.s7_stb_o(s7_stb),
- .s7_dat_i(s7_dat_miso),.s7_ack_i(s7_ack),.s7_err_i(0),.s7_rty_i(0),
- .s8_dat_o(s8_dat_mosi),.s8_adr_o(s8_adr),.s8_sel_o(s8_sel),.s8_we_o(s8_we),.s8_cyc_o(s8_cyc),.s8_stb_o(s8_stb),
- .s8_dat_i(s8_dat_miso),.s8_ack_i(s8_ack),.s8_err_i(0),.s8_rty_i(0),
- .s9_dat_o(s9_dat_mosi),.s9_adr_o(s9_adr),.s9_sel_o(s9_sel),.s9_we_o(s9_we),.s9_cyc_o(s9_cyc),.s9_stb_o(s9_stb),
- .s9_dat_i(s9_dat_miso),.s9_ack_i(s9_ack),.s9_err_i(0),.s9_rty_i(0),
- .sa_dat_o(sa_dat_mosi),.sa_adr_o(sa_adr),.sa_sel_o(sa_sel),.sa_we_o(sa_we),.sa_cyc_o(sa_cyc),.sa_stb_o(sa_stb),
- .sa_dat_i(sa_dat_miso),.sa_ack_i(sa_ack),.sa_err_i(0),.sa_rty_i(0),
- .sb_dat_o(sb_dat_mosi),.sb_adr_o(sb_adr),.sb_sel_o(sb_sel),.sb_we_o(sb_we),.sb_cyc_o(sb_cyc),.sb_stb_o(sb_stb),
- .sb_dat_i(sb_dat_miso),.sb_ack_i(sb_ack),.sb_err_i(0),.sb_rty_i(0),
- .sc_dat_o(sc_dat_mosi),.sc_adr_o(sc_adr),.sc_sel_o(sc_sel),.sc_we_o(sc_we),.sc_cyc_o(sc_cyc),.sc_stb_o(sc_stb),
- .sc_dat_i(sc_dat_miso),.sc_ack_i(sc_ack),.sc_err_i(0),.sc_rty_i(0),
- .sd_dat_o(sd_dat_mosi),.sd_adr_o(sd_adr),.sd_sel_o(sd_sel),.sd_we_o(sd_we),.sd_cyc_o(sd_cyc),.sd_stb_o(sd_stb),
- .sd_dat_i(sd_dat_miso),.sd_ack_i(sd_ack),.sd_err_i(0),.sd_rty_i(0),
- .se_dat_o(se_dat_mosi),.se_adr_o(se_adr),.se_sel_o(se_sel),.se_we_o(se_we),.se_cyc_o(se_cyc),.se_stb_o(se_stb),
- .se_dat_i(se_dat_miso),.se_ack_i(se_ack),.se_err_i(0),.se_rty_i(0),
- .sf_dat_o(sf_dat_mosi),.sf_adr_o(sf_adr),.sf_sel_o(sf_sel),.sf_we_o(sf_we),.sf_cyc_o(sf_cyc),.sf_stb_o(sf_stb),
- .sf_dat_i(sf_dat_miso),.sf_ack_i(sf_ack),.sf_err_i(0),.sf_rty_i(0) );
-
- assign s1_ack = 0; assign s4_ack = 0; assign s5_ack = 0; assign s6_ack = 0;
- assign s9_ack = 0; assign sa_ack = 0; assign sb_ack = 0;
- assign sc_ack = 0; assign sd_ack = 0; assign se_ack = 0; assign sf_ack = 0;
-
- // /////////////////////////////////////////////////////////////////////////////////////
- // Slave 0, Misc LEDs, Switches, controls
-
- localparam REG_CGEN_CTRL = 7'd4; // out
- localparam REG_CGEN_ST = 7'd6; // in
- localparam REG_TEST = 7'd8; // out
- localparam REG_RX_FRAMELEN = 7'd10; // in
- localparam REG_TX_FRAMELEN = 7'd12; // out
-
- always @(posedge wb_clk)
- if(wb_rst)
- begin
- reg_cgen_ctrl <= 2'b11;
- reg_test <= 0;
- frames_per_packet <= 0;
- end
- else
- if(s0_cyc & s0_stb & s0_we)
- case(s0_adr[6:0])
- REG_CGEN_CTRL :
- reg_cgen_ctrl <= s0_dat_mosi;
- REG_TEST :
- reg_test <= s0_dat_mosi;
- REG_RX_FRAMELEN :
- frames_per_packet <= s0_dat_mosi[7:0];
- endcase // case (s0_adr[6:0])
-
- assign debug_led = {run_tx, (run_rx0 | run_rx1), cgen_st_ld};
- assign { cgen_sync_b, cgen_ref_sel } = reg_cgen_ctrl;
-
- assign s0_dat_miso = (s0_adr[6:0] == REG_CGEN_CTRL) ? reg_cgen_ctrl :
- (s0_adr[6:0] == REG_CGEN_ST) ? {13'b0,cgen_st_status,cgen_st_ld,cgen_st_refmon} :
- (s0_adr[6:0] == REG_TEST) ? reg_test :
- 16'hBEEF;
-
- assign s0_ack = s0_stb & s0_cyc;
-
- // /////////////////////////////////////////////////////////////////////////////////////
- // Slave 2, SPI
-
- spi_top16 shared_spi
- (.wb_clk_i(wb_clk),.wb_rst_i(wb_rst),.wb_adr_i(s2_adr[4:0]),.wb_dat_i(s2_dat_mosi),
- .wb_dat_o(s2_dat_miso),.wb_sel_i(s2_sel),.wb_we_i(s2_we),.wb_stb_i(s2_stb),
- .wb_cyc_i(s2_cyc),.wb_ack_o(s2_ack),.wb_err_o(),.wb_int_o(),
- .ss_pad_o(sen), .sclk_pad_o(sclk), .mosi_pad_o(mosi), .miso_pad_i(miso) );
-
- // /////////////////////////////////////////////////////////////////////////
- // Slave 3, I2C
-
- wire scl_pad_i, scl_pad_o, scl_pad_oen_o, sda_pad_i, sda_pad_o, sda_pad_oen_o;
- i2c_master_top #(.ARST_LVL(1)) i2c
- (.wb_clk_i(wb_clk),.wb_rst_i(wb_rst),.arst_i(1'b0),
- .wb_adr_i(s3_adr[3:1]),.wb_dat_i(s3_dat_mosi[7:0]),.wb_dat_o(s3_dat_miso[7:0]),
- .wb_we_i(s3_we),.wb_stb_i(s3_stb),.wb_cyc_i(s3_cyc),
- .wb_ack_o(s3_ack),.wb_inta_o(),
- .scl_pad_i(scl_pad_i),.scl_pad_o(scl_pad_o),.scl_padoen_o(scl_pad_oen_o),
- .sda_pad_i(sda_pad_i),.sda_pad_o(sda_pad_o),.sda_padoen_o(sda_pad_oen_o) );
-
- assign s3_dat_miso[15:8] = 8'd0;
-
- // I2C -- Don't use external transistors for open drain, the FPGA implements this
- IOBUF scl_pin(.O(scl_pad_i), .IO(db_scl), .I(scl_pad_o), .T(scl_pad_oen_o));
- IOBUF sda_pin(.O(sda_pad_i), .IO(db_sda), .I(sda_pad_o), .T(sda_pad_oen_o));
-
- // /////////////////////////////////////////////////////////////////////////
- // GPIOs
-
- wire [31:0] gpio_readback;
-
- gpio_atr #(.BASE(SR_GPIO), .WIDTH(32))
- gpio_atr(.clk(wb_clk),.reset(wb_rst),
- .set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
- .rx(run_rx0 | run_rx1), .tx(run_tx),
- .gpio({io_tx,io_rx}), .gpio_readback(gpio_readback) );
-
- // /////////////////////////////////////////////////////////////////////////
- // Settings Bus -- Slave #8 + 9
-
- // only have 64 regs, 32 bits each with current setup...
- settings_bus_16LE #(.AWIDTH(11),.RWIDTH(8)) settings_bus_16LE
- (.wb_clk(wb_clk),.wb_rst(wb_rst),.wb_adr_i(s8_adr),.wb_dat_i(s8_dat_mosi),
- .wb_stb_i(s8_stb),.wb_we_i(s8_we),.wb_ack_o(s8_ack),
- .strobe(set_stb),.addr(set_addr),.data(set_data) );
-
- user_settings #(.BASE(SR_USER_REGS)) user_settings
- (.clk(wb_clk),.rst(wb_rst),.set_stb(set_stb),
- .set_addr(set_addr),.set_data(set_data),
- .set_addr_user(set_addr_user),.set_data_user(set_data_user),
- .set_stb_user(set_stb_user) );
-
- // /////////////////////////////////////////////////////////////////////////
- // Readback mux 32 -- Slave #7
-
- //compatibility number -> increment when the fpga has been sufficiently altered
- localparam compat_num = {16'd9, 16'd3}; //major, minor
-
- wire [31:0] reg_test32;
-
- setting_reg #(.my_addr(SR_REG_TEST32)) sr_reg_test32
- (.clk(wb_clk),.rst(wb_rst),.strobe(set_stb),.addr(set_addr),
- .in(set_data),.out(reg_test32),.changed());
-
- wb_readback_mux_16LE readback_mux_32
- (.wb_clk_i(wb_clk), .wb_rst_i(wb_rst), .wb_stb_i(s7_stb),
- .wb_adr_i({5'b0,s7_adr}), .wb_dat_o(s7_dat_miso), .wb_ack_o(s7_ack),
-
- .word00(vita_time[63:32]), .word01(vita_time[31:0]),
- .word02(vita_time_pps[63:32]), .word03(vita_time_pps[31:0]),
- .word04(reg_test32), .word05(32'b0),
- .word06(compat_num), .word07(gpio_readback),
- .word08(32'b0), .word09(32'b0),
- .word10(32'b0), .word11(32'b0),
- .word12(32'b0), .word13(32'b0),
- .word14(32'b0), .word15(32'b0)
- );
-
- // /////////////////////////////////////////////////////////////////////////
- // VITA Timing
-
- time_64bit #(.BASE(SR_TIME64)) time_64bit
- (.clk(wb_clk), .rst(wb_rst), .set_stb(set_stb), .set_addr(set_addr), .set_data(set_data),
- .pps(pps_in), .vita_time(vita_time), .vita_time_pps(vita_time_pps), .pps_int(pps_int),
- .exp_time_in(0));
-
+`endif
// /////////////////////////////////////////////////////////////////////////////////////
// Debug circuitry
- assign debug_clk = 2'b00; // { gpif_clk, clk_fpga };
- assign debug = 0;
-
+ assign debug_clk = 2'b11;
+ assign debug = 32'hffffffff;
+
endmodule // u1plus_core
diff --git a/fpga/usrp2/top/E1x0/u1e.ucf b/fpga/usrp2/top/E1x0/E1x0.ucf
index 278fc289a..278fc289a 100644
--- a/fpga/usrp2/top/E1x0/u1e.ucf
+++ b/fpga/usrp2/top/E1x0/E1x0.ucf
diff --git a/fpga/usrp2/top/E1x0/u1e.v b/fpga/usrp2/top/E1x0/E1x0.v
index 903ef7a6f..e7b0a4e00 100644
--- a/fpga/usrp2/top/E1x0/u1e.v
+++ b/fpga/usrp2/top/E1x0/E1x0.v
@@ -1,5 +1,5 @@
//
-// Copyright 2011 Ettus Research LLC
+// Copyright 2011-2012 Ettus Research LLC
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -18,7 +18,7 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
-module u1e
+module E1x0
(input CLK_FPGA_P, input CLK_FPGA_N, // Diff
output [3:0] debug_led, output [31:0] debug, output [1:0] debug_clk,
input debug_pb, output FPGA_TXD, input FPGA_RXD,
@@ -52,13 +52,23 @@ module u1e
input PPS_IN
);
+ assign FPGA_TXD = 0; //dont care
+
// /////////////////////////////////////////////////////////////////////////
// Clocking
- wire clk_fpga;
+ wire clk_fpga;
+ wire reset;
+
+ reg async_reset;
+ always @(negedge EM_CLK) begin
+ async_reset <= ~EM_NCS6 && ~EM_NWE && (EM_A[9:2] == 8'hff) && EM_D[0];
+ end
IBUFGDS #(.IOSTANDARD("LVDS_33"), .DIFF_TERM("TRUE"))
clk_fpga_pin (.O(clk_fpga),.I(CLK_FPGA_P),.IB(CLK_FPGA_N));
+ reset_sync reset_sync(.clk(clk_fpga), .reset_in(async_reset), .reset_out(reset));
+
// /////////////////////////////////////////////////////////////////////////
// UART level conversion
assign fpga_txd1 = overo_txd1;
@@ -73,12 +83,12 @@ module u1e
assign miso = (~db_sen_tx & db_miso_tx) | (~db_sen_rx & db_miso_rx) |
(~sen_codec & miso_codec) | (~cgen_sen_b & cgen_miso);
- //assign the aux spi to the cgen (bypasses wishbone)
+ //assign the aux spi to the cgen (bypasses control fifo)
assign cgen_sclk = overo_gpio65;
assign cgen_sen_b = overo_gpio128;
assign cgen_mosi = overo_gpio145;
- wire proc_int; //re-purpose gpio for interrupt when we are not using aux spi
- assign overo_gpio147 = (cgen_sen_b == 1'b0)? cgen_miso : proc_int;
+ wire has_resp; //re-purpose gpio for interrupt when we are not using aux spi
+ assign overo_gpio147 = (cgen_sen_b == 1'b0)? cgen_miso : has_resp;
wire _cgen_sen_b;
//assign cgen_sen_b = _cgen_sen_b; //replaced by aux spi
@@ -121,29 +131,66 @@ module u1e
.D1(1'b1), // 1-bit data input (associated with C1)
.R(1'b0), // 1-bit reset input
.S(1'b0)); // 1-bit set input
-
+
// /////////////////////////////////////////////////////////////////////////
- // Main U1E Core
- u1e_core u1e_core(.clk_fpga(clk_fpga), .rst_fpga(~debug_pb),
- .debug_led(debug_led), .debug(debug), .debug_clk(debug_clk),
- .debug_txd(FPGA_TXD), .debug_rxd(FPGA_RXD),
- .EM_CLK(EM_CLK), .EM_D(EM_D), .EM_A(EM_A), .EM_NBE(EM_NBE),
- .EM_WAIT0(EM_WAIT0), .EM_NCS4(EM_NCS4), .EM_NCS5(EM_NCS5),
- .EM_NCS6(EM_NCS6), .EM_NWE(EM_NWE), .EM_NOE(EM_NOE),
- .db_sda(db_sda), .db_scl(db_scl),
- .sclk(sclk), .sen({_cgen_sen_b,sen_codec,db_sen_tx,db_sen_rx}), .mosi(mosi), .miso(miso),
- .cgen_st_status(cgen_st_status), .cgen_st_ld(cgen_st_ld),.cgen_st_refmon(cgen_st_refmon),
- .cgen_sync_b(cgen_sync_b), .cgen_ref_sel(cgen_ref_sel),
- .tx_have_space(overo_gpio144),
- .rx_have_data(overo_gpio146),
- .io_tx(io_tx), .io_rx(io_rx),
- .tx_i(tx_i), .tx_q(tx_q),
- .rx_i(DA), .rx_q(DB),
- .pps_in(PPS_IN), .proc_int(proc_int) );
+ // Main Core
+ wire [35:0] rx_data, tx_data, ctrl_data, resp_data;
+ wire rx_src_rdy, rx_dst_rdy, tx_src_rdy, tx_dst_rdy, resp_src_rdy, resp_dst_rdy, ctrl_src_rdy, ctrl_dst_rdy;
+ wire dsp_rx_run, dsp_tx_run;
+ wire [7:0] sen8;
+ assign {_cgen_sen_b,sen_codec,db_sen_tx,db_sen_rx} = sen8[3:0];
+ wire [31:0] core_debug;
+
+ assign debug_led = ~{PPS_IN, dsp_tx_run, dsp_rx_run, cgen_st_ld};
+ wire cgen_sync;
+ assign { cgen_sync_b, cgen_ref_sel } = {~cgen_sync, 1'b1};
+
+ u1plus_core #(
+ .NUM_RX_DSPS(2),
+ .DSP_RX_XTRA_FIFOSIZE(10),
+ .DSP_TX_XTRA_FIFOSIZE(10),
+ .USE_PACKET_PADDER(0)
+ ) core(
+ .clk(clk_fpga), .reset(reset),
+ .debug(core_debug), .debug_clk(debug_clk),
+
+ .rx_data(rx_data), .rx_src_rdy(rx_src_rdy), .rx_dst_rdy(rx_dst_rdy),
+ .tx_data(tx_data), .tx_src_rdy(tx_src_rdy), .tx_dst_rdy(tx_dst_rdy),
+ .ctrl_data(ctrl_data), .ctrl_src_rdy(ctrl_src_rdy), .ctrl_dst_rdy(ctrl_dst_rdy),
+ .resp_data(resp_data), .resp_src_rdy(resp_src_rdy), .resp_dst_rdy(resp_dst_rdy),
+
+ .dsp_rx_run(dsp_rx_run), .dsp_tx_run(dsp_tx_run),
+ .clock_sync(cgen_sync),
+
+ .db_sda(db_sda), .db_scl(db_scl),
+ .sclk(sclk), .sen(sen8), .mosi(mosi), .miso(miso),
+ .io_tx(io_tx), .io_rx(io_rx),
+ .tx_i(tx_i), .tx_q(tx_q),
+ .rx_i(DA), .rx_q(DB),
+ .pps_in(PPS_IN) );
// /////////////////////////////////////////////////////////////////////////
- // Local Debug
- // assign debug_clk = {clk_fpga, clk_2x };
- // assign debug = { TXSYNC, TXBLANK, TX };
-
-endmodule // u1e
+ // Interface between GPMC/host
+ wire [31:0] gpmc_debug;
+
+ gpmc #(.TXFIFOSIZE(13), .RXFIFOSIZE(13))
+ gpmc (.arst(async_reset),
+ .EM_CLK(EM_CLK), .EM_D(EM_D), .EM_A(EM_A), .EM_NBE(EM_NBE),
+ .EM_WAIT0(EM_WAIT0), .EM_NCS4(EM_NCS4), .EM_NCS6(EM_NCS6), .EM_NWE(EM_NWE),
+ .EM_NOE(EM_NOE),
+
+ .rx_have_data(overo_gpio146), .tx_have_space(overo_gpio144),
+ .resp_have_data(has_resp),
+
+ .fifo_clk(clk_fpga), .fifo_rst(reset),
+ .rx_data(rx_data), .rx_src_rdy(rx_src_rdy), .rx_dst_rdy(rx_dst_rdy),
+ .tx_data(tx_data), .tx_src_rdy(tx_src_rdy), .tx_dst_rdy(tx_dst_rdy),
+ .ctrl_data(ctrl_data), .ctrl_src_rdy(ctrl_src_rdy), .ctrl_dst_rdy(ctrl_dst_rdy),
+ .resp_data(resp_data), .resp_src_rdy(resp_src_rdy), .resp_dst_rdy(resp_dst_rdy),
+
+ .debug(gpmc_debug));
+
+ //assign debug = gpmc_debug;
+ assign debug = core_debug;
+
+endmodule // E1x0
diff --git a/fpga/usrp2/top/E1x0/Makefile.E100 b/fpga/usrp2/top/E1x0/Makefile.E100
index 3ba7e1031..92334d987 100644
--- a/fpga/usrp2/top/E1x0/Makefile.E100
+++ b/fpga/usrp2/top/E1x0/Makefile.E100
@@ -5,7 +5,7 @@
##################################################
# Project Setup
##################################################
-TOP_MODULE = u1e
+TOP_MODULE = E1x0
BUILD_DIR = $(abspath build$(ISE)-E100)
# set me in a custom makefile
@@ -48,9 +48,9 @@ simulator "ISE Simulator (VHDL/Verilog)" \
# Sources
##################################################
TOP_SRCS = \
-u1e_core.v \
-u1e.v \
-u1e.ucf \
+../B100/u1plus_core.v \
+E1x0.v \
+E1x0.ucf \
timing.ucf
SOURCES = $(abspath $(TOP_SRCS)) $(FIFO_SRCS) \
diff --git a/fpga/usrp2/top/E1x0/Makefile.E110 b/fpga/usrp2/top/E1x0/Makefile.E110
index 89e51b523..e5be8d2fa 100644
--- a/fpga/usrp2/top/E1x0/Makefile.E110
+++ b/fpga/usrp2/top/E1x0/Makefile.E110
@@ -5,7 +5,7 @@
##################################################
# Project Setup
##################################################
-TOP_MODULE = u1e
+TOP_MODULE = E1x0
BUILD_DIR = $(abspath build$(ISE)-E110)
# set me in a custom makefile
@@ -48,9 +48,9 @@ simulator "ISE Simulator (VHDL/Verilog)" \
# Sources
##################################################
TOP_SRCS = \
-u1e_core.v \
-u1e.v \
-u1e.ucf \
+../B100/u1plus_core.v \
+E1x0.v \
+E1x0.ucf \
timing.ucf
SOURCES = $(abspath $(TOP_SRCS)) $(FIFO_SRCS) \
diff --git a/fpga/usrp2/top/E1x0/core_compile b/fpga/usrp2/top/E1x0/core_compile
index 14e138fa3..ab992f29d 100755
--- a/fpga/usrp2/top/E1x0/core_compile
+++ b/fpga/usrp2/top/E1x0/core_compile
@@ -1,3 +1,3 @@
-iverilog -Wall -y. -y ../../control_lib/ -y ../../custom/ -y ../../fifo/ -y ../../gpmc/ -y ../../models/ -y ../../sdr_lib/ -y ../../coregen/ -y ../../vrt/ -y ../../opencores/i2c/rtl/verilog/ -y ../../opencores/spi/rtl/verilog/ -y ../../timing/ -y ../../opencores/8b10b/ -I ../../opencores/spi/rtl/verilog/ -I ../../opencores/i2c/rtl/verilog/ -y ../../simple_gemac -y $XILINX/verilog/src/unisims u1e_core.v 2>&1 | grep -v timescale | grep -v coregen | grep -v models
+iverilog -Wall -y. -y ../../control_lib/ -y ../../custom/ -y ../../fifo/ -y ../../gpmc/ -y ../../models/ -y ../../sdr_lib/ -y ../../coregen/ -y ../../vrt/ -y ../../opencores/i2c/rtl/verilog/ -y ../../opencores/spi/rtl/verilog/ -y ../../timing/ -y ../../opencores/8b10b/ -I ../../opencores/spi/rtl/verilog/ -I ../../opencores/i2c/rtl/verilog/ -y ../B100 -y $XILINX/verilog/src/unisims E1x0.v 2>&1 | grep -v timescale | grep -v coregen | grep -v models
diff --git a/fpga/usrp2/top/E1x0/timing.ucf b/fpga/usrp2/top/E1x0/timing.ucf
index 47c250c2f..7d3d9e090 100644
--- a/fpga/usrp2/top/E1x0/timing.ucf
+++ b/fpga/usrp2/top/E1x0/timing.ucf
@@ -3,25 +3,21 @@ NET "CLK_FPGA_P" TNM_NET = "CLK_FPGA_P";
TIMESPEC "TS_clk_fpga_p" = PERIOD "CLK_FPGA_P" 15625 ps HIGH 50 %;
NET "EM_CLK" TNM_NET = "EM_CLK";
-TIMESPEC "TS_em_clk" = PERIOD "EM_CLK" 12048 ps HIGH 50 %;
+TIMESPEC "TS_em_clk" = PERIOD "EM_CLK" 18867 ps HIGH 50 %;
#constrain GPMC IO
-NET "EM_D<*>" MAXDELAY = 5.5 ns;
-NET "EM_A<*>" MAXDELAY = 5.5 ns;
-NET "EM_NBE<*>" MAXDELAY = 5.5 ns;
-NET "EM_NCS4" MAXDELAY = 5.5 ns;
-NET "EM_NCS6" MAXDELAY = 5.5 ns;
-NET "EM_NWE" MAXDELAY = 5.5 ns;
-NET "EM_NOE" MAXDELAY = 5.5 ns;
+INST "EM_D<*>" TNM = gpmc_net_out;
+INST "EM_D<*>" TNM = gpmc_net;
+INST "EM_A<*>" TNM = gpmc_net;
+INST "EM_NCS4" TNM = gpmc_net;
+INST "EM_NCS6" TNM = gpmc_net;
+INST "EM_NWE" TNM = gpmc_net;
+INST "EM_NOE" TNM = gpmc_net;
+
+TIMEGRP "gpmc_net" OFFSET = IN 6 ns VALID 12 ns BEFORE "EM_CLK" FALLING;
+TIMEGRP "gpmc_net_out" OFFSET = OUT 14 ns AFTER "EM_CLK" RISING; //2 clock cyc per read
#constrain interrupt lines
NET "overo_gpio144" MAXDELAY = 5.5 ns; #have space
NET "overo_gpio146" MAXDELAY = 5.5 ns; #have data
NET "overo_gpio147" MAXDELAY = 5.5 ns; #have msg/aux spi miso
-
-#NET "adc_a<*>" TNM_NET = ADC_DATA_GRP;
-#NET "adc_b<*>" TNM_NET = ADC_DATA_GRP;
-#TIMEGRP "ADC_DATA_GRP" OFFSET = IN 1 ns VALID 5 ns BEFORE "clk_fpga_p" RISING;
-
-#NET "adc_a<*>" OFFSET = IN 1 ns VALID 5 ns BEFORE "clk_fpga_p" RISING;
-#NET "adc_b<*>" OFFSET = IN 1 ns VALID 5 ns BEFORE "clk_fpga_p" RISING;
diff --git a/fpga/usrp2/top/E1x0/u1e_core.v b/fpga/usrp2/top/E1x0/u1e_core.v
deleted file mode 100644
index bd19d6076..000000000
--- a/fpga/usrp2/top/E1x0/u1e_core.v
+++ /dev/null
@@ -1,494 +0,0 @@
-//
-// Copyright 2011-2012 Ettus Research LLC
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see <http://www.gnu.org/licenses/>.
-//
-
-
-
-module u1e_core
- (input clk_fpga, input rst_fpga,
- output [3:0] debug_led, output [31:0] debug, output [1:0] debug_clk,
- output debug_txd, input debug_rxd,
-
- // GPMC
- input EM_CLK, inout [15:0] EM_D, input [10:1] EM_A, input [1:0] EM_NBE,
- input EM_WAIT0, input EM_NCS4, input EM_NCS5, input EM_NCS6,
- input EM_NWE, input EM_NOE,
-
- inout db_sda, inout db_scl,
- output sclk, output [15:0] sen, output mosi, input miso,
-
- input cgen_st_status, input cgen_st_ld, input cgen_st_refmon, output cgen_sync_b, output cgen_ref_sel,
- output tx_have_space, output rx_have_data,
- inout [15:0] io_tx, inout [15:0] io_rx,
- output [13:0] tx_i, output [13:0] tx_q,
- input [11:0] rx_i, input [11:0] rx_q,
-
- input pps_in, output reg proc_int
- );
-
- localparam TXFIFOSIZE = 13;
- localparam RXFIFOSIZE = 13;
-
- // 64 total regs in address space
- localparam SR_RX_CTRL0 = 0; // 9 regs (+0 to +8)
- localparam SR_RX_DSP0 = 10; // 4 regs (+0 to +3)
- localparam SR_RX_CTRL1 = 16; // 9 regs (+0 to +8)
- localparam SR_RX_DSP1 = 26; // 4 regs (+0 to +3)
- localparam SR_ERR_CTRL = 30; // 1 reg
- localparam SR_TX_CTRL = 32; // 4 regs (+0 to +3)
- localparam SR_TX_DSP = 38; // 3 regs (+0 to +2)
-
- localparam SR_TIME64 = 42; // 6 regs (+0 to +5)
- localparam SR_RX_FRONT = 48; // 5 regs (+0 to +4)
- localparam SR_TX_FRONT = 54; // 5 regs (+0 to +4)
-
- localparam SR_REG_TEST32 = 60; // 1 reg
- localparam SR_CLEAR_FIFO = 61; // 1 reg
- localparam SR_GLOBAL_RESET = 63; // 1 reg
- localparam SR_USER_REGS = 64; // 2 regs
-
- localparam SR_GPIO = 128; // 5 regs
-
- wire wb_clk = clk_fpga;
- wire wb_rst, global_reset;
-
- wire pps_int;
- wire [63:0] vita_time, vita_time_pps;
- reg [15:0] reg_cgen_ctrl, reg_test, xfer_rate;
- wire [7:0] test_rate;
- wire [3:0] test_ctrl;
-
- wire [7:0] set_addr, set_addr_user;
- wire [31:0] set_data, set_data_user;
- wire set_stb, set_stb_user;
-
- wire [31:0] debug_vt;
- wire rx_overrun_dsp0, rx_overrun_dsp1, rx_overrun_gpmc, tx_underrun_dsp, tx_underrun_gpmc;
- wire rx_overrun = rx_overrun_gpmc | rx_overrun_dsp0 | rx_overrun_dsp1;
- wire tx_underrun = tx_underrun_gpmc | tx_underrun_dsp;
-
- setting_reg #(.my_addr(SR_GLOBAL_RESET), .width(1)) sr_reset
- (.clk(wb_clk),.rst(wb_rst),.strobe(set_stb),.addr(set_addr),
- .in(set_data),.out(),.changed(global_reset));
-
- reset_sync reset_sync(.clk(wb_clk), .reset_in(rst_fpga | global_reset), .reset_out(wb_rst));
-
- // /////////////////////////////////////////////////////////////////////////////////////
- // GPMC Slave to Wishbone Master
- localparam dw = 16;
- localparam aw = 11;
- localparam sw = 2;
-
- wire [dw-1:0] m0_dat_mosi, m0_dat_miso;
- wire [aw-1:0] m0_adr;
- wire [sw-1:0] m0_sel;
- wire m0_cyc, m0_stb, m0_we, m0_ack, m0_err, m0_rty;
-
- wire [31:0] debug_gpmc;
-
- wire [35:0] tx_data, rx_data, tx_err_data;
- wire tx_src_rdy, tx_dst_rdy, rx_src_rdy, rx_dst_rdy,
- tx_err_src_rdy, tx_err_dst_rdy;
-
- wire clear_fifo;
-
- setting_reg #(.my_addr(SR_CLEAR_FIFO), .width(1)) sr_clear_fifo
- (.clk(wb_clk),.rst(wb_rst),.strobe(set_stb),.addr(set_addr),
- .in(set_data),.out(),.changed(clear_fifo));
-
- wire run_rx0, run_rx1;
-
- gpmc #(.TXFIFOSIZE(TXFIFOSIZE), .RXFIFOSIZE(RXFIFOSIZE))
- gpmc (.arst(wb_rst),
- .EM_CLK(EM_CLK), .EM_D(EM_D), .EM_A(EM_A), .EM_NBE(EM_NBE),
- .EM_WAIT0(EM_WAIT0), .EM_NCS4(EM_NCS4), .EM_NCS6(EM_NCS6), .EM_NWE(EM_NWE),
- .EM_NOE(EM_NOE),
-
- .rx_have_data(rx_have_data), .tx_have_space(tx_have_space),
-
- .wb_clk(wb_clk), .wb_rst(wb_rst),
- .wb_adr_o(m0_adr), .wb_dat_mosi(m0_dat_mosi), .wb_dat_miso(m0_dat_miso),
- .wb_sel_o(m0_sel), .wb_cyc_o(m0_cyc), .wb_stb_o(m0_stb), .wb_we_o(m0_we),
- .wb_ack_i(m0_ack),
-
- .fifo_clk(wb_clk), .fifo_rst(wb_rst), .clear_tx(clear_fifo), .clear_rx(clear_fifo),
- .tx_data_o(tx_data), .tx_src_rdy_o(tx_src_rdy), .tx_dst_rdy_i(tx_dst_rdy),
- .rx_data_i(rx_data), .rx_src_rdy_i(rx_src_rdy), .rx_dst_rdy_o(rx_dst_rdy),
-
- .tx_underrun(tx_underrun_gpmc), .rx_overrun(rx_overrun_gpmc),
-
- .test_rate(test_rate), .test_ctrl(test_ctrl),
- .debug(debug_gpmc));
-
- wire rx_src_rdy_int, rx_dst_rdy_int, tx_src_rdy_int, tx_dst_rdy_int;
-
- wire [31:0] debug_rx_dsp, vrc_debug, vrf_debug, vr_debug;
-
- // /////////////////////////////////////////////////////////////////////////
- // RX ADC Frontend, does IQ Balance, DC Offset, muxing
-
- wire [23:0] rx_fe_i, rx_fe_q; // 24 bits is total overkill here, but it matches u2/u2p
-
- rx_frontend #(.BASE(SR_RX_FRONT)) rx_frontend
- (.clk(wb_clk),.rst(wb_rst),
- .set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
- .adc_a({rx_i,4'b00}),.adc_ovf_a(0),
- .adc_b({rx_q,4'b00}),.adc_ovf_b(0),
- .i_out(rx_fe_i), .q_out(rx_fe_q), .run(run_rx0 | run_rx1), .debug());
-
- // /////////////////////////////////////////////////////////////////////////
- // DSP RX 0
-
- wire [31:0] sample_rx0;
- wire strobe_rx0, clear_rx0;
- wire [35:0] vita_rx_data0;
- wire vita_rx_src_rdy0, vita_rx_dst_rdy0;
-
- ddc_chain #(.BASE(SR_RX_DSP0), .DSPNO(0)) ddc_chain0
- (.clk(wb_clk), .rst(wb_rst), .clr(clear_rx0),
- .set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
- .set_stb_user(set_stb_user), .set_addr_user(set_addr_user), .set_data_user(set_data_user),
- .rx_fe_i(rx_fe_i),.rx_fe_q(rx_fe_q),
- .sample(sample_rx0), .run(run_rx0), .strobe(strobe_rx0),
- .debug() );
-
- vita_rx_chain #(.BASE(SR_RX_CTRL0), .UNIT(0), .FIFOSIZE(10), .PROT_ENG_FLAGS(0), .DSP_NUMBER(0)) vita_rx_chain0
- (.clk(wb_clk),.reset(wb_rst),
- .set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
- .set_stb_user(set_stb_user), .set_addr_user(set_addr_user), .set_data_user(set_data_user),
- .vita_time(vita_time), .overrun(rx_overrun_dsp0),
- .sample(sample_rx0), .run(run_rx0), .strobe(strobe_rx0), .clear_o(clear_rx0),
- .rx_data_o(vita_rx_data0), .rx_dst_rdy_i(vita_rx_dst_rdy0), .rx_src_rdy_o(vita_rx_src_rdy0),
- .debug() );
-
- // /////////////////////////////////////////////////////////////////////////
- // DSP RX 1
-
- wire [31:0] sample_rx1;
- wire strobe_rx1, clear_rx1;
- wire [35:0] vita_rx_data1;
- wire vita_rx_src_rdy1, vita_rx_dst_rdy1;
-
- ddc_chain #(.BASE(SR_RX_DSP1), .DSPNO(1)) ddc_chain1
- (.clk(wb_clk),.rst(wb_rst), .clr(clear_rx1),
- .set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
- .set_stb_user(set_stb_user), .set_addr_user(set_addr_user), .set_data_user(set_data_user),
- .rx_fe_i(rx_fe_i),.rx_fe_q(rx_fe_q),
- .sample(sample_rx1), .run(run_rx1), .strobe(strobe_rx1),
- .debug() );
-
- vita_rx_chain #(.BASE(SR_RX_CTRL1), .UNIT(1), .FIFOSIZE(10), .PROT_ENG_FLAGS(0), .DSP_NUMBER(1)) vita_rx_chain1
- (.clk(wb_clk),.reset(wb_rst),
- .set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
- .set_stb_user(set_stb_user), .set_addr_user(set_addr_user), .set_data_user(set_data_user),
- .vita_time(vita_time), .overrun(rx_overrun_dsp1),
- .sample(sample_rx1), .run(run_rx1), .strobe(strobe_rx1), .clear_o(clear_rx1),
- .rx_data_o(vita_rx_data1), .rx_dst_rdy_i(vita_rx_dst_rdy1), .rx_src_rdy_o(vita_rx_src_rdy1),
- .debug() );
-
- // /////////////////////////////////////////////////////////////////////////
- // RX Stream muxing
-
- fifo36_mux #(.prio(0)) mux_data_streams
- (.clk(wb_clk), .reset(wb_rst), .clear(clear_fifo),
- .data0_i(vita_rx_data0), .src0_rdy_i(vita_rx_src_rdy0), .dst0_rdy_o(vita_rx_dst_rdy0),
- .data1_i(vita_rx_data1), .src1_rdy_i(vita_rx_src_rdy1), .dst1_rdy_o(vita_rx_dst_rdy1),
- .data_o(rx_data), .src_rdy_o(rx_src_rdy), .dst_rdy_i(rx_dst_rdy));
-
- // ///////////////////////////////////////////////////////////////////////////////////
- // DSP TX
-
- wire run_tx;
- wire [23:0] tx_fe_i, tx_fe_q;
- wire [31:0] sample_tx;
- wire strobe_tx, clear_tx;
-
- vita_tx_chain #(.BASE(SR_TX_CTRL), .FIFOSIZE(10), .POST_ENGINE_FIFOSIZE(11),
- .REPORT_ERROR(1), .DO_FLOW_CONTROL(0),
- .PROT_ENG_FLAGS(0), .USE_TRANS_HEADER(0),
- .DSP_NUMBER(0))
- vita_tx_chain
- (.clk(wb_clk), .reset(wb_rst),
- .set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
- .set_stb_user(set_stb_user), .set_addr_user(set_addr_user), .set_data_user(set_data_user),
- .vita_time(vita_time),
- .tx_data_i(tx_data), .tx_src_rdy_i(tx_src_rdy), .tx_dst_rdy_o(tx_dst_rdy),
- .err_data_o(tx_err_data), .err_src_rdy_o(tx_err_src_rdy), .err_dst_rdy_i(tx_err_dst_rdy),
- .sample(sample_tx), .strobe(strobe_tx),
- .underrun(tx_underrun_dsp), .run(run_tx), .clear_o(clear_tx),
- .debug(debug_vt));
-
- duc_chain #(.BASE(SR_TX_DSP), .DSPNO(0)) duc_chain
- (.clk(wb_clk), .rst(wb_rst), .clr(clear_tx),
- .set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
- .set_stb_user(set_stb_user), .set_addr_user(set_addr_user), .set_data_user(set_data_user),
- .tx_fe_i(tx_fe_i),.tx_fe_q(tx_fe_q),
- .sample(sample_tx), .run(run_tx), .strobe(strobe_tx),
- .debug() );
-
- tx_frontend #(.BASE(SR_TX_FRONT), .WIDTH_OUT(14)) tx_frontend
- (.clk(wb_clk), .rst(wb_rst),
- .set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
- .tx_i(tx_fe_i), .tx_q(tx_fe_q), .run(1'b1),
- .dac_a(tx_i), .dac_b(tx_q));
-
- // /////////////////////////////////////////////////////////////////////////////////////
- // Wishbone Intercon, single master
- wire [dw-1:0] s0_dat_mosi, s1_dat_mosi, s0_dat_miso, s1_dat_miso, s2_dat_mosi, s3_dat_mosi, s2_dat_miso, s3_dat_miso,
- s4_dat_mosi, s5_dat_mosi, s4_dat_miso, s5_dat_miso, s6_dat_mosi, s7_dat_mosi, s6_dat_miso, s7_dat_miso,
- s8_dat_mosi, s9_dat_mosi, s8_dat_miso, s9_dat_miso, sa_dat_mosi, sb_dat_mosi, sa_dat_miso, sb_dat_miso,
- sc_dat_mosi, sd_dat_mosi, sc_dat_miso, sd_dat_miso, se_dat_mosi, sf_dat_mosi, se_dat_miso, sf_dat_miso;
- wire [aw-1:0] s0_adr,s1_adr,s2_adr,s3_adr,s4_adr,s5_adr,s6_adr,s7_adr;
- wire [aw-1:0] s8_adr,s9_adr,sa_adr,sb_adr,sc_adr, sd_adr, se_adr, sf_adr;
- wire [sw-1:0] s0_sel,s1_sel,s2_sel,s3_sel,s4_sel,s5_sel,s6_sel,s7_sel;
- wire [sw-1:0] s8_sel,s9_sel,sa_sel,sb_sel,sc_sel, sd_sel, se_sel, sf_sel;
- wire s0_ack,s1_ack,s2_ack,s3_ack,s4_ack,s5_ack,s6_ack,s7_ack;
- wire s8_ack,s9_ack,sa_ack,sb_ack,sc_ack, sd_ack, se_ack, sf_ack;
- wire s0_stb,s1_stb,s2_stb,s3_stb,s4_stb,s5_stb,s6_stb,s7_stb;
- wire s8_stb,s9_stb,sa_stb,sb_stb,sc_stb, sd_stb, se_stb, sf_stb;
- wire s0_cyc,s1_cyc,s2_cyc,s3_cyc,s4_cyc,s5_cyc,s6_cyc,s7_cyc;
- wire s8_cyc,s9_cyc,sa_cyc,sb_cyc,sc_cyc, sd_cyc, se_cyc, sf_cyc;
- wire s0_we,s1_we,s2_we,s3_we,s4_we,s5_we,s6_we,s7_we;
- wire s8_we,s9_we,sa_we,sb_we,sc_we,sd_we, se_we, sf_we;
-
- wb_1master #(.dw(dw), .aw(aw), .sw(sw), .decode_w(4),
- .s0_addr(4'h0), .s0_mask(4'hF), // Misc Regs
- .s1_addr(4'h1), .s1_mask(4'hF), // Unused
- .s2_addr(4'h2), .s2_mask(4'hF), // SPI
- .s3_addr(4'h3), .s3_mask(4'hF), // I2C
- .s4_addr(4'h4), .s4_mask(4'hF), // Unused
- .s5_addr(4'h5), .s5_mask(4'hF), // Unused on B1x0, Async Msg on E1x0
- .s6_addr(4'h6), .s6_mask(4'hF), // Unused
- .s7_addr(4'h7), .s7_mask(4'hF), // Readback MUX
- .s8_addr(4'h8), .s8_mask(4'h8), // Setting Regs -- slave 8 is 8 slaves wide
- // slaves 9-f alias to slave 1, all are unused
- .s9_addr(4'h1), .s9_mask(4'hF),
- .sa_addr(4'h1), .sa_mask(4'hF), .sb_addr(4'h1), .sb_mask(4'hF),
- .sc_addr(4'h1), .sc_mask(4'hF), .sd_addr(4'h1), .sd_mask(4'hF),
- .se_addr(4'h1), .se_mask(4'hF), .sf_addr(4'h1), .sf_mask(4'hF))
- wb_1master
- (.clk_i(wb_clk),.rst_i(wb_rst),
- .m0_dat_o(m0_dat_miso),.m0_ack_o(m0_ack),.m0_err_o(m0_err),.m0_rty_o(m0_rty),.m0_dat_i(m0_dat_mosi),
- .m0_adr_i(m0_adr),.m0_sel_i(m0_sel),.m0_we_i(m0_we),.m0_cyc_i(m0_cyc),.m0_stb_i(m0_stb),
- .s0_dat_o(s0_dat_mosi),.s0_adr_o(s0_adr),.s0_sel_o(s0_sel),.s0_we_o(s0_we),.s0_cyc_o(s0_cyc),.s0_stb_o(s0_stb),
- .s0_dat_i(s0_dat_miso),.s0_ack_i(s0_ack),.s0_err_i(0),.s0_rty_i(0),
- .s1_dat_o(s1_dat_mosi),.s1_adr_o(s1_adr),.s1_sel_o(s1_sel),.s1_we_o(s1_we),.s1_cyc_o(s1_cyc),.s1_stb_o(s1_stb),
- .s1_dat_i(s1_dat_miso),.s1_ack_i(s1_ack),.s1_err_i(0),.s1_rty_i(0),
- .s2_dat_o(s2_dat_mosi),.s2_adr_o(s2_adr),.s2_sel_o(s2_sel),.s2_we_o(s2_we),.s2_cyc_o(s2_cyc),.s2_stb_o(s2_stb),
- .s2_dat_i(s2_dat_miso),.s2_ack_i(s2_ack),.s2_err_i(0),.s2_rty_i(0),
- .s3_dat_o(s3_dat_mosi),.s3_adr_o(s3_adr),.s3_sel_o(s3_sel),.s3_we_o(s3_we),.s3_cyc_o(s3_cyc),.s3_stb_o(s3_stb),
- .s3_dat_i(s3_dat_miso),.s3_ack_i(s3_ack),.s3_err_i(0),.s3_rty_i(0),
- .s4_dat_o(s4_dat_mosi),.s4_adr_o(s4_adr),.s4_sel_o(s4_sel),.s4_we_o(s4_we),.s4_cyc_o(s4_cyc),.s4_stb_o(s4_stb),
- .s4_dat_i(s4_dat_miso),.s4_ack_i(s4_ack),.s4_err_i(0),.s4_rty_i(0),
- .s5_dat_o(s5_dat_mosi),.s5_adr_o(s5_adr),.s5_sel_o(s5_sel),.s5_we_o(s5_we),.s5_cyc_o(s5_cyc),.s5_stb_o(s5_stb),
- .s5_dat_i(s5_dat_miso),.s5_ack_i(s5_ack),.s5_err_i(0),.s5_rty_i(0),
- .s6_dat_o(s6_dat_mosi),.s6_adr_o(s6_adr),.s6_sel_o(s6_sel),.s6_we_o(s6_we),.s6_cyc_o(s6_cyc),.s6_stb_o(s6_stb),
- .s6_dat_i(s6_dat_miso),.s6_ack_i(s6_ack),.s6_err_i(0),.s6_rty_i(0),
- .s7_dat_o(s7_dat_mosi),.s7_adr_o(s7_adr),.s7_sel_o(s7_sel),.s7_we_o(s7_we),.s7_cyc_o(s7_cyc),.s7_stb_o(s7_stb),
- .s7_dat_i(s7_dat_miso),.s7_ack_i(s7_ack),.s7_err_i(0),.s7_rty_i(0),
- .s8_dat_o(s8_dat_mosi),.s8_adr_o(s8_adr),.s8_sel_o(s8_sel),.s8_we_o(s8_we),.s8_cyc_o(s8_cyc),.s8_stb_o(s8_stb),
- .s8_dat_i(s8_dat_miso),.s8_ack_i(s8_ack),.s8_err_i(0),.s8_rty_i(0),
- .s9_dat_o(s9_dat_mosi),.s9_adr_o(s9_adr),.s9_sel_o(s9_sel),.s9_we_o(s9_we),.s9_cyc_o(s9_cyc),.s9_stb_o(s9_stb),
- .s9_dat_i(s9_dat_miso),.s9_ack_i(s9_ack),.s9_err_i(0),.s9_rty_i(0),
- .sa_dat_o(sa_dat_mosi),.sa_adr_o(sa_adr),.sa_sel_o(sa_sel),.sa_we_o(sa_we),.sa_cyc_o(sa_cyc),.sa_stb_o(sa_stb),
- .sa_dat_i(sa_dat_miso),.sa_ack_i(sa_ack),.sa_err_i(0),.sa_rty_i(0),
- .sb_dat_o(sb_dat_mosi),.sb_adr_o(sb_adr),.sb_sel_o(sb_sel),.sb_we_o(sb_we),.sb_cyc_o(sb_cyc),.sb_stb_o(sb_stb),
- .sb_dat_i(sb_dat_miso),.sb_ack_i(sb_ack),.sb_err_i(0),.sb_rty_i(0),
- .sc_dat_o(sc_dat_mosi),.sc_adr_o(sc_adr),.sc_sel_o(sc_sel),.sc_we_o(sc_we),.sc_cyc_o(sc_cyc),.sc_stb_o(sc_stb),
- .sc_dat_i(sc_dat_miso),.sc_ack_i(sc_ack),.sc_err_i(0),.sc_rty_i(0),
- .sd_dat_o(sd_dat_mosi),.sd_adr_o(sd_adr),.sd_sel_o(sd_sel),.sd_we_o(sd_we),.sd_cyc_o(sd_cyc),.sd_stb_o(sd_stb),
- .sd_dat_i(sd_dat_miso),.sd_ack_i(sd_ack),.sd_err_i(0),.sd_rty_i(0),
- .se_dat_o(se_dat_mosi),.se_adr_o(se_adr),.se_sel_o(se_sel),.se_we_o(se_we),.se_cyc_o(se_cyc),.se_stb_o(se_stb),
- .se_dat_i(se_dat_miso),.se_ack_i(se_ack),.se_err_i(0),.se_rty_i(0),
- .sf_dat_o(sf_dat_mosi),.sf_adr_o(sf_adr),.sf_sel_o(sf_sel),.sf_we_o(sf_we),.sf_cyc_o(sf_cyc),.sf_stb_o(sf_stb),
- .sf_dat_i(sf_dat_miso),.sf_ack_i(sf_ack),.sf_err_i(0),.sf_rty_i(0) );
-
- assign s1_ack = 0; assign s4_ack = 0; assign s6_ack = 0;
- assign s9_ack = 0; assign sa_ack = 0; assign sb_ack = 0;
- assign sc_ack = 0; assign sd_ack = 0; assign se_ack = 0; assign sf_ack = 0;
-
- // /////////////////////////////////////////////////////////////////////////////////////
- // Slave 0, Misc LEDs, Switches, controls
-
- localparam REG_CGEN_CTRL = 7'd4; // out
- localparam REG_CGEN_ST = 7'd6; // in
- localparam REG_TEST = 7'd8; // out
- localparam REG_XFER_RATE = 7'd14; // out
-
- always @(posedge wb_clk)
- if(wb_rst)
- begin
- reg_cgen_ctrl <= 2'b11;
- reg_test <= 0;
- xfer_rate <= 0;
- end
- else
- if(s0_cyc & s0_stb & s0_we)
- case(s0_adr[6:0])
- REG_CGEN_CTRL :
- reg_cgen_ctrl <= s0_dat_mosi;
- REG_TEST :
- reg_test <= s0_dat_mosi;
- REG_XFER_RATE :
- xfer_rate <= s0_dat_mosi;
- endcase // case (s0_adr[6:0])
-
- assign test_ctrl = xfer_rate[11:8];
- assign test_rate = xfer_rate[7:0];
-
- assign { debug_led[3:0] } = ~{1'b1, run_tx, run_rx0 | run_rx1, cgen_st_ld};
- assign { cgen_sync_b, cgen_ref_sel } = reg_cgen_ctrl;
-
- assign s0_dat_miso = (s0_adr[6:0] == REG_CGEN_CTRL) ? reg_cgen_ctrl :
- (s0_adr[6:0] == REG_CGEN_ST) ? {13'b0,cgen_st_status,cgen_st_ld,cgen_st_refmon} :
- (s0_adr[6:0] == REG_TEST) ? reg_test :
- 16'hBEEF;
-
- assign s0_ack = s0_stb & s0_cyc;
-
- // /////////////////////////////////////////////////////////////////////////////////////
- // Slave 2, SPI
-
- spi_top16 shared_spi
- (.wb_clk_i(wb_clk),.wb_rst_i(wb_rst),.wb_adr_i(s2_adr[4:0]),.wb_dat_i(s2_dat_mosi),
- .wb_dat_o(s2_dat_miso),.wb_sel_i(s2_sel),.wb_we_i(s2_we),.wb_stb_i(s2_stb),
- .wb_cyc_i(s2_cyc),.wb_ack_o(s2_ack),.wb_err_o(),.wb_int_o(),
- .ss_pad_o(sen), .sclk_pad_o(sclk), .mosi_pad_o(mosi), .miso_pad_i(miso) );
-
- // /////////////////////////////////////////////////////////////////////////
- // Slave 3, I2C
-
- wire scl_pad_i, scl_pad_o, scl_pad_oen_o, sda_pad_i, sda_pad_o, sda_pad_oen_o;
- i2c_master_top #(.ARST_LVL(1)) i2c
- (.wb_clk_i(wb_clk),.wb_rst_i(wb_rst),.arst_i(1'b0),
- .wb_adr_i(s3_adr[3:1]),.wb_dat_i(s3_dat_mosi[7:0]),.wb_dat_o(s3_dat_miso[7:0]),
- .wb_we_i(s3_we),.wb_stb_i(s3_stb),.wb_cyc_i(s3_cyc),
- .wb_ack_o(s3_ack),.wb_inta_o(),
- .scl_pad_i(scl_pad_i),.scl_pad_o(scl_pad_o),.scl_padoen_o(scl_pad_oen_o),
- .sda_pad_i(sda_pad_i),.sda_pad_o(sda_pad_o),.sda_padoen_o(sda_pad_oen_o) );
-
- assign s3_dat_miso[15:8] = 8'd0;
-
- // I2C -- Don't use external transistors for open drain, the FPGA implements this
- IOBUF scl_pin(.O(scl_pad_i), .IO(db_scl), .I(scl_pad_o), .T(scl_pad_oen_o));
- IOBUF sda_pin(.O(sda_pad_i), .IO(db_sda), .I(sda_pad_o), .T(sda_pad_oen_o));
-
- // /////////////////////////////////////////////////////////////////////////
- // GPIOs
-
- wire [31:0] gpio_readback;
-
- gpio_atr #(.BASE(SR_GPIO), .WIDTH(32))
- gpio_atr(.clk(wb_clk),.reset(wb_rst),
- .set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
- .rx(run_rx0 | run_rx1), .tx(run_tx),
- .gpio({io_tx,io_rx}), .gpio_readback(gpio_readback) );
-
- ////////////////////////////////////////////////////////////////////////////
- // FIFO to WB slave for async messages - Slave #5
-
- //signals between fifo and buffer module
- wire [35:0] _tx_err_data;
- wire _tx_err_src_rdy, _tx_err_dst_rdy;
-
- fifo_cascade #(.WIDTH(36), .SIZE(9/*512 lines plenty for short pkts*/)) err_fifo(
- .clk(wb_clk), .reset(wb_rst), .clear(wb_rst),
- .datain(tx_err_data), .src_rdy_i(tx_err_src_rdy), .dst_rdy_o(tx_err_dst_rdy),
- .dataout(_tx_err_data), .src_rdy_o(_tx_err_src_rdy), .dst_rdy_i(_tx_err_dst_rdy)
- );
-
- wire [31:0] err_status, err_data32;
- //the buffer is 32 bits, but the data is 16, so mux based on the addr bit
- assign s5_dat_miso = (s5_adr[1] == 1'b0)? err_data32[15:0] : err_data32[31:16];
-
- buffer_int2 #(.BASE(SR_ERR_CTRL), .BUF_SIZE(5)) fifo_to_wb(
- .clk(wb_clk), .rst(wb_rst),
- .set_stb(set_stb), .set_addr(set_addr), .set_data(set_data),
- .status(err_status),
- // Wishbone interface to RAM
- .wb_clk_i(wb_clk), .wb_rst_i(wb_rst),
- .wb_we_i(s5_we), .wb_stb_i(s5_stb),
- .wb_adr_i({5'b0,s5_adr}), .wb_dat_i({16'b0, s5_dat_mosi}),
- .wb_dat_o(err_data32), .wb_ack_o(s5_ack),
- // Write FIFO Interface
- .wr_data_i(_tx_err_data), .wr_ready_i(_tx_err_src_rdy), .wr_ready_o(_tx_err_dst_rdy),
- // Read FIFO Interface
- .rd_data_o(), .rd_ready_o(), .rd_ready_i(1'b0)
- );
-
- ////////////////////////////////////////////////////////////////////////////
- // Interrupts
-
- always @(posedge wb_clk)
- proc_int <= (|err_status[1:0]);
-
- // /////////////////////////////////////////////////////////////////////////
- // Settings Bus -- Slave #8 + 9
-
- // only have 64 regs, 32 bits each with current setup...
- settings_bus_16LE #(.AWIDTH(11),.RWIDTH(8)) settings_bus_16LE
- (.wb_clk(wb_clk),.wb_rst(wb_rst),.wb_adr_i(s8_adr),.wb_dat_i(s8_dat_mosi),
- .wb_stb_i(s8_stb),.wb_we_i(s8_we),.wb_ack_o(s8_ack),
- .strobe(set_stb),.addr(set_addr),.data(set_data) );
-
- user_settings #(.BASE(SR_USER_REGS)) user_settings
- (.clk(wb_clk),.rst(wb_rst),.set_stb(set_stb),
- .set_addr(set_addr),.set_data(set_data),
- .set_addr_user(set_addr_user),.set_data_user(set_data_user),
- .set_stb_user(set_stb_user) );
-
- // /////////////////////////////////////////////////////////////////////////
- // Readback mux 32 -- Slave #7
-
- //compatibility number -> increment when the fpga has been sufficiently altered
- localparam compat_num = {16'd9, 16'd3}; //major, minor
-
- wire [31:0] reg_test32;
-
- //this setting reg is persistent across resets, to check for fpga loaded
- setting_reg #(.my_addr(SR_REG_TEST32)) sr_reg_test32
- (.clk(wb_clk),.rst(/*wb_rst*/1'b0),.strobe(set_stb),.addr(set_addr),
- .in(set_data),.out(reg_test32),.changed());
-
- wb_readback_mux_16LE readback_mux_32
- (.wb_clk_i(wb_clk), .wb_rst_i(wb_rst), .wb_stb_i(s7_stb),
- .wb_adr_i({5'b0,s7_adr}), .wb_dat_o(s7_dat_miso), .wb_ack_o(s7_ack),
-
- .word00(vita_time[63:32]), .word01(vita_time[31:0]),
- .word02(vita_time_pps[63:32]), .word03(vita_time_pps[31:0]),
- .word04(reg_test32), .word05(err_status),
- .word06(compat_num), .word07(gpio_readback),
- .word08(32'b0), .word09(32'b0),
- .word10(32'b0), .word11(32'b0),
- .word12(32'b0), .word13(32'b0),
- .word14(32'b0), .word15(32'b0)
- );
-
- // /////////////////////////////////////////////////////////////////////////
- // VITA Timing
-
- time_64bit #(.BASE(SR_TIME64)) time_64bit
- (.clk(wb_clk), .rst(wb_rst), .set_stb(set_stb), .set_addr(set_addr), .set_data(set_data),
- .pps(pps_in), .vita_time(vita_time), .vita_time_pps(vita_time_pps), .pps_int(pps_int),
- .exp_time_in(0));
-
- // /////////////////////////////////////////////////////////////////////////////////////
- // Debug circuitry
-
- assign debug_clk = 2'b00; //{ EM_CLK, clk_fpga };
- assign debug = 0;
-
-endmodule // u1e_core
diff --git a/fpga/usrp2/top/N2x0/bootloader.rmi b/fpga/usrp2/top/N2x0/bootloader.rmi
index 1b378b5d6..cf51f52b4 100644
--- a/fpga/usrp2/top/N2x0/bootloader.rmi
+++ b/fpga/usrp2/top/N2x0/bootloader.rmi
@@ -1,5 +1,5 @@
-defparam bootram.RAM0.INIT_00=256'h00000000_00000000_00000000_d7fc0400_3a0b0b80_80e4b40c_82700b0b_0b0b0b0b;
-defparam bootram.RAM0.INIT_01=256'h00000000_00000000_00000000_800c0400_880c840c_80d8c62d_88080b0b_80088408;
+defparam bootram.RAM0.INIT_00=256'h00000000_00000000_00000000_dbaa0400_3a0b0b80_80e7e80c_82700b0b_0b0b0b0b;
+defparam bootram.RAM0.INIT_01=256'h00000000_00000000_00000000_800c0400_880c840c_80dbf42d_88080b0b_80088408;
defparam bootram.RAM0.INIT_02=256'h00000000_00000000_04000000_ffff0652_832b2a83_81058205_72830609_71fd0608;
defparam bootram.RAM0.INIT_03=256'h83a70400_0b0b0b0b_7383ffff_2b2b0906_05820583_83060981_83ffff73_71fd0608;
defparam bootram.RAM0.INIT_04=256'h00000000_00000000_53510400_070a8106_73097306_09060906_72057373_72098105;
@@ -18,404 +18,404 @@ defparam bootram.RAM0.INIT_10=256'h00000000_00000000_00000000_00000000_00000000_
defparam bootram.RAM0.INIT_11=256'h00000000_00000000_00000000_00000000_00000000_04000000_05055351_72720981;
defparam bootram.RAM0.INIT_12=256'h00000000_00000000_00000000_00000000_00000000_07535104_73730906_72097206;
defparam bootram.RAM0.INIT_13=256'h00000000_00000000_04000000_81ff0652_1010102a_81058305_72830609_71fc0608;
-defparam bootram.RAM0.INIT_14=256'h00000000_00000000_88aa0400_060b0b0b_10100508_a0738306_0b0b80e4_71fc0608;
-defparam bootram.RAM0.INIT_15=256'h00000000_0c510400_0c840c80_80085688_9d2d5050_0b0b80cf_88087575_80088408;
-defparam bootram.RAM0.INIT_16=256'h00000000_0c510400_0c840c80_80085688_cf2d5050_0b0b80d0_88087575_80088408;
+defparam bootram.RAM0.INIT_14=256'h00000000_00000000_88aa0400_060b0b0b_10100508_d4738306_0b0b80e7_71fc0608;
+defparam bootram.RAM0.INIT_15=256'h00000000_0c510400_0c840c80_80085688_cb2d5050_0b0b80d2_88087575_80088408;
+defparam bootram.RAM0.INIT_16=256'h00000000_0c510400_0c840c80_80085688_fd2d5050_0b0b80d3_88087575_80088408;
defparam bootram.RAM0.INIT_17=256'h04000000_07515151_05ff0506_73097274_70547106_8106ff05_0509060a_72097081;
defparam bootram.RAM0.INIT_18=256'h51040000_06075151_7405ff05_06730972_05705471_098106ff_0509060a_72097081;
defparam bootram.RAM0.INIT_19=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_05ff0504;
-defparam bootram.RAM0.INIT_1A=256'h00000000_00000000_00000000_00000000_00000000_51040000_80e4b00c_810b0b0b;
+defparam bootram.RAM0.INIT_1A=256'h00000000_00000000_00000000_00000000_00000000_51040000_80e7e40c_810b0b0b;
defparam bootram.RAM0.INIT_1B=256'h00000000_00000000_00000000_00000000_00000000_00000000_04000000_71810552;
defparam bootram.RAM0.INIT_1C=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000;
defparam bootram.RAM0.INIT_1D=256'h00000000_00000000_00000000_00000000_00000000_04000000_10100552_02840572;
defparam bootram.RAM0.INIT_1E=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000;
defparam bootram.RAM0.INIT_1F=256'h00000000_00000000_00000000_00000000_00000000_020d0400_05715351_717105ff;
-defparam bootram.RAM0.INIT_20=256'h10101010_10101010_10101010_10101010_10101010_10101010_d0c33f04_82813f80;
+defparam bootram.RAM0.INIT_20=256'h10101010_10101010_10101010_10101010_10101010_10101010_d3f13f04_82813f80;
defparam bootram.RAM0.INIT_21=256'hfc060c51_102b0772_83051010_06098105_ff067383_51047381_10101053_10101010;
defparam bootram.RAM0.INIT_22=256'h51535104_72ed3851_0a100a53_71105272_09720605_8106ff05_72728072_51043c04;
-defparam bootram.RAM0.INIT_23=256'h800b80e5_8c0c82a0_0b0b80e5_8380800b_822ebd38_80e4b408_802ea438_80e4b008;
-defparam bootram.RAM0.INIT_24=256'h0b80e590_80808280_e58c0cf8_0b0b0b80_808080a4_940c04f8_800b80e5_900c8290;
-defparam bootram.RAM0.INIT_25=256'h940b80e5_80c0a880_80e58c0c_8c0b0b0b_80c0a880_e5940c04_84800b80_0cf88080;
-defparam bootram.RAM0.INIT_26=256'h70085252_80e4bc08_5170a738_80e59833_04ff3d0d_80e5940c_80d8f80b_900c0b0b;
-defparam bootram.RAM0.INIT_27=256'h9834833d_810b80e5_5270ee38_08700852_2d80e4bc_e4bc0c70_38841280_70802e94;
-defparam bootram.RAM0.INIT_28=256'h38823d0d_09810685_800b802e_0b0b0b0b_802e8e38_80e58808_3d0d0b0b_0d040480;
-defparam bootram.RAM0.INIT_29=256'h3d225a79_80d33895_0d685b7a_0404ee3d_3f823d0d_0b0bf5d4_e588510b_040b0b80;
-defparam bootram.RAM0.INIT_2A=256'h2e973881_79838086_3881e439_80842e8e_8b387983_83808524_80c23879_8380852e;
-defparam bootram.RAM0.INIT_2B=256'h7a81e2c4_81e2c00c_39890a0b_e1880c99_840c7a81_0c7a81e1_0b81e180_da39890a;
-defparam bootram.RAM0.INIT_2C=256'h2e9e3879_79838085_973d225a_7c2eab38_0c805c7a_7a81e4d0_c80c8639_0c7a81e2;
-defparam bootram.RAM0.INIT_2D=256'h815c923d_38818039_80862e86_825c7983_38818c39_80842e92_8b387983_83808524;
-defparam bootram.RAM0.INIT_2E=256'h3d415e5c_0b883d99_5b5f4080_0284057d_943f8008_a9893f8a_84055241_7053963d;
-defparam bootram.RAM0.INIT_2F=256'h7d055b5b_7b1d963d_901f5e5c_ef38800b_5c887c26_7b34811c_5b5b7933_7b1d7f1d;
-defparam bootram.RAM0.INIT_30=256'h811c5c86_79337b34_601d5b5b_5e5c7b1d_800b881f_7c26ed38_811c5c88_79337b34;
-defparam bootram.RAM0.INIT_31=256'h3d0d04ee_99ff3f94_7c26ef38_811c5c86_79337b34_611d5b5b_805c7b1e_7c26ef38;
-defparam bootram.RAM0.INIT_32=256'h75538b52_802e8c38_2e943875_0856758b_279c3877_5a588379_84120859_3d0d686a;
-defparam bootram.RAM0.INIT_33=256'h8b5ba05c_f93fa057_d9cc5194_53a45280_268e3878_e15778a3_958c3f80_80d8fc51;
-defparam bootram.RAM0.INIT_34=256'h89a23f80_0480c15c_05567508_2980dbbc_91387584_75922682_ff9f1756_8818085d;
-defparam bootram.RAM0.INIT_35=256'h962a8480_32703070_183380f2_2e923894_577580f2_33568880_fb399518_08085e81;
-defparam bootram.RAM0.INIT_36=256'h83388157_5775772e_97193357_0852800b_08538c18_33549018_76559618_06595156;
-defparam bootram.RAM0.INIT_37=256'h568cd23f_8c193352_3dea0553_33705495_b3398d18_80d35c81_3f80085f_765196a2;
-defparam bootram.RAM0.INIT_38=256'hb5053480_75028405_3f80c85c_52568ddf_538c1933_70548e19_398d1833_80c95c94;
-defparam bootram.RAM0.INIT_39=256'h0476085f_58567508_058c1908_2980dc88_c2387584_75852680_33ff0556_ff399418;
-defparam bootram.RAM0.INIT_3A=256'h70084056_80e59c05_39768429_2277239b_a2399218_1808770c_5fa93990_ae397622;
-defparam bootram.RAM0.INIT_3B=256'h55943ddc_5c8c1808_785e80cc_d25cad39_710c5680_05901908_2980e59c_8e397684;
-defparam bootram.RAM0.INIT_3C=256'ha439a05c_7826ed38_81185888_75337734_79055757_7719963d_833d5a58_0554800b;
-defparam bootram.RAM0.INIT_3D=256'h887826ed_34811858_57753377_3d790557_58771996_0b833d5a_dc055480_a455943d;
-defparam bootram.RAM0.INIT_3E=256'h2e9238a0_993f7280_98525392_705380da_fe3d0d74_943d0d04_519b8b3f_38838080;
-defparam bootram.RAM0.INIT_3F=256'h843d0d04_518fba3f_87c63f72_a0527251_9e3f8d39_8fcb3f9b_d73f8151_52a05187;
-defparam bootram.RAM1.INIT_00=256'h91d43f81_80daf451_dd3f8b52_dad45191_3f885280_b85188ba_8d3f80da_fa3d0d82;
-defparam bootram.RAM1.INIT_01=256'h3f800851_d43f8684_908f3f87_3f800851_843f85b1_859d3f86_0ca9a73f_0b80e5b8;
-defparam bootram.RAM1.INIT_02=256'h85528008_e73f8380_94b63f85_52800851_85933f73_3f800854_c83f85f8_90a93f87;
-defparam bootram.RAM1.INIT_03=256'hb2528380_94f23f8a_83808451_3f8ab252_805194fc_bf528380_94c03f8c_518e9a3f;
-defparam bootram.RAM1.INIT_04=256'h9251a584_d33f8380_80825194_c0865283_94de3f80_83808551_3f8ab252_865194e8;
-defparam bootram.RAM1.INIT_05=256'h802e80c9_08568008_8e873f80_3dfc0551_abe93f88_51a9d73f_903f8fcc_3f80518e;
-defparam bootram.RAM1.INIT_06=256'h055180c4_52800890_5380db98_06ad3884_ee2e0981_557382fd_8e052255_38768008;
-defparam bootram.RAM1.INIT_07=256'h3f883974_73518591_3f86963f_52548ef7_3f941670_a0519086_9a3880db_d43f8008;
-defparam bootram.RAM1.INIT_08=256'hb73f8787_91ce3f82_0d85df3f_9e39fe3d_8bfe3fff_3fa4d73f_8b3f8d8c_5275519a;
-defparam bootram.RAM1.INIT_09=256'h52845184_8af23f84_3f82ac51_80518588_ac3f9f52_52805185_88833f9f_3f8bb33f;
-defparam bootram.RAM1.INIT_0A=256'h82ac518a_5184e13f_3f905290_ac518ad8_84ee3f82_88528851_518ae53f_fb3f82ac;
-defparam bootram.RAM1.INIT_0B=256'haf3fff13_80e4518a_5184c53f_3f9f529c_e4518abc_84d23f80_9f528051_cb3f8253;
-defparam bootram.RAM1.INIT_0C=256'h800c843d_840c810b_890b81e0_5184a93f_3f9f5281_9e5184cd_df389f52_53728025;
-defparam bootram.RAM1.INIT_0D=256'h8c05a705_7a7d7f02_04f93d0d_51823d0d_8106800c_08708b2a_0d82808c_0d04803d;
-defparam bootram.RAM1.INIT_0E=256'h88388855_5575832e_80258805_2e933872_59577582_5a575758_80258205_33703070;
-defparam bootram.RAM1.INIT_0F=256'h2cff0577_97387681_5472802e_259e3872_80548177_9f2a5153_55733070_7383388a;
-defparam bootram.RAM1.INIT_10=256'h7281ff06_51aea93f_5474527b_73538180_80548639_07515454_7072842b_7131fe05;
-defparam bootram.RAM1.INIT_11=256'h0d029f05_0d04fb3d_8f3f893d_80da51ae_973f8152_811851ae_9f3f7352_527751ae;
-defparam bootram.RAM1.INIT_12=256'hade63f81_5280c551_fe3d0d81_873d0d04_51fee63f_53785275_80ca54bd_33568155;
-defparam bootram.RAM1.INIT_13=256'h0781e080_80087090_f33881e0_5372802e_0881ff06_feb83f80_3f8f883f_528151d6;
-defparam bootram.RAM1.INIT_14=256'h52527080_72177033_76279e38_54805372_57817056_0d787a57_0d04fa3d_0c53843d;
-defparam bootram.RAM1.INIT_15=256'h83388151_5170802e_39747407_811353df_83388055_7181ff2e_54713352_2e833880;
-defparam bootram.RAM1.INIT_16=256'h3f843d0d_c451beb1_a45280e4_865380dc_80e5c034_3d0d810b_3d0d04fe_70800c88;
-defparam bootram.RAM1.INIT_17=256'hd051ade5_56825280_873d7054_c0348654_810b80e5_5574bc38_80e5c033_04f93d0d;
-defparam bootram.RAM1.INIT_18=256'h86537552_55748c38_0881ff06_fef43f80_86527551_802e9c38_ff065574_3f800881;
-defparam bootram.RAM1.INIT_19=256'he4c00c04_dca00880_e5bc3480_04810b80_0c893d0d_e4c40b80_bde73f80_80e4c451;
-defparam bootram.RAM1.INIT_1A=256'h51ad863f_8c5280d0_3dfc0553_34845487_0b80e5bc_74b93881_e5bc3355_fb3d0d80;
-defparam bootram.RAM1.INIT_1B=256'h86387580_ff065574_3f800881_0551fe92_52873dfc_2e993884_06557480_800881ff;
-defparam bootram.RAM1.INIT_1C=256'hcc3f8008_80d051ab_75538c52_77568454_04fb3d0d_0c873d0d_e4c00b80_e4c00c80;
-defparam bootram.RAM1.INIT_1D=256'h803d0d73_873d0d04_3474800c_0b80e5bc_e4c00c81_38750880_74802e8d_81ff0655;
-defparam bootram.RAM1.INIT_1E=256'h73097375_04803d0d_51823d0d_81e08c0c_80e5c40c_08060770_7180e5c4_09737506;
-defparam bootram.RAM1.INIT_1F=256'h0d747053_3f04fe3d_0d0481af_0c51823d_0c81e098_7080e5c8_c8080607_067180e5;
-defparam bootram.RAM1.INIT_20=256'h3d0d7779_3d0d04fb_81b63f83_8a528051_04ff3d0d_0c843d0d_c73f7280_53805181;
-defparam bootram.RAM1.INIT_21=256'he539800b_5581913f_06537652_157481ff_2e903881_54547280_7081ff06_56567433;
-defparam bootram.RAM1.INIT_22=256'hffbd3f8a_53705253_3d0d7476_3d0d04fe_51cd3f83_0d735280_0d04ff3d_800c873d;
-defparam bootram.RAM1.INIT_23=256'h3d0d7251_3d0d0480_51dd3f83_0d735280_0d04ff3d_800c843d_e73f800b_52725180;
-defparam bootram.RAM1.INIT_24=256'h05702272_1080dcac_90800575_73a02982_04ff3d0d_34823d0d_80e4cc12_028f0533;
-defparam bootram.RAM1.INIT_25=256'h7251ce3f_d0133352_c63f80e4_33527251_80e4cc13_3d0d8053_3d0d04fe_0c535183;
-defparam bootram.RAM1.INIT_26=256'he4cc1433_06953880_8a2e0981_78565474_fc3d0d76_843d0d04_7325e538_81135382;
-defparam bootram.RAM1.INIT_27=256'h802ef838_14085372_80055484_a0298290_51de3f73_388d5273_09810687_5372812e;
-defparam bootram.RAM1.INIT_28=256'h85389012_5370802e_085252ff_80058811_a0298290_fe3d0d74_863d0d04_748c150c;
-defparam bootram.RAM1.INIT_29=256'h800c7088_ff0681a8_d8227081_880c80e4_800b81a8_04ff3d0d_0c843d0d_08537280;
-defparam bootram.RAM1.INIT_2A=256'h55535481_05970533_76780288_04fd3d0d_0c833d0d_0b81a888_0c518180_2a81a884;
-defparam bootram.RAM1.INIT_2B=256'ha88c0c81_10810781_70f13872_06515151_862a7081_a8900870_81863881_5171802e;
-defparam bootram.RAM1.INIT_2C=256'h2a708106_90087087_f13881a8_51515170_2a708106_90087081_900c81a8_900b81a8;
-defparam bootram.RAM1.INIT_2D=256'h81a8900c_38a05170_71812e83_3880e851_71802eb1_802eba38_51515170_70813251;
-defparam bootram.RAM1.INIT_2E=256'hff1252cc_81055634_51707470_81a88c08_5170f138_81065151_70812a70_81a89008;
-defparam bootram.RAM1.INIT_2F=256'h05335553_02880597_3d0d7678_3d0d04fd_70800c85_81a8900c_3980c00b_39815188;
-defparam bootram.RAM1.INIT_30=256'h2e843881_d0517180_a88c0c81_38721081_515170f1_70810651_0870862a_5481a890;
-defparam bootram.RAM1.INIT_31=256'h872a7081_a8900870_70f13881_06515151_812a7081_a8900870_a8900c81_90517081;
-defparam bootram.RAM1.INIT_32=256'h5171812e_8c0c80d0_733381a8_2e80c538_cf387180_70802e80_51515151_06708132;
-defparam bootram.RAM1.INIT_33=256'h0870872a_3881a890_515170f1_70810651_0870812a_0c81a890_7081a890_83389051;
-defparam bootram.RAM1.INIT_34=256'h80c00b81_81518a39_54ffb739_14ff1353_2e8e3881_51517080_81325151_70810670;
-defparam bootram.RAM1.INIT_35=256'h5281b8ac_81b8ac08_74259b38_54805372_fd3d0d75_853d0d04_5170800c_a8900c80;
-defparam bootram.RAM1.INIT_36=256'h80880c81_0dff0b82_0d04ff3d_e239853d_38811353_9f7127f1_5151868d_08707331;
-defparam bootram.RAM1.INIT_37=256'h8405540c_9efc7270_f0528751_8c0c80ef_ff0b8280_8280840c_800cef0b_e20b8280;
-defparam bootram.RAM1.INIT_38=256'h51528053_08710658_0982808c_80880870_fb3d0d82_833d0d04_8025f138_ff115170;
-defparam bootram.RAM1.INIT_39=256'h8f398113_82808c0c_52712d74_72517308_802e8f38_76065271_f0555574_810b80ef;
-defparam bootram.RAM1.INIT_3A=256'h2980eff0_9f387184_52718726_ff3d0d73_873d0d04_7325dc38_57555387_84157610;
-defparam bootram.RAM1.INIT_3B=256'h04ff3d0d_833d0d04_0c535152_06828088_88087072_70098280_5181722b_0575710c;
-defparam bootram.RAM1.INIT_3C=256'h0c81b8a0_0b81e0cc_803d0d81_833d0d04_81e0c80c_e0c40c52_74700881_02920522;
-defparam bootram.RAM1.INIT_3D=256'h04fe3d0d_81e0c00c_04de3f71_0c823d0d_0b81e0cc_2ef33882_51517080_08708406;
-defparam bootram.RAM1.INIT_3E=256'h80529a39_53538180_902a710c_a0087571_933881b8_5272802e_70810654_81b8a008;
-defparam bootram.RAM1.INIT_3F=256'h843d0d04_5271800c_ff9e3f72_51f8d33f_3880dcb8_71802e8b_81065152_71812a70;
-defparam bootram.RAM2.INIT_00=256'hff3d0d02_823d0d04_800b800c_f2388180_5170802e_80c00651_b8a00870_803d0d81;
-defparam bootram.RAM2.INIT_01=256'h0b81e0cc_2ef33884_51517080_08709006_5281b8a0_81e0cc0c_902b8807_8e052270;
-defparam bootram.RAM2.INIT_02=256'ha5c63f81_70335252_a53f7214_38ba51f7_72802e86_75548053_04fd3d0d_0c833d0d;
-defparam bootram.RAM2.INIT_03=256'h33535680_11335470_11335581_11335682_3d0d7783_3d0d04fb_27e63885_13538573;
-defparam bootram.RAM2.INIT_04=256'h515b5f5d_30709f2a_bb053370_63029005_0d7c7e61_0d04f63d_ed3f873d_dcbc5180;
-defparam bootram.RAM2.INIT_05=256'h55785480_26943879_30577777_51782d76_387952ad_75802e8a_80258f38_5b595776;
-defparam bootram.RAM2.INIT_06=256'h51782d8c_dcc80533_3f800880_7651ada4_bd3f7752_800851ff_51ad8c3f_53775276;
-defparam bootram.RAM2.INIT_07=256'h08a1e35c_70840552_0d8c3d70_0d04f73d_8d3f823d_053351f6_3d0d028b_3d0d0480;
-defparam bootram.RAM2.INIT_08=256'hdb388119_09810680_5675a52e_7681ff06_2e81d138_57577580_7081ff06_5a587833;
-defparam bootram.RAM2.INIT_09=256'h3875802e_80e3248a_2eb93875_387580e3_80f024a0_80fb3875_7580f02e_70335759;
-defparam bootram.RAM2.INIT_0A=256'h7580f32e_f5248b38_ac387580_7580f52e_38818b39_e42e80c6_95397580_819e3881;
-defparam bootram.RAM2.INIT_0B=256'h792d80da_80527551_33525956_84198312_80ec3977_f82eba38_f5397580_80db3880;
-defparam bootram.RAM2.INIT_0C=256'ha1e35481_59568055_19710852_90397784_e3548053_568055a1_71085259_39778419;
-defparam bootram.RAM2.INIT_0D=256'h39778419_fdd03f9e_90527551_e3548053_568055a1_71085259_39778419_538a5292;
-defparam bootram.RAM2.INIT_0E=256'h59fea339_ec398119_3351792d_70810558_38805276_75802e8e_56763356_71085959;
-defparam bootram.RAM2.INIT_0F=256'h51515170_2a708106_90087088_3d0d81a0_940c0480_810b81a0_8b3d0d04_800b800c;
-defparam bootram.RAM2.INIT_10=256'h5354d03f_c0800755_06077080_067b8c80_337980ff_0d029705_0d04fd3d_f138823d;
-defparam bootram.RAM2.INIT_11=256'h73517380_81a0900c_80c28007_a0900c71_800c7281_0c7781a0_0681a098_7683ffff;
-defparam bootram.RAM2.INIT_12=256'h53727427_54555580_0d76787a_0d04fc3d_800c853d_80085170_aa3f81a0_2e8938ff;
-defparam bootram.RAM2.INIT_13=256'hff067290_387183ff_70802e8d_71902a51_5351ee39_05811555_15702273_8f387210;
-defparam bootram.RAM2.INIT_14=256'h0880e5d8_f43f7670_e5d051ae_53755280_fd3d0d86_863d0d04_3971800c_2a0552ec;
-defparam bootram.RAM2.INIT_15=256'h38833d0d_708025f3_ff125252_720c8812_52895180_0d80e5e0_0d04ff3d_0c54853d;
-defparam bootram.RAM2.INIT_16=256'h52528972_81128812_742e8e38_70225472_e5dc5252_53800b80_02960522_04fd3d0d;
-defparam bootram.RAM2.INIT_17=256'h08802e89_56c73f80_ff065358_7a7183ff_fa3d0d78_853d0d04_5170800c_25ee3880;
-defparam bootram.RAM2.INIT_18=256'h802e8f38_15555271_55730888_e5dc5555_e5e00b80_39800880_84050cad_38768008;
-defparam bootram.RAM2.INIT_19=256'h86705493_04f13d0d_0c883d0d_23768414_883f7573_25eb389c_54558975_81158814;
-defparam bootram.RAM2.INIT_1A=256'h028405a2_b43f9080_dc0551ad_0552913d_53923d88_adc33f73_d6055254_3d53923d;
-defparam bootram.RAM2.INIT_1B=256'h052380c0_028405aa_23818080_800b8c3d_05a60523_23800284_800b8b3d_0523818a;
-defparam bootram.RAM2.INIT_1C=256'h80080284_51fdb73f_913de405_80538a52_685d665e_05ae0523_23800284_910b8d3d;
-defparam bootram.RAM2.INIT_1D=256'hbe0523ac_80028405_0b913d23_ba052380_22028405_3d23963d_983d2290_05ae0523;
-defparam bootram.RAM2.INIT_1E=256'h0b973d23_0d805b80_0d04e83d_8c3f913d_8405519e_c02981e6_05526980_53913dd4;
-defparam bootram.RAM2.INIT_1F=256'h80f20522_ac933f02_3df80551_e5d0529a_3f865380_0551aca1_529a3df2_86539b3d;
-defparam bootram.RAM2.INIT_20=256'ha13d0845_05436e44_c41143f0_800b9b3d_8008585a_f73f8008_e20523f7_02840580;
-defparam bootram.RAM2.INIT_21=256'h7508701a_3d568458_fc06408c_3d088305_3d085fa3_5d6e5ea1_59845c90_a33d0846;
-defparam bootram.RAM2.INIT_22=256'h83065473_2e9a3873_08547380_73760c75_75278438_565a5573_80713151_787c3190;
-defparam bootram.RAM2.INIT_23=256'h519cde3f_16085276_75085394_51effb3f_3880dce4_73802e88_08830654_8c389416;
-defparam bootram.RAM2.INIT_24=256'h51f6fd3f_5978822a_843880c0_3878bf26_8025ffac_19595777_570817ff_75708405;
-defparam bootram.RAM2.INIT_25=256'hca052380_02840580_94055a79_3d237f1f_8a800b94_6e404081_ea3d0d6b_9a3d0d04;
-defparam bootram.RAM2.INIT_26=256'h80d20523_80028405_79963d23_c080075a_05236980_840580ce_81808002_0b953d23;
-defparam bootram.RAM2.INIT_27=256'hd2052391_02840580_08095a79_fae03f80_3d70525c_538a5293_46684780_80e5d808;
-defparam bootram.RAM2.INIT_28=256'h7a51f6cb_51f7d73f_3880dd90_065a7992_800881ff_5e8ac83f_3d70535c_3d705398;
-defparam bootram.RAM2.INIT_29=256'h1f5b5b79_5c7b1d7c_90805380_94557b54_586b575d_5a6d5960_a939027f_3fedea3f;
-defparam bootram.RAM2.INIT_2A=256'h3d238d3d_ae05228a_0d7f5802_0d04f73d_893f983d_26ef38fd_1c5c867c_337b3481;
-defparam bootram.RAM2.INIT_2B=256'h3df80553_5588548b_2377567e_8405a605_3d238002_1857768b_a2052388_22028405;
-defparam bootram.RAM2.INIT_2C=256'h0b8f3d34_b2052386_80028405_8e3d2390_3d0d810b_3d0d04ee_fe9e3f8b_91527d51;
-defparam bootram.RAM2.INIT_2D=256'hd03feb80_ec0551a8_0852943d_3f865380_0523eab1_028405b6_b5053481_84028405;
-defparam bootram.RAM2.INIT_2E=256'h3f800808_cd3feae4_f60551a9_8052943d_c03f8653_f20551a8_0852943d_3f845380;
-defparam bootram.RAM2.INIT_2F=256'hdc1b337a_1c5a80dc_53805b7a_05549086_55943de4_5780569c_59805880_43025c80;
-defparam bootram.RAM2.INIT_30=256'h90862e09_225f5d7d_3d088e11_d93d0daa_943d0d04_38fbcb3f_867b26ef_34811b5b;
-defparam bootram.RAM2.INIT_31=256'hb53f86ee_ddc051f5_38795280_799b268d_f2055b5b_3d088429_38901dac_8106829d;
-defparam bootram.RAM2.INIT_32=256'h1b225a79_86d43884_2e098106_5a799080_38821b22_810686e2_79812e09_397a225a;
-defparam bootram.RAM2.INIT_33=256'h853fa81d_70524088_b9389e1d_09810686_5a79812e_38861b22_810686c6_8c842e09;
-defparam bootram.RAM2.INIT_34=256'h08868f38_80085c80_51a6823f_3dffa805_e5d852a9_43845380_fd3f8008_70525f87;
-defparam bootram.RAM2.INIT_35=256'h23841b33_0580fe05_1b220284_a13d2382_e03f7a22_527951a6_5380e5d0_a73d5a86;
-defparam bootram.RAM2.INIT_36=256'h0551a6ad_52a93de4_23865379_05818205_34820284_05818105_1b330284_a23d3485;
-defparam bootram.RAM2.INIT_37=256'h903f7953_527a51a6_8653981d_818e055b_a69f3f02_ea05525a_7f53aa3d_3f847054;
-defparam bootram.RAM2.INIT_38=256'h587c575d_5a7c597c_f83f027c_527e51a5_5f86537a_843f9e3d_f40551a6_7f52a93d;
-defparam bootram.RAM2.INIT_39=256'h993f84ee_26ef38f9_1c5c867c_337b3481_1d5b5b79_537b1d7f_dc05547d_9c55a93d;
-defparam bootram.RAM2.INIT_3A=256'hd1387988_09810684_5b60842e_8c2a435b_1d702270_84e43890_2e098106_397d9080;
-defparam bootram.RAM2.INIT_3B=256'h5e865380_84b4387e_ff065f7e_1b2280ff_84c03886_2e098106_515a7985_2a708f06;
-defparam bootram.RAM2.INIT_3C=256'ha3fb3f80_70535b5c_80e5d854_901c6255_38815e7e_3f800883_1d51a491_dcdc5282;
-defparam bootram.RAM2.INIT_3D=256'h22ec1140_1b33821c_84b83f89_529c1d51_8138881d_7b802e84_5c7d8738_08833881;
-defparam bootram.RAM2.INIT_3E=256'h5d42407d_8411225d_7a08a41f_388c1b08_810683de_7f912e09_2e81bb38_5d407f81;
-defparam bootram.RAM2.INIT_3F=256'hf5c33f80_22535d5d_e41d821d_bd39ac1d_f2843f83_80dde051_79537d52_7a2e8f38;
-defparam bootram.RAM3.INIT_00=256'ha3ef3f9c_7d527951_5f5a8853_9a3d993d_3d237f49_387a2299_802e83a6_08428008;
-defparam bootram.RAM3.INIT_01=256'h51a3ce3f_b4055279_53a93dff_23604788_1b22973d_a3e33f82_79527f51_3d408853;
-defparam bootram.RAM3.INIT_02=256'h811c5c88_79337b34_7c1f5b5b_5e5c7b1d_557e843d_3f7b567c_7d51a3c5_88537952;
-defparam bootram.RAM3.INIT_03=256'h5a792d82_61840508_7b26ef38_811b5b88_84051c34_5a793302_805b7f1b_7c26ef38;
-defparam bootram.RAM3.INIT_04=256'h335a7983_9539811a_81bb3882_387d882e_7d832e8a_33405b42_08a41e70_ad398c1b;
-defparam bootram.RAM3.INIT_05=256'h2251f481_81f4387c_2e098106_5e5c7991_8912335c_1d80c01e_81a238ac_2e098106;
-defparam bootram.RAM3.INIT_06=256'h88537a52_9b3d5c5e_794b983d_229b3d23_1c085a7c_80fe388c_8008802e_3f800841;
-defparam bootram.RAM3.INIT_07=256'h4d8853a9_9d3d2379_5a821d22_3f901c08_7f51a29d_88537d52_3f963d40_7d51a2a9;
-defparam bootram.RAM3.INIT_08=256'h1d7c1f5b_3d5e5c7b_7e557e84_fc3f7e56_527d51a1_3f88537a_7a51a285_3dcc0552;
-defparam bootram.RAM3.INIT_09=256'h887b26ef_34811b5b_0284051c_1b5a7933_38805b7f_887c26ef_34811c5c_5b79337b;
-defparam bootram.RAM3.INIT_0A=256'h02840580_953d347e_1d5d5d7e_39ac1de4_ad3f80de_80e951e5_085a792d_38608405;
-defparam bootram.RAM3.INIT_0B=256'h53605294_d205237e_02840580_23861a22_1a22963d_ce052384_02840580_cd05347e;
-defparam bootram.RAM3.INIT_0C=256'hce05237b_02840580_08095a79_f1c03f80_2a527c51_08537b81_f1cc3f80_3d70525b;
-defparam bootram.RAM3.INIT_0D=256'h53727427_e6ac0855_0d800b80_0d04fc3d_f73fa93d_526151f5_547a537f_567c557d;
-defparam bootram.RAM3.INIT_0E=256'h39811353_3872518b_09810685_5170752e_088c1353_54565171_0880e6b4_a4387670;
-defparam bootram.RAM3.INIT_0F=256'h8025ba38_b93f8008_535755ff_0d777971_0d04fb3d_800c863d_38ff5170_737326e7;
-defparam bootram.RAM3.INIT_10=256'hb00c5473_870680e6_b0088111_8e3980e6_80e6ac0c_89388114_54738726_80e6ac08;
-defparam bootram.RAM3.INIT_11=256'h80080554_39800810_b8145194_755280e6_51548653_e6b4120c_2b760880_10147082;
-defparam bootram.RAM3.INIT_12=256'h54738008_fed83f80_3d0d7551_3d0d04fd_9fbf3f87_e6b80551_73842980_86537552;
-defparam bootram.RAM3.INIT_13=256'h800c853d_3f815473_76519f95_e6b80552_73842980_05548653_08108008_24993880;
-defparam bootram.RAM3.INIT_14=256'h33710780_72078316_3370882b_2b078214_982b7190_81123371_0d757033_0d04fd3d;
-defparam bootram.RAM3.INIT_15=256'hffff068b_a8387383_56595776_80e79422_3d0d7d7f_3d0d04f9_56545285_0c525354;
-defparam bootram.RAM3.INIT_16=256'h742380c0_05515476_2980e798_29147090_d3387390_73832680_31525654_3d227072;
-defparam bootram.RAM3.INIT_17=256'h3d527390_5488538a_74902915_8326ad38_57575474_22707231_ff068d3d_397383ff;
-defparam bootram.RAM3.INIT_18=256'h1656ec39_e3b23f81_53547451_75177033_78279138_3f805675_05519e85_2980e798;
-defparam bootram.RAM3.INIT_19=256'h88140c80_23800b82_54548073_0b80e798_e7942380_9a052280_fc3d0d02_893d0d04;
-defparam bootram.RAM3.INIT_1A=256'hd938863d_54837427_82901454_9b3f8114_740551ef_80e79422_0cb5ab52_0b828c14;
-defparam bootram.RAM3.INIT_1B=256'h881a085b_be387582_51567581_32708106_847c2c81_e7985a5c_0d800b80_0d04f43d;
-defparam bootram.RAM3.INIT_1C=256'hff06708a_38800881_ff2e80c5_f73f8008_5b7b51e2_781a8805_2680d638_5d7981ff;
-defparam bootram.RAM3.INIT_1D=256'h777b7081_8338815d_5876802e_51595158_80250753_72802571_8d327030_32703072;
-defparam bootram.RAM3.INIT_1E=256'h38828819_7a27ffb1_1a5a81ff_8c1a0c81_0c800b82_0582881a_88190881_055d3482;
-defparam bootram.RAM3.INIT_1F=256'h75802eab_38782256_8b7627bf_8c1b0c56_08811182_38828c19_d2387c91_08802e80;
-defparam bootram.RAM3.INIT_20=256'h887826ef_34811858_57753377_1a781a57_3d5b5877_54800b83_08558819_38828819;
-defparam bootram.RAM3.INIT_21=256'h5a5c837c_1c82901a_8c1a0c81_0c800b82_0b82881a_f2a83f80_227c0551_3880e794;
-defparam bootram.RAM3.INIT_22=256'h9d055755_80028405_5194d53f_80c05268_3d705457_ea3d0d88_8e3d0d04_27fea938;
-defparam bootram.RAM3.INIT_23=256'h81992e09_33515473_38741670_09810694_7381aa2e_ff2e9d38_51547381_74177033;
-defparam bootram.RAM3.INIT_24=256'h863d7054_04f93d0d_0c983d0d_80547380_7527d138_811555be_81548b39_81068538;
-defparam bootram.RAM3.INIT_25=256'h83388155_2e098106_3f800875_735199e5_80de8452_80558453_5194853f_54845279;
-defparam bootram.RAM3.INIT_26=256'h55805189_0881ff06_8add3f80_0d8df23f_0c04fc3d_0b81e094_3d0d0481_74800c89;
-defparam bootram.RAM3.INIT_27=256'h80dec051_3974b538_88518183_883880de_51515473_2a708106_b408708d_dc3f81b8;
-defparam bootram.RAM3.INIT_28=256'h82ac51e3_5189a23f_ded83f81_80deec51_802e9a38_bf3f8008_800a51fe_deec3fb0;
-defparam bootram.RAM3.INIT_29=256'h3880dff0_08802ebb_fee33f80_98800a51_5180cc39_3f80dfa4_0a5184b5_8b3fb080;
-defparam bootram.RAM3.INIT_2A=256'h51e2cd3f_953f82ac_e09c51de_92da3f80_98800a51_80ffff52_83808053_51deab3f;
-defparam bootram.RAM3.INIT_2B=256'hf13f863d_e0fc51dd_3f883980_805183e9_51e2bd3f_853f82ac_e0c051de_fee53f80;
-defparam bootram.RAM3.INIT_2C=256'h3f80efd8_a051dca0_dd3fa052_c85254e6_705380e1_fd3d0d75_efd80c04_0d047180;
-defparam bootram.RAM3.INIT_2D=256'h08537280_3f80efd8_8051dc84_3d0da052_3d0d04fe_51722d85_2e853873_08537280;
-defparam bootram.RAM3.INIT_2E=256'h51535481_2a708106_0b800886_89a83fff_3d0d9a51_3d0d04fc_51722d84_2e853880;
-defparam bootram.RAM3.INIT_2F=256'h248a388a_38718280_82802e9b_80e45471_80065355_0b800886_80ec3882_5571802e;
-defparam bootram.RAM3.INIT_30=256'h5188db3f_80085285_5188e33f_38ff5484_84802e83_87e85471_8e388a39_5471802e;
-defparam bootram.RAM3.INIT_31=256'h53515452_80e28055_80efe40c_c0113370_720780e2_2c708306_0680088a_71882a8c;
-defparam bootram.RAM3.INIT_32=256'hefdc0c74_98387480_efdc082e_9d3f7480_085252dc_80e4e011_822b8c06_dc843f71;
-defparam bootram.RAM3.INIT_33=256'he0082e8e_387380ef_09810696_3974822e_fec13f9e_8106a338_74812e09_822ea638;
-defparam bootram.RAM3.INIT_34=256'h3f800851_3d0dd8c5_3d0d04fd_87e83f86_fb3f9951_3f7351fd_e00cfea7_387380ef;
-defparam bootram.RAM3.INIT_35=256'hae80529c_87f13f81_8d529851_5187c73f_efe00c99_0cff0b80_0b80efdc_87bd3f80;
-defparam bootram.RAM3.INIT_36=256'h845187cb_06705354_8007f49f_3f800890_845187aa_51e1853f_bbcb5284_5187e83f;
-defparam bootram.RAM3.INIT_37=256'h3f800884_805186fe_51e3fb3f_5280e298_80085373_082e8d38_953f7380_3f845187;
-defparam bootram.RAM3.INIT_38=256'h71832a84_71872a07_852a8206_97053370_fd3d0d02_853d0d04_5187a43f_80075280;
-defparam bootram.RAM3.INIT_39=256'h852b80c0_81ff0676_73070770_2ba00671_90067483_07077310_88067173_0672812a;
-defparam bootram.RAM3.INIT_3A=256'h04fe3d0d_52853d0d_55525555_51525351_82c0800c_7081ff06_78872b07_06707207;
-defparam bootram.RAM3.INIT_3B=256'h9951ff8c_ff923f81_3f81aa51_ff51ff98_ff9e3f81_5381ff51_81d00a07_74d00a06;
-defparam bootram.RAM3.INIT_3C=256'h51feed3f_7281ff06_52fef53f_81ff0652_72882a70_51ff813f_873f80e1_3fb251ff;
-defparam bootram.RAM3.INIT_3D=256'hcf3fb051_065253fe_2a7081ff_db3f7290_982a51fe_fee23f72_3f818151_b251fee8;
-defparam bootram.RAM3.INIT_3E=256'h3fa051fe_8051feb0_51feb53f_feba3fa0_bf3f8e51_3f8051fe_a151fec4_feca3f81;
-defparam bootram.RAM3.INIT_3F=256'h3f863d22_d05183e9_53805280_873dfc05_3d0d8254_3d0d04fb_fea63f84_ab3f8051;
-defparam bootram.RAM4.INIT_00=256'h90387753_77829326_08585957_3d088412_3d0880d7_3d0d80d5_0d04ffb2_800c873d;
-defparam bootram.RAM4.INIT_01=256'h9c055675_842980e3_81cc3875_56759626_39ff9f16_c93f81d6_e2d051e1_82945280;
-defparam bootram.RAM4.INIT_02=256'he1880c89_0c800b81_0b81e184_e1800c80_890a0b81_8008085e_5cd5f93f_080480c1;
-defparam bootram.RAM4.INIT_03=256'h9a3f8008_818a398c_81e4d00c_c80c800b_800b81e2_81e2c40c_c00c800b_0a0b81e2;
-defparam bootram.RAM4.INIT_04=256'h39901708_d65c80e8_ff065e80_800883ff_39fedc3f_c65c80f8_80085f80_5e8c9e3f;
-defparam bootram.RAM4.INIT_05=256'hff065675_3f800881_90518abb_d33980f0_80c55c80_5189f63f_5280f090_538c1708;
-defparam bootram.RAM4.INIT_06=256'h80d75ca4_5188dd3f_528c1708_53901708_b7399417_3980c25c_80c45cbc_802e8638;
-defparam bootram.RAM4.INIT_07=256'h51fcde3f_80d35c80_d25c8d39_8bba3f80_8c170851_90170852_fe800553_3980d03d;
-defparam bootram.RAM4.INIT_08=256'h57753377_3d790557_771980d2_833d5a58_0554800b_d03dfdec_82945580_8339a05c;
-defparam bootram.RAM4.INIT_09=256'hd6883fff_80e3f851_04803d0d_80d03d0d_51e8a33f_38838082_887826ec_34811858;
-defparam bootram.RAM4.INIT_0A=256'h75538152_80559854_07575788_3371882b_8405ab05_a7053302_f93d0d02_5183983f;
-defparam bootram.RAM4.INIT_0B=256'hb7387581_54807425_74ff1656_5a575758_7a7c7f7f_04f83d0d_3f893d0d_8051e1a2;
-defparam bootram.RAM4.INIT_0C=256'hff0651d8_05527781_538a3dfc_a1053482_33028405_70810558_8a3d3476_17575473;
-defparam bootram.RAM4.INIT_0D=256'h04fa3d0d_0c8a3d0d_81547380_8538c139_3f73802e_8a51da80_81ff0654_d23f8008;
-defparam bootram.RAM4.INIT_0E=256'hd051ff89_81f75280_3dfc0553_34815488_5675883d_748338dc_5580de56_02a30533;
-defparam bootram.RAM4.INIT_0F=256'h705256d7_02a70533_3dfc0552_34815389_0533893d_7c5702ab_04f93d0d_3f883d0d;
-defparam bootram.RAM4.INIT_10=256'h3f800881_7551d6b5_76537b52_77259738_2e9e3880_56547380_81ff0670_f23f8008;
-defparam bootram.RAM4.INIT_11=256'h5381f752_883dfc05_3d0d8154_3d0d04fa_74800c89_83388155_5473802e_ff067056;
-defparam bootram.RAM4.INIT_12=256'h3d0d0499_75800c88_83388156_2e098106_567480de_883d3356_a03f800b_80d051ff;
-defparam bootram.RAM4.INIT_13=256'h0d72882b_0c04803d_0b81c0b0_ac0c89b0_a60b81c0_81c0800c_0c80eb0b_0b81c094;
-defparam bootram.RAM4.INIT_14=256'h515170f1_70810651_0870812a_0c81c0a4_0b81c0a0_980c5182_810781c0_be800670;
-defparam bootram.RAM4.INIT_15=256'h7381c09c_c0980c51_70810781_2bbe8006_3d0d7288_3d0d0480_08800c82_3881c0a8;
-defparam bootram.RAM4.INIT_16=256'h39fa3d0d_3d0d04ff_70f13882_06515151_812a7081_c0a40870_c0a00c81_0c840b81;
-defparam bootram.RAM4.INIT_17=256'h38815188_71802e86_72830652_52718a38_38758306_57577191_83065555_787a7c72;
-defparam bootram.RAM4.INIT_18=256'h1454e939_52545281_7008720c_77117712_3873822b_73752794_2a725555_ca3f7282;
-defparam bootram.RAM4.INIT_19=256'h0680e484_c13f728f_515353d1_84113354_8f0680e4_70842a70_fe3d0d74_883d0d04;
-defparam bootram.RAM4.INIT_1A=256'hf138823d_51515170_2a708106_90087088_3d0d82e0_3d0d0480_d1b43f84_11335253;
-defparam bootram.RAM4.INIT_1B=256'h70882a70_82e09008_80075353_060780c0_067a8c80_337880ff_0d029305_0d04fe3d;
-defparam bootram.RAM4.INIT_1C=256'h800782e0_980c7182_ff0682e0_900c7581_0c7182e0_7682e080_5170f138_81065151;
-defparam bootram.RAM4.INIT_1D=256'h08517080_3882e080_515170f1_70810651_0870882a_3882e090_72802e96_900c7251;
-defparam bootram.RAM4.INIT_1E=256'h863d0d04_51ff873f_53805280_55885480_940c8880_810b82e0_04fc3d0d_0c843d0d;
-defparam bootram.RAM4.INIT_1F=256'h04fc3d0d_0c863d0d_81ff0680_f13f8008_528151fe_8a805381_80559054_fc3d0d88;
-defparam bootram.RAM4.INIT_20=256'h06800c82_08813281_0dca3f80_0d04803d_d53f863d_528051fe_54865381_88805588;
-defparam bootram.RAM4.INIT_21=256'h84e33f75_3d0d7756_3d0d04fb_2ef43882_06517080_800881ff_3d0deb3f_3d0d0480;
-defparam bootram.RAM4.INIT_22=256'hfe843f87_81528051_9b0a0753_fe9b0a06_55a05475_b43f8880_38dd3fff_8008269b;
-defparam bootram.RAM4.INIT_23=256'h38751754_ff2681b4_80557381_11565757_cb3d08ff_c93d0880_ba3d0d80_3d0d04ff;
-defparam bootram.RAM4.INIT_24=256'h3d085273_755380cb_548c8f3f_883d7052_5381ff52_a7388280_80082681_849f3f73;
-defparam bootram.RAM4.INIT_25=256'h0a0680c0_0c76fec0_0b82e090_980c8880_3f7482e0_d43ffd9f_fefd3ffe_518aea3f;
-defparam bootram.RAM4.INIT_26=256'h3f80c83d_900cfcef_a00b82e0_e0900c8a_88a00b82_82e0980c_800c810b_0a0782e0;
-defparam bootram.RAM4.INIT_27=256'h82e0840c_88157008_880c54fe_700882e0_54fe8415_82e08c0c_80157008_558f56fe;
-defparam bootram.RAM4.INIT_28=256'hff169016_0cfcb03f_0b82e090_900c8a80_800b82e0_800c5488_700882e0_54fe8c15;
-defparam bootram.RAM4.INIT_29=256'h7b7d7212_f93d0d79_c83d0d04_74800c80_980c8155_800b82e0_25ffbc38_56567580;
-defparam bootram.RAM4.INIT_2A=256'h5473802e_7581ff06_2e80c338_81577480_2680cb38_57738008_82db3f80_575a5656;
-defparam bootram.RAM4.INIT_2B=256'h19767631_3f731674_7551fdeb_77537352_83387654_57767527_74317555_a2388280;
-defparam bootram.RAM4.INIT_2C=256'h0c893d0d_81577680_39fd8c3f_828054dc_7527e138_74548280_802e8e38_57595674;
-defparam bootram.RAM4.INIT_2D=256'h0b88160c_27903880_3f800874_135481ed_2e8d3873_54557380_76787a56_04fc3d0d;
-defparam bootram.RAM4.INIT_2E=256'h08307276_81bd3f80_16565152_707406ff_3f800830_a63981cb_0c80750c_800b8416;
-defparam bootram.RAM4.INIT_2F=256'h0881ff06_fc983f80_3d0d7554_3d0d04fd_fcc93f86_160c7151_160c7188_0c740684;
-defparam bootram.RAM4.INIT_30=256'h7088160c_08800805_823f8814_2e943881_08841508_81538814_802e9f38_70545271;
-defparam bootram.RAM4.INIT_31=256'h51faa33f_53815281_5481f90a_888055a0_04fc3d0d_0c853d0d_80537280_51fc943f;
-defparam bootram.RAM4.INIT_32=256'h81ff0680_08882a70_38d73f80_efe808a0_ff3d0d80_863d0d04_0a06800c_8008fe80;
-defparam bootram.RAM4.INIT_33=256'h82712784_ea115252_80efe808_80efe80c_06933871_a02e0981_54515170_0881ff06;
-defparam bootram.RAM4.INIT_34=256'h082b800c_3f810b80_800c04f3_e4da0533_3f800880_3d0d04c0_71800c83_38f5b23f;
-defparam bootram.RAM4.INIT_35=256'h0b82e090_980c8880_800b82e0_56f9983f_f63d0d7d_2b800c04_810b8008_04ffa93f;
-defparam bootram.RAM4.INIT_36=256'ha80b82e0_e0900c8a_88a80b82_82e0980c_800c810b_882b82e0_e0840c7c_0c8b0b82;
-defparam bootram.RAM4.INIT_37=256'h0cf8cc3f_0b82e090_900c8a80_800b82e0_80d33888_54737627_3f7e5580_900cf8e7;
-defparam bootram.RAM4.INIT_38=256'h53707327_31525790_883d7675_e080085b_84085a82_085982e0_5882e088_82e08c08;
-defparam bootram.RAM4.INIT_39=256'h1454ffa9_52ec3972_57348112_75708105_17517033_27913871_80527173_83387053;
-defparam bootram.RAM4.INIT_3A=256'h538c088c_fd3d0d80_08028c0c_f7893f8c_3d0d7251_3d0d0480_e0980c8c_39800b82;
-defparam bootram.RAM4.INIT_3B=256'h0cfd3d0d_8c08028c_0d8c0c04_0c54853d_80087080_5182de3f_08880508_0508528c;
-defparam bootram.RAM4.INIT_3C=256'h048c0802_3d0d8c0c_800c5485_3f800870_085182b9_8c088805_8c050852_81538c08;
-defparam bootram.RAM4.INIT_3D=256'h0888050c_0508308c_388c0888_088025ab_8c088805_08fc050c_0d800b8c_8c0cf93d;
-defparam bootram.RAM4.INIT_3E=256'hfc050c8c_05088c08_0c8c08f4_8c08f405_8838810b_08fc0508_f4050c8c_800b8c08;
-defparam bootram.RAM4.INIT_3F=256'hfc050888_050c8c08_0b8c08f0_8c050c80_08308c08_8c088c05_8025ab38_088c0508;
-defparam bootram.RAM5.INIT_00=256'h88050851_08528c08_8c088c05_050c8053_088c08fc_8c08f005_08f0050c_38810b8c;
-defparam bootram.RAM5.INIT_01=256'h08f8050c_0508308c_388c08f8_08802e8c_8c08fc05_f8050c54_08708c08_81a73f80;
-defparam bootram.RAM5.INIT_02=256'h050c8c08_0b8c08fc_fb3d0d80_08028c0c_8c0c048c_54893d0d_0870800c_8c08f805;
-defparam bootram.RAM5.INIT_03=256'h05088025_0c8c088c_8c08fc05_050c810b_308c0888_08880508_2593388c_88050880;
-defparam bootram.RAM5.INIT_04=256'h3f800870_050851ad_528c0888_088c0508_0c81538c_8c088c05_8c050830_8c388c08;
-defparam bootram.RAM5.INIT_05=256'hf8050870_050c8c08_308c08f8_08f80508_2e8c388c_fc050880_0c548c08_8c08f805;
-defparam bootram.RAM5.INIT_06=256'hf8050c8c_800b8c08_08fc050c_0d810b8c_8c0cfd3d_048c0802_3d0d8c0c_800c5487;
-defparam bootram.RAM5.INIT_07=256'h2499388c_088c0508_38800b8c_08802ea3_8c08fc05_0827ac38_8c088805_088c0508;
-defparam bootram.RAM5.INIT_08=256'h802e80c9_08fc0508_0cc9398c_8c08fc05_fc050810_050c8c08_108c088c_088c0508;
-defparam bootram.RAM5.INIT_09=256'h050c8c08_318c0888_088c0508_8805088c_a1388c08_88050826_05088c08_388c088c;
-defparam bootram.RAM5.INIT_0A=256'h8c050881_050c8c08_2a8c08fc_fc050881_050c8c08_078c08f8_08fc0508_f805088c;
-defparam bootram.RAM5.INIT_0B=256'h0c518d39_8c08f405_88050870_8f388c08_0508802e_398c0890_050cffaf_2a8c088c;
-defparam bootram.RAM5.INIT_0C=256'h78777956_04fc3d0d_3d0d8c0c_08800c85_8c08f405_f4050c51_08708c08_8c08f805;
-defparam bootram.RAM5.INIT_0D=256'h74335253_a0387433_5271ff2e_b038ff12_5170802e_74078306_278c3874_56528372;
-defparam bootram.RAM5.INIT_0E=256'h0c863d0d_38800b80_098106e2_5571ff2e_ff145455_81158115_8106bd38_72712e09;
-defparam bootram.RAM5.INIT_0F=256'h38707355_718326e9_14545451_118414fc_068f3884_082e0981_51700873_04747454;
-defparam bootram.RAM5.INIT_10=256'h38727507_8f72278c_55555555_7670797b_04fc3d0d_0c863d0d_72713180_55ffaf39;
-defparam bootram.RAM5.INIT_11=256'hff125271_81055634_54337470_72708105_ff2e9838_ff125271_802ea738_83065170;
-defparam bootram.RAM5.INIT_12=256'h72708405_8405530c_54087170_72708405_0d047451_800c863d_06ea3874_ff2e0981;
-defparam bootram.RAM5.INIT_13=256'h8405530c_54087170_72708405_8405530c_54087170_72708405_8405530c_54087170;
-defparam bootram.RAM5.INIT_14=256'h718326ed_0cfc1252_70840553_05540871_38727084_83722795_8f26c938_f0125271;
-defparam bootram.RAM5.INIT_15=256'h83065170_278a3874_53558372_05335755_028c059f_0d767971_8339fc3d_387054ff;
-defparam bootram.RAM5.INIT_16=256'hef387480_2e098106_125271ff_055534ff_73737081_ff2e9338_ff125271_802ea238;
-defparam bootram.RAM5.INIT_17=256'h05530c72_72717084_7227a538_5154518f_71902b07_2b750770_04747488_0c863d0d;
-defparam bootram.RAM5.INIT_18=256'h83722790_8f26dd38_f0125271_8405530c_0c727170_70840553_530c7271_71708405;
-defparam bootram.RAM5.INIT_19=256'h54555552_787a7c70_39fa3d0d_7053ff90_8326f238_fc125271_8405530c_38727170;
-defparam bootram.RAM5.INIT_1A=256'h74335651_b1387133_5372ff2e_d438ff13_70802e80_07830651_d9387174_72802e80;
-defparam bootram.RAM5.INIT_1B=256'h15ff1555_38811281_802e80fc_ff065170_87387081_72802e81_8106a938_74712e09;
-defparam bootram.RAM5.INIT_1C=256'h52527080_71713151_7581ff06_7081ff06_74335651_d1387133_2e098106_555272ff;
-defparam bootram.RAM5.INIT_1D=256'hfc135372_52ff9739_38747655_74082e88_88387108_55837327_04717457_0c883d0d;
-defparam bootram.RAM5.INIT_1E=256'h15841757_709a3884_06515151_84828180_120670f8_f7fbfdff_74087009_802eb138;
-defparam bootram.RAM5.INIT_1F=256'hfd3d0d80_883d0d04_800b800c_52fedf39_38747655_76082ed0_d0387408_55837327;
-defparam bootram.RAM5.INIT_20=256'h528151ff_3f80e4f4_3fffafe8_0cffb0cc_7380efec_812e9e38_08545472_0b80e4b4;
-defparam bootram.RAM5.INIT_21=256'hffb7c13f_f4528151_cb3f80e4_af3fffaf_ec0cffb0_3f7280ef_0851f6a3_b7de3f80;
-defparam bootram.RAM5.INIT_22=256'h2dfc1270_2e913870_525270ff_fc057008_80e4fc0b_39ff3d0d_863f00ff_800851f6;
-defparam bootram.RAM5.INIT_23=256'h21457272_00000040_04000000_ffb0da3f_3d0d0404_06f13883_ff2e0981_08525270;
-defparam bootram.RAM5.INIT_24=256'h3a204578_646c6572_2068616e_636b6574_6c207061_6e74726f_6e20636f_6f722069;
-defparam bootram.RAM5.INIT_25=256'h25642c20_62657220_206e756d_6c697479_74696269_6f6d7061_65642063_70656374;
-defparam bootram.RAM5.INIT_26=256'h6c207061_6e74726f_6e20636f_6f722069_21457272_25640a00_676f7420_62757420;
-defparam bootram.RAM5.INIT_27=256'h6164206c_61796c6f_65642070_70656374_3a204578_646c6572_2068616e_636b6574;
-defparam bootram.RAM5.INIT_28=256'h206c696e_0a657468_0a000000_74202564_7420676f_2c206275_68202564_656e6774;
-defparam bootram.RAM5.INIT_29=256'h50204e32_0a555352_640a0000_203d2025_70656564_643a2073_616e6765_6b206368;
-defparam bootram.RAM5.INIT_2A=256'h70617469_20636f6d_46504741_720a0000_6f616465_6f6f746c_44502062_31302055;
-defparam bootram.RAM5.INIT_2B=256'h20636f6d_77617265_4669726d_640a0000_723a2025_756d6265_7479206e_62696c69;
-defparam bootram.RAM5.INIT_2C=256'h00000000_61646472_640a0000_723a2025_756d6265_7479206e_62696c69_70617469;
-defparam bootram.RAM5.INIT_2D=256'h00000699_00000000_65743a20_7061636b_65727920_65636f76_69702072_476f7420;
-defparam bootram.RAM5.INIT_2E=256'h000006ee_00000705_0000079e_0000079e_0000079e_0000079e_0000079e_0000079e;
-defparam bootram.RAM5.INIT_2F=256'h0000079e_0000079e_0000079e_0000079e_0000079e_00000774_0000079e_0000079e;
-defparam bootram.RAM5.INIT_30=256'h00000762_00000755_0000074e_00000747_00000742_0000073d_000006a6_00000722;
-defparam bootram.RAM5.INIT_31=256'h25642e25_45000000_01b200d9_05160364_14580a2c_3fff0000_0050c285_c0a80a02;
-defparam bootram.RAM5.INIT_32=256'hffffffff_00000000_43444546_38394142_34353637_30313233_2e256400_642e2564;
-defparam bootram.RAM5.INIT_33=256'h6f66206c_656e7420_69676e6d_6420616c_3a206261_5f706b74_73656e64_ffff0000;
-defparam bootram.RAM5.INIT_34=256'h6661696c_6f6e3a20_636f6d6d_6e65745f_66000000_72206275_6e642f6f_656e2061;
-defparam bootram.RAM5.INIT_35=256'h00000000_666f7220_696e6720_6c6f6f6b_63686520_74206361_6f206869_65642074;
-defparam bootram.RAM5.INIT_36=256'h0a000000_3d202564_697a6520_72642073_20776569_6172703a_646c655f_0a68616e;
-defparam bootram.RAM5.INIT_37=256'h2025640a_3a202564_67746873_206c656e_74656e74_6e736973_696e636f_55445020;
-defparam bootram.RAM5.INIT_38=256'h61666520_696e2073_50322b20_20555352_74696e67_53746172_0b0b0b0b_00000000;
-defparam bootram.RAM5.INIT_39=256'h00000000_6172652e_69726d77_66652066_67207361_6164696e_2e204c6f_6d6f6465;
-defparam bootram.RAM5.INIT_3A=256'h6e204650_6374696f_726f6475_69642070_2076616c_20666f72_6b696e67_43686563;
-defparam bootram.RAM5.INIT_3B=256'h20465047_74696f6e_6f647563_64207072_56616c69_2e2e2e00_6d616765_47412069;
-defparam bootram.RAM5.INIT_3C=256'h20626f6f_6720746f_7074696e_7474656d_642e2041_666f756e_61676520_4120696d;
-defparam bootram.RAM5.INIT_3D=256'h20696d61_46504741_696f6e20_64756374_2070726f_616c6964_4e6f2076_742e0000;
-defparam bootram.RAM5.INIT_3E=256'h20627569_6820746f_726f7567_67207468_6c6c696e_2e0a4661_6f756e64_67652066;
-defparam bootram.RAM5.INIT_3F=256'h74696f6e_6f647563_64207072_56616c69_72652e00_726d7761_6e206669_6c742d69;
-defparam bootram.RAM6.INIT_00=256'h46696e69_2e2e2e00_64696e67_204c6f61_756e642e_6520666f_6d776172_20666972;
-defparam bootram.RAM6.INIT_01=256'h2e000000_6d616765_6e672069_61727469_2e205374_64696e67_206c6f61_73686564;
-defparam bootram.RAM6.INIT_02=256'h72616d21_70726f67_61696e20_6f6d206d_6e206672_65747572_523a2052_4552524f;
-defparam bootram.RAM6.INIT_03=256'h4e6f2076_6e210000_61707065_65722068_206e6576_6f756c64_73207368_20546869;
-defparam bootram.RAM6.INIT_04=256'h6e642e20_20666f75_77617265_6669726d_696f6e20_64756374_2070726f_616c6964;
-defparam bootram.RAM6.INIT_05=256'h6669726d_2d696e20_75696c74_746f2062_75676820_7468726f_696e6720_46616c6c;
-defparam bootram.RAM6.INIT_06=256'h4e4f4e45_00000000_2025640a_7420746f_64207365_53706565_2e000000_77617265;
-defparam bootram.RAM6.INIT_07=256'h43000000_45545249_53594d4d_58000000_57455f52_58000000_57455f54_00000000;
-defparam bootram.RAM6.INIT_08=256'h4155544f_5048595f_6c3a2000_6e74726f_7720636f_20666c6f_726e6574_65746865;
-defparam bootram.RAM6.INIT_09=256'h780a0000_20307825_20676f74_7825782c_74652030_2077726f_4144563a_4e45475f;
-defparam bootram.RAM6.INIT_0A=256'h64617465_6e207570_6f722069_21457272_00030203_00000001_00030003_00000000;
-defparam bootram.RAM6.INIT_0B=256'h796c6f61_64207061_65637465_20457870_6c65723a_68616e64_6b657420_20706163;
-defparam bootram.RAM6.INIT_0C=256'h00002042_00000000_2025640a_20676f74_20627574_2025642c_6e677468_64206c65;
-defparam bootram.RAM6.INIT_0D=256'h00002102_00002102_00002102_0000207b_0000209d_000020b2_00002102_00002102;
-defparam bootram.RAM6.INIT_0E=256'h00002102_00002102_00002102_00002102_00002102_00002102_00002102_00002102;
-defparam bootram.RAM6.INIT_0F=256'h6f72740a_0a0a6162_000020ce_0000208d_00002102_00002102_000020f8_000020e1;
-defparam bootram.RAM6.INIT_10=256'h65000000_792e6578_64756d6d_43444546_38394142_34353637_30313233_00000000;
-defparam bootram.RAM6.INIT_11=256'h00003284_00000000_00000000_00000000_ffffff00_ffff00ff_ff00ffff_00ffffff;
-defparam bootram.RAM6.INIT_12=256'h000b0000_0018000f_ffff0031_05050400_01010100_3fff0000_0050c285_c0a80a02;
-defparam bootram.RAM6.INIT_13=256'h00000000_ffffffff_00003214_10101200_000030f4_000030ec_000030e4_000030dc;
-defparam bootram.RAM6.INIT_14=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_ffffffff;
-defparam bootram.RAM6.INIT_15=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000;
-defparam bootram.RAM6.INIT_16=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000;
-defparam bootram.RAM6.INIT_17=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000;
-defparam bootram.RAM6.INIT_18=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000;
-defparam bootram.RAM6.INIT_19=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000;
-defparam bootram.RAM6.INIT_1A=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000;
-defparam bootram.RAM6.INIT_1B=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000;
-defparam bootram.RAM6.INIT_1C=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000;
-defparam bootram.RAM6.INIT_1D=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000;
-defparam bootram.RAM6.INIT_1E=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000;
-defparam bootram.RAM6.INIT_1F=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000;
-defparam bootram.RAM6.INIT_20=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000;
-defparam bootram.RAM6.INIT_21=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000;
+defparam bootram.RAM0.INIT_23=256'h800b80e8_b40c82a0_0b0b80e8_8380800b_822ebd38_80e7e808_802ea438_80e7e408;
+defparam bootram.RAM0.INIT_24=256'h0b80e8b8_80808280_e8b40cf8_0b0b0b80_808080a4_bc0c04f8_800b80e8_b80c8290;
+defparam bootram.RAM0.INIT_25=256'h940b80e8_80c0a880_80e8b40c_8c0b0b0b_80c0a880_e8bc0c04_84800b80_0cf88080;
+defparam bootram.RAM0.INIT_26=256'h70085252_80e7f008_5170a738_80e8c033_04ff3d0d_80e8bc0c_80dca40b_b80c0b0b;
+defparam bootram.RAM0.INIT_27=256'hc034833d_810b80e8_5270ee38_08700852_2d80e7f0_e7f00c70_38841280_70802e94;
+defparam bootram.RAM0.INIT_28=256'h38823d0d_09810685_800b802e_0b0b0b0b_802e8e38_80e8b008_3d0d0b0b_0d040480;
+defparam bootram.RAM0.INIT_29=256'h389d3d22_5b7a80c4_0da13d08_0404e63d_3f823d0d_0b0bf5d4_e8b0510b_040b0b80;
+defparam bootram.RAM0.INIT_2A=256'h862e8c38_39798380_8e3882fb_8380842e_248b3879_79838085_852eac38_5a798380;
+defparam bootram.RAM0.INIT_2B=256'h0c82d439_7a80e8c4_81e4d00c_0c86397a_0b81e2cc_0c8e3981_0b81e18c_82f13981;
+defparam bootram.RAM0.INIT_2C=256'h82b53979_842e9f38_38798380_8085248b_a7387983_8380852e_225b4079_800ba03d;
+defparam bootram.RAM0.INIT_2D=256'h4288539d_83409a3d_81408339_82408739_3882a439_80872e8c_8b387983_8380862e;
+defparam bootram.RAM0.INIT_2E=256'h9d3df405_963d7053_80cbe43f_3d526251_4388539d_f23f983d_615180cb_3d880552;
+defparam bootram.RAM0.INIT_2F=256'h3f800808_68458cde_22993d23_08498e1b_fb38881b_3d082780_3f8f0ba3_5241acb8;
+defparam bootram.RAM0.INIT_30=256'h9c3de405_08456052_cf3f8008_2e88388c_5b5b7a7a_06657b06_8008087a_5a8ccd3f;
+defparam bootram.RAM0.INIT_31=256'hff5b7a44_51a0da3f_9c3de405_81068b38_797b2e09_065a805b_800881ff_51abf93f;
+defparam bootram.RAM0.INIT_32=256'h887c26ed_34811c5c_5b79337b_3d7d055b_5c7b1d9e_0b833d5e_e0055480_84559c3d;
+defparam bootram.RAM0.INIT_33=256'h621d5b5b_5e5c7b1d_800b883d_615b5f5f_08028405_8bdc3f80_519ff53f_389f3d22;
+defparam bootram.RAM0.INIT_34=256'h811c5c88_79337b34_631d5b5b_5e5c7b1d_800b901f_7c26ef38_811c5c88_79337b34;
+defparam bootram.RAM0.INIT_35=256'h805c7b1e_7c26ef38_811c5c86_79337b34_7f1d5b5b_5e5c7b1d_800b881f_7c26ef38;
+defparam bootram.RAM0.INIT_36=256'h84120859_3d0d686a_3d0d04ee_9af13f9c_7c26ef38_811c5c86_79337b34_611d5b5b;
+defparam bootram.RAM0.INIT_37=256'h95e93f80_80dca851_75538c52_802e8c38_2e943875_0856758c_279c3877_5a588379;
+defparam bootram.RAM0.INIT_38=256'hff9f1756_8818085d_8c5ba05c_d63fa057_dcf85195_53a45280_268e3878_e15778a3;
+defparam bootram.RAM0.INIT_39=256'heb399518_08085e81_8a9a3f80_0480c15c_05567508_2980dee8_81387584_75922682;
+defparam bootram.RAM0.INIT_3A=256'h97193357_0852800b_08538c18_33549018_76559618_83388457_7580f22e_33568257;
+defparam bootram.RAM0.INIT_3B=256'h3dea0553_33705495_b3398d18_80d35c81_3f80085f_76519791_83388157_5775772e;
+defparam bootram.RAM0.INIT_3C=256'h3f80c85c_52568ecc_538c1933_70548e19_398d1833_80c95c94_568dbf3f_8c193352;
+defparam bootram.RAM0.INIT_3D=256'h058c1908_2980dfb4_c2387584_75852680_33ff0556_ff399418_b5053480_75028405;
+defparam bootram.RAM0.INIT_3E=256'h39768429_2277239b_a2399218_1808770c_5fa93990_ae397622_0476085f_58567508;
+defparam bootram.RAM0.INIT_3F=256'h785e80cc_d25cad39_710c5680_05901908_2980e8c4_8e397684_70084056_80e8c405;
+defparam bootram.RAM1.INIT_00=256'h81185888_75337734_79055757_7719963d_833d5a58_0554800b_55943ddc_5c8c1808;
+defparam bootram.RAM1.INIT_01=256'h57753377_3d790557_58771996_0b833d5a_dc055480_a455943d_a439a05c_7826ed38;
+defparam bootram.RAM1.INIT_02=256'hc4525393_705380dd_fe3d0d74_943d0d04_519c8d3f_38838080_887826ed_34811858;
+defparam bootram.RAM1.INIT_03=256'h88b33f72_a0527251_a33f8d39_90b83f9d_c43f8151_52a05188_2e9238a0_863f7280;
+defparam bootram.RAM1.INIT_04=256'h805192c7_8a5280de_5189a43f_3f80dde4_973fa5de_fa3d0d82_843d0d04_5190a73f;
+defparam bootram.RAM1.INIT_05=256'h90fc3f88_3f800851_e23f878e_abe53f87_80e8e00c_be3f820b_dea05192_3f8c5280;
+defparam bootram.RAM1.INIT_06=256'h95b83f86_52800851_86f03f73_3f800854_b53f8780_91963f88_3f800851_c13f878c;
+defparam bootram.RAM1.INIT_07=256'h83808451_3f8ab252_805195fe_d7528380_95c23f8d_518f873f_85528008_ef3f8380;
+defparam bootram.RAM1.INIT_08=256'h875195d6_b2528380_95e03f8a_83808551_3f8ab252_865195ea_b2528380_95f43f8a;
+defparam bootram.RAM1.INIT_09=256'h8e3faea0_90d451ac_518ef33f_a7bb3f80_83809251_5195cb3f_52838082_3f80c3cf;
+defparam bootram.RAM1.INIT_0A=256'h82fdee2e_22555573_80088e05_80c93876_8008802e_3f800856_05518eea_3f883dfc;
+defparam bootram.RAM1.INIT_0B=256'h90e93f94_80decc51_80089a38_80c6f03f_08900551_dec45280_38845380_098106ad;
+defparam bootram.RAM1.INIT_0C=256'h8e3f8ce1_8def3fa7_519c863f_39745275_85e03f88_f93f7351_8fda3f86_16705254;
+defparam bootram.RAM1.INIT_0D=256'h51868f3f_3f9f5280_963f88e6_87ea3f8c_3f82b73f_c23f92b1_fe3d0d86_3fff9e39;
+defparam bootram.RAM1.INIT_0E=256'h885185d1_c83f8852_82ac518b_5185de3f_3f845284_ac518bd5_85eb3f82_9f528051;
+defparam bootram.RAM1.INIT_0F=256'h3f80e451_805185b5_82539f52_518bae3f_c43f82ac_52905185_8bbb3f90_3f82ac51;
+defparam bootram.RAM1.INIT_10=256'h85b03f9f_9f529e51_8025df38_ff135372_518b923f_a83f80e4_529c5185_8b9f3f9f;
+defparam bootram.RAM1.INIT_11=256'h8b2a8106_808c0870_803d0d82_843d0d04_810b800c_81e0840c_8c3f890b_52815185;
+defparam bootram.RAM1.INIT_12=256'h57585957_82055a57_30708025_a7053370_7f028c05_3d0d7a7d_3d0d04f9_800c5182;
+defparam bootram.RAM1.INIT_13=256'h51538054_30709f2a_388a5573_88557383_832e8838_88055575_38728025_75822e93;
+defparam bootram.RAM1.INIT_14=256'h54548054_842b0751_fe057072_05777131_76812cff_802e9738_38725472_8177259e;
+defparam bootram.RAM1.INIT_15=256'h51b0b43f_73528118_51b0bc3f_ff065277_c63f7281_527b51b0_81805474_86397353;
+defparam bootram.RAM1.INIT_16=256'h527551fe_54bd5378_815580ca_9f053356_fb3d0d02_893d0d04_51b0ac3f_815280da;
+defparam bootram.RAM1.INIT_17=256'h81ff0653_bb3f8008_51d63ffe_3f815281_c551b083_0d815280_0d04fe3d_e63f873d;
+defparam bootram.RAM1.INIT_18=256'h81705654_787a5757_04fa3d0d_53843d0d_81e0800c_08709007_3881e080_72802ef3;
+defparam bootram.RAM1.INIT_19=256'h38805581_81ff2e83_71335271_83388054_5270802e_17703352_279e3872_80537276;
+defparam bootram.RAM1.INIT_1A=256'h33557481_0d80e8e4_0d04fc3d_800c883d_38815170_70802e83_74740751_1353df39;
+defparam bootram.RAM1.INIT_1B=256'h74802e95_81ff0655_9e3f8008_80d051b0_e8538252_865480e8_80e8e434_e138810b;
+defparam bootram.RAM1.INIT_1C=256'he8e85180_dfcc5280_38865380_74802e8f_81ff0655_8c3f8008_e8e851ff_38865280;
+defparam bootram.RAM1.INIT_1D=256'h845280e8_802e9538_ff065574_3f800881_d051afe3_538c5280_5480e8f0_c0993f84;
+defparam bootram.RAM1.INIT_1E=256'hf453b852_845480e8_80e8f00c_80dfd408_802e8938_ff065574_3f800881_f051fed1;
+defparam bootram.RAM1.INIT_1F=256'h81ff0655_9c3f8008_e8f451fe_38845280_74802e95_81ff0655_ae3f8008_80d051af;
+defparam bootram.RAM1.INIT_20=256'h0881ff06_aef93f80_5280d051_e8f85388_0c845480_0880e8f4_3880dfd8_74802e89;
+defparam bootram.RAM1.INIT_21=256'hdc0880e8_893880df_5574802e_0881ff06_fde73f80_80e8f851_95388452_5574802e;
+defparam bootram.RAM1.INIT_22=256'h3f80e8f8_0c04fdfa_e8f00b80_fe843f80_0b800c04_3f80e8e8_0d04fe8e_f80c863d;
+defparam bootram.RAM1.INIT_23=256'had993f80_5280d051_5475538c_0d775684_0c04fb3d_e8f40b80_fdf03f80_0b800c04;
+defparam bootram.RAM1.INIT_24=256'h80e8e434_3d0d810b_3d0d04fe_74800c87_80e8f00c_87387508_5574802e_0881ff06;
+defparam bootram.RAM1.INIT_25=256'hfc080607_067180e8_73097375_04803d0d_3f843d0d_e851be8f_cc5280e8_945380df;
+defparam bootram.RAM1.INIT_26=256'h077080e9_e9800806_75067180_0d730973_0d04803d_0c51823d_0c81e08c_7080e8fc;
+defparam bootram.RAM1.INIT_27=256'h800c843d_81c73f72_53538051_3d0d7470_af3f04fe_3d0d0481_980c5182_800c81e0;
+defparam bootram.RAM1.INIT_28=256'h06545472_337081ff_79565674_fb3d0d77_833d0d04_5181b63f_0d8a5280_0d04ff3d;
+defparam bootram.RAM1.INIT_29=256'h3d0d7352_3d0d04ff_0b800c87_3fe53980_52558191_ff065376_81157481_802e9038;
+defparam bootram.RAM1.INIT_2A=256'h0b800c84_80e73f80_8a527251_53ffbd3f_76537052_fe3d0d74_833d0d04_8051cd3f;
+defparam bootram.RAM1.INIT_2B=256'h1234823d_3380e7f4_51028f05_803d0d72_833d0d04_8051dd3f_3d0d7352_3d0d04ff;
+defparam bootram.RAM1.INIT_2C=256'hfe3d0d80_833d0d04_720c5351_e0057022_751080df_82908005_0d73a029_0d04ff3d;
+defparam bootram.RAM1.INIT_2D=256'h38843d0d_827325e5_3f811353_527251ce_e7f81333_51c63f80_13335272_5380e7f4;
+defparam bootram.RAM1.INIT_2E=256'h87388d52_2e098106_33537281_80e7f414_81069538_748a2e09_76785654_04fc3d0d;
+defparam bootram.RAM1.INIT_2F=256'h04fe3d0d_0c863d0d_38748c15_72802ef8_84140853_90800554_73a02982_7351de3f;
+defparam bootram.RAM1.INIT_30=256'h0d04ff3d_800c843d_12085372_2e853890_ff537080_11085252_90800588_74a02982;
+defparam bootram.RAM1.INIT_31=256'h800b81a8_840c5181_882a81a8_a8800c70_81ff0681_e8802270_a8880c80_0d800b81;
+defparam bootram.RAM1.INIT_32=256'h81a89008_2e818638_81517180_33555354_88059705_0d767802_0d04fd3d_880c833d;
+defparam bootram.RAM1.INIT_33=256'ha8900870_a8900c81_81900b81_81a88c0c_72108107_5170f138_81065151_70862a70;
+defparam bootram.RAM1.INIT_34=256'h70802eba_51515151_06708132_872a7081_a8900870_70f13881_06515151_812a7081;
+defparam bootram.RAM1.INIT_35=256'h70810651_0870812a_0c81a890_7081a890_8338a051_5171812e_b13880e8_3871802e;
+defparam bootram.RAM1.INIT_36=256'h0b81a890_883980c0_cc398151_34ff1252_70810556_08517074_3881a88c_515170f1;
+defparam bootram.RAM1.INIT_37=256'h2a708106_90087086_535481a8_97053355_78028805_fd3d0d76_853d0d04_0c70800c;
+defparam bootram.RAM1.INIT_38=256'h81a89008_81a8900c_81905170_802e8438_81d05171_81a88c0c_f1387210_51515170;
+defparam bootram.RAM1.INIT_39=256'h5170802e_32515151_81067081_70872a70_81a89008_5170f138_81065151_70812a70;
+defparam bootram.RAM1.INIT_3A=256'h900c81a8_517081a8_2e833890_d0517181_a88c0c80_38733381_802e80c5_80cf3871;
+defparam bootram.RAM1.INIT_3B=256'h51515170_70813251_2a708106_90087087_f13881a8_51515170_2a708106_90087081;
+defparam bootram.RAM1.INIT_3C=256'h0c853d0d_80517080_81a8900c_3980c00b_3981518a_5354ffb7_8114ff13_802e8e38;
+defparam bootram.RAM1.INIT_3D=256'h8d9f7127_31515186_ac087073_085281b8_3881b8ac_7274259b_75548053_04fd3d0d;
+defparam bootram.RAM1.INIT_3E=256'h0b828084_80800cef_81e20b82_8280880c_3d0dff0b_3d0d04ff_53e23985_f1388113;
+defparam bootram.RAM1.INIT_3F=256'h38833d0d_708025f1_0cff1151_70840554_51a0f172_f3a85287_808c0c80_0cff0b82;
+defparam bootram.RAM2.INIT_00=256'h74760652_f3a85555_53810b80_58515280_8c087106_70098280_82808808_04fb3d0d;
+defparam bootram.RAM2.INIT_01=256'h877325dc_10575553_13841576_0c8f3981_7482808c_0852712d_38725173_71802e8f;
+defparam bootram.RAM2.INIT_02=256'h2b700982_0c518172_a8057571_842980f3_269f3871_73527187_04ff3d0d_38873d0d;
+defparam bootram.RAM2.INIT_03=256'h81e0c40c_22747008_0d029205_0404ff3d_52833d0d_880c5351_72068280_80880870;
+defparam bootram.RAM2.INIT_04=256'h802ef338_06515170_a0087084_cc0c81b8_810b81e0_04803d0d_0c833d0d_5281e0c8;
+defparam bootram.RAM2.INIT_05=256'h54527280_08708106_0d81b8a0_0c04fe3d_7181e0c0_0d04de3f_cc0c823d_820b81e0;
+defparam bootram.RAM2.INIT_06=256'h5271802e_70810651_3971812a_8080529a_0c535381_71902a71_b8a00875_2e933881;
+defparam bootram.RAM2.INIT_07=256'h7080c006_81b8a008_04803d0d_0c843d0d_72527180_3fff9e3f_ec51f8d3_8b3880df;
+defparam bootram.RAM2.INIT_08=256'h0781e0cc_70902b88_028e0522_04ff3d0d_0c823d0d_80800b80_2ef23881_51517080;
+defparam bootram.RAM2.INIT_09=256'h0d755480_0d04fd3d_cc0c833d_840b81e0_802ef338_06515170_a0087090_0c5281b8;
+defparam bootram.RAM2.INIT_0A=256'h853d0d04_7327e638_81135385_52a6ff3f_14703352_f7a53f72_8638ba51_5372802e;
+defparam bootram.RAM2.INIT_0B=256'h3d0d04f6_80ed3f87_80dff051_70335356_81113354_82113355_83113356_fb3d0d77;
+defparam bootram.RAM2.INIT_0C=256'h3875802e_7680258f_5d5b5957_2a515b5f_7030709f_05bb0533_61630290_3d0d7c7e;
+defparam bootram.RAM2.INIT_0D=256'h3f800851_7651aec5_80537752_79557854_77269438_76305777_ad51782d_8a387952;
+defparam bootram.RAM2.INIT_0E=256'h8b053351_803d0d02_8c3d0d04_3351782d_80dffc05_dd3f8008_527651ae_ffbd3f77;
+defparam bootram.RAM2.INIT_0F=256'h06575775_337081ff_5c5a5878_5208a3d8_70708405_3d0d8c3d_3d0d04f7_f68d3f82;
+defparam bootram.RAM2.INIT_10=256'h2e80fb38_597580f0_19703357_80db3881_2e098106_065675a5_387681ff_802e81d1;
+defparam bootram.RAM2.INIT_11=256'h80e42e80_81953975_2e819e38_8a387580_7580e324_e32eb938_a0387580_7580f024;
+defparam bootram.RAM2.INIT_12=256'h80f82eba_80f53975_2e80db38_387580f3_80f5248b_2eac3875_397580f5_c638818b;
+defparam bootram.RAM2.INIT_13=256'h59568055_19710852_da397784_51792d80_56805275_12335259_77841983_3880ec39;
+defparam bootram.RAM2.INIT_14=256'h19710852_92397784_81538a52_55a3d854_52595680_84197108_53903977_a3d85480;
+defparam bootram.RAM2.INIT_15=256'h5675802e_59567633_19710859_9e397784_51fdd03f_53905275_a3d85480_59568055;
+defparam bootram.RAM2.INIT_16=256'h048a0b81_0c8b3d0d_39800b80_1959fea3_2dec3981_58335179_76708105_8e388052;
+defparam bootram.RAM2.INIT_17=256'h04fc3d0d_38823d0d_515170ef_70810651_8c2a8132_b8b40870_803d0d81_e0d00c04;
+defparam bootram.RAM2.INIT_18=256'h0a075272_86387181_5570802e_55555654_07728106_72982b7b_059b0533_797b0288;
+defparam bootram.RAM2.INIT_19=256'h7181e0d4_51ffa93f_79712b51_52a07531_71820a07_802e8638_06515170_822a7081;
+defparam bootram.RAM2.INIT_1A=256'hfc3d0d76_863d0d04_5170800c_81b88008_38ff953f_73802e89_d80c7351_0c7081e0;
+defparam bootram.RAM2.INIT_1B=256'h2a517080_ee397190_15555351_22730581_72101570_74278f38_55805372_787a5455;
+defparam bootram.RAM2.INIT_1C=256'h5280e988_0d865375_0d04fd3d_800c863d_52ec3971_72902a05_83ffff06_2e8d3871;
+defparam bootram.RAM2.INIT_1D=256'h8812ff12_5180720c_e9985289_ff3d0d80_853d0d04_e9900c54_76700880_51b0983f;
+defparam bootram.RAM2.INIT_1E=256'h5472742e_52527022_0b80e994_05225380_3d0d0296_3d0d04fd_25f33883_52527080;
+defparam bootram.RAM2.INIT_1F=256'h83ffff06_0d787a71_0d04fa3d_800c853d_38805170_897225ee_88125252_8e388112;
+defparam bootram.RAM2.INIT_20=256'h55555573_0b80e994_0880e998_0cad3980_80088405_2e893876_3f800880_535856c7;
+defparam bootram.RAM2.INIT_21=256'h84140c88_75732376_389dad3f_897525eb_88145455_8f388115_5271802e_08881555;
+defparam bootram.RAM2.INIT_22=256'h913ddc05_3d880552_3f735392_5254aee7_923dd605_54933d53_3d0d8670_3d0d04f1;
+defparam bootram.RAM2.INIT_23=256'h8c3d2381_0523800b_028405a6_8b3d2380_818a800b_05a20523_90800284_51aed83f;
+defparam bootram.RAM2.INIT_24=256'h8a52913d_665e8053_0523685d_028405ae_8d3d2380_80c0910b_05aa0523_80800284;
+defparam bootram.RAM2.INIT_25=256'h23800b91_8405ba05_963d2202_22903d23_0523983d_028405ae_b73f8008_e40551fd;
+defparam bootram.RAM2.INIT_26=256'h913d0d04_519fb03f_81e68405_6980c029_3dd40552_23ac5391_8405be05_3d238002;
+defparam bootram.RAM2.INIT_27=256'h529a3df8_5380e988_adc53f86_3df20551_9b3d529a_3d238653_5b800b97_e83d0d80;
+defparam bootram.RAM2.INIT_28=256'h9b3dc411_585a800b_80088008_23f7e23f_0580e205_05220284_3f0280f2_0551adb7;
+defparam bootram.RAM2.INIT_29=256'h8305fc06_5fa33d08_5ea13d08_5c905d6e_08465984_0845a33d_6e44a13d_43f00543;
+defparam bootram.RAM2.INIT_2A=256'h0c750854_84387376_55737527_3151565a_31908071_701a787c_84587508_408c3d56;
+defparam bootram.RAM2.INIT_2B=256'he63f7508_e09851ef_2e883880_06547380_94160883_54738c38_38738306_73802e9a;
+defparam bootram.RAM2.INIT_2C=256'hbf268438_ffac3878_57778025_17ff1959_84055708_823f7570_5276519e_53941608;
+defparam bootram.RAM2.INIT_2D=256'h7f1f9405_0b943d23_40818a80_0d6b6e40_0d04ea3d_e83f9a3d_822a51f6_80c05978;
+defparam bootram.RAM2.INIT_2E=256'h075a7996_6980c080_80ce0523_80028405_3d238180_23800b95_0580ca05_5a790284;
+defparam bootram.RAM2.INIT_2F=256'h3f800809_525cfae0_52933d70_4780538a_90084668_052380e9_840580d2_3d238002;
+defparam bootram.RAM2.INIT_30=256'h79923880_81ff065a_873f8008_535c5e8c_53983d70_23913d70_0580d205_5a790284;
+defparam bootram.RAM2.INIT_31=256'h7b549080_575d9455_5960586b_027f5a6d_d53fa939_f6b63fed_c23f7a51_e0c451f7;
+defparam bootram.RAM2.INIT_32=256'hf73d0d7f_983d0d04_38fd893f_867c26ef_34811c5c_5b79337b_1d7c1f5b_53805c7b;
+defparam bootram.RAM2.INIT_33=256'ha6052377_80028405_768b3d23_23881857_8405a205_8d3d2202_228a3d23_5802ae05;
+defparam bootram.RAM2.INIT_34=256'h23908002_810b8e3d_04ee3d0d_3f8b3d0d_7d51fe9e_05539152_548b3df8_567e5588;
+defparam bootram.RAM2.INIT_35=256'h53800852_eb8c3f86_05b60523_34810284_8405b505_3d348402_23860b8f_8405b205;
+defparam bootram.RAM2.INIT_36=256'h943df605_86538052_51a9e43f_943df205_53800852_eb863f84_51a9f43f_943dec05;
+defparam bootram.RAM2.INIT_37=256'h53805b7a_05549086_55943de4_5780569c_59805880_5a025c80_64700844_51aaf13f;
+defparam bootram.RAM2.INIT_38=256'h0b8e3d23_ee3d0d81_943d0d04_38fbcd3f_867b26ef_34811b5b_901b337a_1c5a80e0;
+defparam bootram.RAM2.INIT_39=256'h893f8653_b60523ea_81028405_05b50534_34840284_860b8f3d_05b20523_90800284;
+defparam bootram.RAM2.INIT_3A=256'h53805294_a8e13f86_3df20551_80085294_833f8453_a8f13fea_3dec0551_80085294;
+defparam bootram.RAM2.INIT_3B=256'he4055490_9c55943d_80578056_80598058_0843025c_e73f8008_a9ee3fe9_3df60551;
+defparam bootram.RAM2.INIT_3C=256'h04d83d0d_3f943d0d_ef38fac8_5b867b26_7a34811b_e0901b33_7a1c5a80_8653805b;
+defparam bootram.RAM2.INIT_3D=256'h5c799b26_29f2055b_ad3d0884_cc38901d_09810682_7e90862e_1122405d_ab3d088e;
+defparam bootram.RAM2.INIT_3E=256'h225a7990_9138821c_09810687_5a79812e_9d397b22_f49d3f87_80e0f451_8d387952;
+defparam bootram.RAM2.INIT_3F=256'h2e098106_225a7982_f538861c_09810686_798c842e_841c225a_06878338_802e0981;
+defparam bootram.RAM3.INIT_00=256'h79527a51_51a7a03f_981d5279_3d5a8653_a7ad3fa8_1d527a51_5b84539e_a238943d;
+defparam bootram.RAM3.INIT_01=256'h5b888c3f_a81d7052_4088943f_9e1d7052_0686bb38_812e0981_1c225a79_87953f86;
+defparam bootram.RAM3.INIT_02=256'h5a865380_9138a83d_5e800886_f63f8008_a40551a5_52aa3dff_5380e990_80084384;
+defparam bootram.RAM3.INIT_03=256'h34851c33_1c33a33d_82052384_02840581_23821c22_7b22a23d_51a6d43f_e9885279;
+defparam bootram.RAM3.INIT_04=256'h70547b53_a6a13f84_3de40551_537952aa_86052386_02840581_85053482_02840581;
+defparam bootram.RAM3.INIT_05=256'haa3df405_79537f52_51a6843f_981d527a_055b8653_3f028192_525aa693_ab3dea05;
+defparam bootram.RAM3.INIT_06=256'haa3ddc05_575d9c55_597e587e_027e5a7e_51a5ec3f_537a527f_9f3d4086_51a5f83f;
+defparam bootram.RAM3.INIT_07=256'h397e9080_e73f84ee_26ef38f7_1c5c867c_337b3481_1d5b5b79_5c7b1d60_547e537d;
+defparam bootram.RAM3.INIT_08=256'h2a708f06_d1387988_09810684_5b60842e_8c2a435b_1d702270_84e43890_2e098106;
+defparam bootram.RAM3.INIT_09=256'he0905282_5e865380_84b4387e_ff065f7e_1b2280ff_84c03886_2e098106_515a7985;
+defparam bootram.RAM3.INIT_0A=256'h08833881_a3ed3f80_70535b5c_80e99054_901c6255_38815e7e_3f800883_1d51a483;
+defparam bootram.RAM3.INIT_0B=256'h5d407f81_22ec1140_1b33821c_84c53f89_529c1d51_8138881d_7b802e84_5c7d8738;
+defparam bootram.RAM3.INIT_0C=256'h7a2e8f38_5d42407d_8411225d_7a08a41f_388c1b08_810683de_7f912e09_2e81bb38;
+defparam bootram.RAM3.INIT_0D=256'h08428008_f4913f80_22535d5d_e41d821d_bd39ac1d_f0bd3f83_80e19451_79537d52;
+defparam bootram.RAM3.INIT_0E=256'h3d408853_a3e13f9d_7d527951_5f5a8853_9b3d9a3d_3d237f4a_387a229a_802e83a6;
+defparam bootram.RAM3.INIT_0F=256'h88537952_51a3c03f_b4055279_53aa3dff_23604888_1b22983d_a3d53f82_79527f51;
+defparam bootram.RAM3.INIT_10=256'h7c26ef38_811c5c88_79337b34_7c1f5b5b_5e5c7b1d_557e843d_3f7b567c_7d51a3b7;
+defparam bootram.RAM3.INIT_11=256'had398c1b_5a792d82_61840508_7b26ef38_811b5b88_84051c34_5a793302_805b7f1b;
+defparam bootram.RAM3.INIT_12=256'h2e098106_335a7983_9539811a_81bb3882_387d882e_7d832e8a_33405b42_08a41e70;
+defparam bootram.RAM3.INIT_13=256'h3f800841_2251f2cf_81f4387c_2e098106_5e5c7991_8912335c_1d80c01e_81a238ac;
+defparam bootram.RAM3.INIT_14=256'h7d51a29b_88537a52_9c3d5c5e_794c993d_229c3d23_1c085a7c_80fe388c_8008802e;
+defparam bootram.RAM3.INIT_15=256'h3dcc0552_4e8853aa_9e3d2379_5a821d22_3f901c08_7f51a28f_88537d52_3f973d40;
+defparam bootram.RAM3.INIT_16=256'h5b79337b_1d7c1f5b_3d5e5c7b_7e557e84_ee3f7e56_527d51a1_3f88537a_7a51a1f7;
+defparam bootram.RAM3.INIT_17=256'h38608405_887b26ef_34811b5b_0284051c_1b5a7933_38805b7f_887c26ef_34811c5c;
+defparam bootram.RAM3.INIT_18=256'hd105347e_02840580_963d347e_1d5d5d7e_39ac1de4_e63f80de_80e951e3_085a792d;
+defparam bootram.RAM3.INIT_19=256'h3d70525b_53605295_d605237e_02840580_23861a22_1a22973d_d2052384_02840580;
+defparam bootram.RAM3.INIT_1A=256'h567c557d_d205237b_02840580_08095a79_f08e3f80_2a527c51_08537b81_f09a3f80;
+defparam bootram.RAM3.INIT_1B=256'h3d0d800b_e80c04fc_800b80e9_80e9e40c_0d04800b_c53faa3d_526151f4_547a537f;
+defparam bootram.RAM3.INIT_1C=256'h2e098106_53517075_71088c13_ec545651_700880e9_27a43876_55537274_80e9e408;
+defparam bootram.RAM3.INIT_1D=256'h71535755_3d0d7779_3d0d04fb_70800c86_e738ff51_53737326_8b398113_85387251;
+defparam bootram.RAM3.INIT_1E=256'he9e80881_0c8e3980_1480e9e4_26893881_08547387_3880e9e4_088025ba_ffb93f80;
+defparam bootram.RAM3.INIT_1F=256'he9f01451_53755280_0c515486_80e9ec12_822b7608_73101470_e9e80c54_11870680;
+defparam bootram.RAM3.INIT_20=256'hfd3d0d75_873d0d04_519fa43f_80e9f005_52738429_54865375_10800805_94398008;
+defparam bootram.RAM3.INIT_21=256'h5276519e_80e9f005_53738429_08055486_80081080_08249938_80547380_51fed83f;
+defparam bootram.RAM3.INIT_22=256'h14337088_902b0782_71982b71_33811233_3d0d7570_3d0d04fd_73800c85_fa3f8154;
+defparam bootram.RAM3.INIT_23=256'h22565957_7f80eacc_f93d0d7d_853d0d04_54565452_800c5253_16337107_2b720783;
+defparam bootram.RAM3.INIT_24=256'h902980ea_90291470_80d33873_54738326_72315256_8b3d2270_83ffff06_76a83873;
+defparam bootram.RAM3.INIT_25=256'h38749029_748326ad_31575754_3d227072_ffff068d_c0397383_76742380_d0055154;
+defparam bootram.RAM3.INIT_26=256'h33535474_38751770_75782791_ea3f8056_d005519d_902980ea_8a3d5273_15548853;
+defparam bootram.RAM3.INIT_27=256'hd0545480_800b80ea_80eacc23_029a0522_04fc3d0d_39893d0d_811656ec_51e1de3f;
+defparam bootram.RAM3.INIT_28=256'h14829014_eddc3f81_22740551_5280eacc_140cb8f4_800b828c_8288140c_7323800b;
+defparam bootram.RAM3.INIT_29=256'h06515675_81327081_5c847c2c_80ead05a_3d0d800b_3d0d04f4_27d93886_54548374;
+defparam bootram.RAM3.INIT_2A=256'h08ff2e80_e1a33f80_055b7b51_38781a88_ff2680d6_5b5d7981_82881a08_81be3875;
+defparam bootram.RAM3.INIT_2B=256'h58587680_53515951_71802507_30728025_728d3270_8a327030_81ff0670_c5388008;
+defparam bootram.RAM3.INIT_2C=256'h811a5a81_828c1a0c_1a0c800b_81058288_82881908_81055d34_5d777b70_2e833881;
+defparam bootram.RAM3.INIT_2D=256'h568b7627_828c1b0c_19088111_9138828c_80d2387c_1908802e_b1388288_ff7a27ff;
+defparam bootram.RAM3.INIT_2E=256'h57577533_771a781a_833d5b58_1954800b_19085588_ab388288_5675802e_bf387822;
+defparam bootram.RAM3.INIT_2F=256'h828c1a0c_1a0c800b_800b8288_51f0e93f_cc227c05_ef3880ea_58887826_77348118;
+defparam bootram.RAM3.INIT_30=256'h685194ba_5780c052_883d7054_04ea3d0d_388e3d0d_7c27fea9_1a5a5c83_811c8290;
+defparam bootram.RAM3.INIT_31=256'h94387416_2e098106_387381aa_81ff2e9d_33515473_55741770_059d0557_3f800284;
+defparam bootram.RAM3.INIT_32=256'h800c983d_38805473_be7527d1_39811555_3881548b_09810685_7381992e_70335154;
+defparam bootram.RAM3.INIT_33=256'hca3f8008_52735199_5380e1b8_3f805584_795193ea_54548452_0d863d70_0d04f93d;
+defparam bootram.RAM3.INIT_34=256'h3f8ac23f_3d0d8dd7_940c04fc_810b81e0_893d0d04_5574800c_06833881_752e0981;
+defparam bootram.RAM3.INIT_35=256'he1bc5181_73883880_06515154_8d2a7081_b8b40870_89c13f81_06558051_800881ff;
+defparam bootram.RAM3.INIT_36=256'h51dd843f_3880e2a0_08802e9a_febf3f80_b0800a51_51dd983f_3880e1f4_833974b5;
+defparam bootram.RAM3.INIT_37=256'h51fee33f_3998800a_d85180cc_b53f80e2_800a5184_e1b73fb0_3f82ac51_81518987;
+defparam bootram.RAM3.INIT_38=256'h80e3d051_5192bf3f_5298800a_5380ffff_3f838080_a451dcd7_bb3880e3_8008802e;
+defparam bootram.RAM3.INIT_39=256'he93f8839_3f805183_ac51e0e9_dcb13f82_80e3f451_3ffee53f_ac51e0f9_dcc13f82;
+defparam bootram.RAM3.INIT_3A=256'he5893fa0_e4fc5254_75705380_04fd3d0d_80f3900c_3d0d0471_dc9d3f86_80e4b051;
+defparam bootram.RAM3.INIT_3B=256'h528051da_fe3d0da0_853d0d04_7351722d_802e8538_90085372_cc3f80f3_52a051da;
+defparam bootram.RAM3.INIT_3C=256'hff0b8008_51898d3f_fc3d0d9a_843d0d04_8051722d_802e8538_90085372_b03f80f3;
+defparam bootram.RAM3.INIT_3D=256'h7182802e_5580e454_86800653_820b8008_2e80ec38_81557180_06515354_862a7081;
+defparam bootram.RAM3.INIT_3E=256'h845188c8_8338ff54_7184802e_3987e854_2e8e388a_8a547180_80248a38_9b387182;
+defparam bootram.RAM3.INIT_3F=256'h7080f39c_e5f41133_06720780_8a2c7083_8c068008_3f71882a_855188c0_3f800852;
+defparam bootram.RAM4.INIT_00=256'h80f39408_dac93f74_11085252_0680e888_71822b8c_52dab03f_55535154_0c80e5b4;
+defparam bootram.RAM4.INIT_01=256'h2e098106_9e397482_38fec13f_098106a3_3874812e_74822ea6_80f3940c_2e983874;
+defparam bootram.RAM4.INIT_02=256'h863d0d04_5187cd3f_fdfb3f99_a73f7351_f3980cfe_8e387380_f398082e_96387380;
+defparam bootram.RAM4.INIT_03=256'h3f8d5298_995187ac_80f3980c_940cff0b_800b80f3_5187a23f_e13f8008_fd3d0dd7;
+defparam bootram.RAM4.INIT_04=256'h908007f4_8f3f8008_3f845187_8451dfb1_3fbf9452_9c5187cd_81ae8052_5187d63f;
+defparam bootram.RAM4.INIT_05=256'hcc51e2a7_735280e5_38800853_80082e8d_86fa3f73_b03f8451_54845187_9f067053;
+defparam bootram.RAM4.INIT_06=256'h70852a82_02970533_04fd3d0d_3f853d0d_80518789_84800752_e33f8008_3f805186;
+defparam bootram.RAM4.INIT_07=256'h71730707_832ba006_10900674_73070773_2a880671_84067281_0771832a_0671872a;
+defparam bootram.RAM4.INIT_08=256'h51555255_0c515253_0682c080_077081ff_0778872b_c0067072_76852b80_7081ff06;
+defparam bootram.RAM4.INIT_09=256'h983f81aa_81ff51ff_51ff9e3f_075381ff_0681d00a_0d74d00a_0d04fe3d_5552853d;
+defparam bootram.RAM4.INIT_0A=256'h5252fef5_7081ff06_3f72882a_e151ff81_ff873f80_8c3fb251_819951ff_51ff923f;
+defparam bootram.RAM4.INIT_0B=256'h902a7081_fedb3f72_72982a51_51fee23f_e83f8181_3fb251fe_0651feed_3f7281ff;
+defparam bootram.RAM4.INIT_0C=256'ha051feb5_51feba3f_febf3f8e_c43f8051_81a151fe_51feca3f_fecf3fb0_ff065253;
+defparam bootram.RAM4.INIT_0D=256'h05538052_54873dfc_fb3d0d82_843d0d04_51fea63f_feab3f80_b03fa051_3f8051fe;
+defparam bootram.RAM4.INIT_0E=256'h12085859_d73d0884_d53d0880_b23d0d80_3d0d04ff_22800c87_ce3f863d_80d05183;
+defparam bootram.RAM4.INIT_0F=256'h2681b238_16567596_bc39ff9f_dff53f81_80e68451_53829452_26903877_57778293;
+defparam bootram.RAM4.INIT_10=256'h0b81e2cc_e18c0c81_5e810b81_3f800808_c15cd4c0_75080480_e6d00556_75842980;
+defparam bootram.RAM4.INIT_11=256'hfef63f80_5c80f839_085f80c6_8c9d3f80_3f80085e_8a398c99_e4d00c81_0c800b81;
+defparam bootram.RAM4.INIT_12=256'hc55c80d3_89f53f80_80f3c851_8c170852_90170853_5c80e839_065e80d6_0883ffff;
+defparam bootram.RAM4.INIT_13=256'h39941753_80c25cb7_c45cbc39_2e863880_06567580_800881ff_518aba3f_3980f3c8;
+defparam bootram.RAM4.INIT_14=256'h1708518b_1708528c_80055390_80d03dfe_d75ca439_88dc3f80_8c170851_90170852;
+defparam bootram.RAM4.INIT_15=256'h54800b83_3dfdec05_945580d0_39a05c82_fcf83f83_d35c8051_5c8d3980_b93f80d2;
+defparam bootram.RAM4.INIT_16=256'he6fe3f80_83808251_7826ec38_81185888_75337734_79055757_1980d23d_3d5a5877;
+defparam bootram.RAM4.INIT_17=256'h05ab0533_05330284_3d0d02a7_83973ff9_ce3fff51_e7ac51d4_803d0d80_d03d0d04;
+defparam bootram.RAM4.INIT_18=256'h7f7f5a57_3d0d7a7c_3d0d04f8_dfeb3f89_81528051_98547553_57578255_71882b07;
+defparam bootram.RAM4.INIT_19=256'h8405a105_05583302_34767081_54738a3d_75811757_7425b738_16565480_575874ff;
+defparam bootram.RAM4.INIT_1A=256'h802e8538_d8c73f73_06548a51_800881ff_51d7993f_7781ff06_3dfc0552_3482538a;
+defparam bootram.RAM4.INIT_1B=256'h883d3481_38dc5675_de567483_05335580_3d0d02a3_3d0d04fa_73800c8a_c1398154;
+defparam bootram.RAM4.INIT_1C=256'h893d3481_02ab0533_3d0d7c57_3d0d04f9_ff893f88_5280d051_055381f7_54883dfc;
+defparam bootram.RAM4.INIT_1D=256'h38807725_73802e9e_06705654_800881ff_56d6b93f_05337052_055202a7_53893dfc;
+defparam bootram.RAM4.INIT_1E=256'h0c893d0d_81557480_802e8338_70565473_0881ff06_d4fc3f80_7b527551_97387653;
+defparam bootram.RAM4.INIT_1F=256'h80de2e09_33565674_800b883d_51ffa03f_f75280d0_fc055381_8154883d_04fa3d0d;
+defparam bootram.RAM4.INIT_20=256'h81c0ac0c_800ca60b_eb0b81c0_c0940c80_04990b81_0c883d0d_81567580_81068338;
+defparam bootram.RAM4.INIT_21=256'hc0a00c81_51820b81_81c0980c_06708107_882bbe80_803d0d72_c0b00c04_89b00b81;
+defparam bootram.RAM4.INIT_22=256'h72882bbe_04803d0d_0c823d0d_c0a80880_70f13881_06515151_812a7081_c0a40870;
+defparam bootram.RAM4.INIT_23=256'h70810651_0870812a_0c81c0a4_0b81c0a0_c09c0c84_0c517381_0781c098_80067081;
+defparam bootram.RAM4.INIT_24=256'h83065271_71913875_55555757_7c728306_3d0d787a_04ff39fa_38823d0d_515170f1;
+defparam bootram.RAM4.INIT_25=256'h822b7711_27943873_55557375_72822a72_5188ca3f_2e863881_06527180_8a387283;
+defparam bootram.RAM4.INIT_26=256'h80e7b811_2a708f06_0d747084_0d04fe3d_e939883d_52811454_720c5254_77127008;
+defparam bootram.RAM4.INIT_27=256'h82e09008_04803d0d_3f843d0d_5253cffb_e7b81133_728f0680_53d0883f_33545153;
+defparam bootram.RAM4.INIT_28=256'h8c800607_80ff067a_93053378_fe3d0d02_823d0d04_5170f138_81065151_70882a70;
+defparam bootram.RAM4.INIT_29=256'h82e0900c_e0800c71_f1387682_51515170_2a708106_90087088_535382e0_80c08007;
+defparam bootram.RAM4.INIT_2A=256'h882a7081_e0900870_2e963882_72517280_82e0900c_71828007_82e0980c_7581ff06;
+defparam bootram.RAM4.INIT_2B=256'h88805588_82e0940c_3d0d810b_3d0d04fc_70800c84_e0800851_70f13882_06515151;
+defparam bootram.RAM4.INIT_2C=256'h51fef13f_53815281_90548a80_0d888055_0d04fc3d_873f863d_528051ff_54805380;
+defparam bootram.RAM4.INIT_2D=256'h863d0d04_51fed53f_53815280_55885486_3d0d8880_3d0d04fc_06800c86_800881ff;
+defparam bootram.RAM4.INIT_2E=256'h70802ef4_81ff0651_eb3f8008_04803d0d_0c823d0d_32810680_3f800881_803d0dca;
+defparam bootram.RAM4.INIT_2F=256'h5475fe9b_888055a0_3fffb43f_269b38dd_3f758008_775684e3_04fb3d0d_38823d0d;
+defparam bootram.RAM4.INIT_30=256'h08ff1156_0880cb3d_0d80c93d_04ffba3d_3f873d0d_8051fe84_07538152_0a069b0a;
+defparam bootram.RAM4.INIT_31=256'hff52883d_82805381_2681a738_3f738008_1754849f_81b43875_7381ff26_57578055;
+defparam bootram.RAM4.INIT_32=256'h82e0980c_fd9f3f74_3ffed43f_ea3ffefd_5273518a_80cb3d08_8f3f7553_7052548c;
+defparam bootram.RAM4.INIT_33=256'h0b82e090_980c88a0_810b82e0_82e0800c_80c00a07_fec00a06_e0900c76_88800b82;
+defparam bootram.RAM4.INIT_34=256'h84157008_8c0c54fe_700882e0_56fe8015_c83d558f_fcef3f80_82e0900c_0c8aa00b;
+defparam bootram.RAM4.INIT_35=256'h82e0900c_5488800b_82e0800c_8c157008_840c54fe_700882e0_54fe8815_82e0880c;
+defparam bootram.RAM4.INIT_36=256'h81557480_82e0980c_bc38800b_758025ff_90165656_b03fff16_e0900cfc_8a800b82;
+defparam bootram.RAM4.INIT_37=256'hcb388157_80082680_3f805773_565682db_7212575a_0d797b7d_0d04f93d_0c80c83d;
+defparam bootram.RAM4.INIT_38=256'h76547753_75278338_75555776_82807431_802ea238_ff065473_c3387581_74802e80;
+defparam bootram.RAM4.INIT_39=256'he1388280_82807527_8e387454_5674802e_76315759_16741976_fdeb3f73_73527551;
+defparam bootram.RAM4.INIT_3A=256'h38731354_73802e8d_7a565455_3d0d7678_3d0d04fc_76800c89_8c3f8157_54dc39fd;
+defparam bootram.RAM4.INIT_3B=256'h08307074_81cb3f80_750ca639_84160c80_160c800b_38800b88_08742790_81ed3f80;
+defparam bootram.RAM4.INIT_3C=256'h3f863d0d_7151fcc9_7188160c_0684160c_72760c74_3f800830_515281bd_06ff1656;
+defparam bootram.RAM4.INIT_3D=256'h15082e94_88140884_9f388153_5271802e_ff067054_3f800881_7554fc98_04fd3d0d;
+defparam bootram.RAM4.INIT_3E=256'h3d0d8880_3d0d04fc_72800c85_943f8053_160c51fc_08057088_88140880_3881823f;
+defparam bootram.RAM4.INIT_3F=256'h0d80f3a0_0d04ff3d_800c863d_fe800a06_a33f8008_528151fa_f90a5381_55a05481;
+defparam bootram.RAM5.INIT_00=256'h387180f3_09810693_5170a02e_ff065451_06800881_2a7081ff_3f800888_08a038d7;
+defparam bootram.RAM5.INIT_01=256'h0880e882_04c03f80_0c833d0d_b33f7180_278438f5_52528271_a008ea11_a00c80f3;
+defparam bootram.RAM5.INIT_02=256'h0d7d56f9_0c04f63d_80082b80_a93f810b_800c04ff_0b80082b_04f33f81_0533800c;
+defparam bootram.RAM5.INIT_03=256'h810b82e0_82e0800c_0c7c882b_0b82e084_e0900c8b_88800b82_82e0980c_983f800b;
+defparam bootram.RAM5.INIT_04=256'h3888800b_762780d3_55805473_f8e73f7e_82e0900c_0c8aa80b_0b82e090_980c88a8;
+defparam bootram.RAM5.INIT_05=256'h5a82e080_82e08408_e0880859_8c085882_cc3f82e0_e0900cf8_8a800b82_82e0900c;
+defparam bootram.RAM5.INIT_06=256'h70337570_38711751_71732791_70538052_73278338_57905370_76753152_085b883d;
+defparam bootram.RAM5.INIT_07=256'h7251f789_04803d0d_0c8c3d0d_0b82e098_ffa93980_39721454_811252ec_81055734;
+defparam bootram.RAM5.INIT_08=256'h70800c54_de3f8008_05085182_528c0888_088c0508_0d80538c_8c0cfd3d_3f8c0802;
+defparam bootram.RAM5.INIT_09=256'h82b93f80_88050851_08528c08_8c088c05_3d0d8153_028c0cfd_0c048c08_853d0d8c;
+defparam bootram.RAM5.INIT_0A=256'h88050880_050c8c08_0b8c08fc_f93d0d80_08028c0c_8c0c048c_54853d0d_0870800c;
+defparam bootram.RAM5.INIT_0B=256'h810b8c08_05088838_0c8c08fc_8c08f405_050c800b_308c0888_08880508_25ab388c;
+defparam bootram.RAM5.INIT_0C=256'h8c088c05_8c050830_ab388c08_05088025_0c8c088c_8c08fc05_08f40508_f4050c8c;
+defparam bootram.RAM5.INIT_0D=256'h08fc050c_f005088c_050c8c08_0b8c08f0_08883881_8c08fc05_08f0050c_0c800b8c;
+defparam bootram.RAM5.INIT_0E=256'hfc050880_0c548c08_8c08f805_3f800870_085181a7_8c088805_8c050852_80538c08;
+defparam bootram.RAM5.INIT_0F=256'h048c0802_3d0d8c0c_800c5489_f8050870_050c8c08_308c08f8_08f80508_2e8c388c;
+defparam bootram.RAM5.INIT_10=256'h0888050c_0508308c_388c0888_08802593_8c088805_08fc050c_0d800b8c_8c0cfb3d;
+defparam bootram.RAM5.INIT_11=256'h538c088c_8c050c81_08308c08_8c088c05_80258c38_088c0508_fc050c8c_810b8c08;
+defparam bootram.RAM5.INIT_12=256'h388c08f8_08802e8c_8c08fc05_f8050c54_08708c08_51ad3f80_08880508_0508528c;
+defparam bootram.RAM5.INIT_13=256'hfd3d0d81_08028c0c_8c0c048c_54873d0d_0870800c_8c08f805_08f8050c_0508308c;
+defparam bootram.RAM5.INIT_14=256'hfc050880_ac388c08_88050827_05088c08_0c8c088c_8c08f805_050c800b_0b8c08fc;
+defparam bootram.RAM5.INIT_15=256'h08108c08_8c08fc05_088c050c_0508108c_388c088c_05082499_0b8c088c_2ea33880;
+defparam bootram.RAM5.INIT_16=256'h8c088805_0826a138_8c088805_088c0508_80c9388c_0508802e_398c08fc_fc050cc9;
+defparam bootram.RAM5.INIT_17=256'h8c08fc05_08f8050c_0508078c_088c08fc_8c08f805_0888050c_0508318c_088c088c;
+defparam bootram.RAM5.INIT_18=256'h802e8f38_08900508_ffaf398c_088c050c_08812a8c_8c088c05_08fc050c_08812a8c;
+defparam bootram.RAM5.INIT_19=256'hf4050880_0c518c08_8c08f405_f8050870_8d398c08_f4050c51_08708c08_8c088805;
+defparam bootram.RAM5.INIT_1A=256'h802eb038_83065170_38747407_8372278c_79565652_3d0d7877_8c0c04fc_0c853d0d;
+defparam bootram.RAM5.INIT_1B=256'h54555571_8115ff14_bd388115_2e098106_52537271_74337433_ff2ea038_ff125271;
+defparam bootram.RAM5.INIT_1C=256'h38841184_0981068f_0873082e_74545170_3d0d0474_0b800c86_06e23880_ff2e0981;
+defparam bootram.RAM5.INIT_1D=256'h3d0d7670_3d0d04fc_31800c86_af397271_735555ff_26e93870_54517183_14fc1454;
+defparam bootram.RAM5.INIT_1E=256'h98387270_5271ff2e_a738ff12_5170802e_75078306_278c3872_55558f72_797b5555;
+defparam bootram.RAM5.INIT_1F=256'h74517270_863d0d04_3874800c_098106ea_5271ff2e_5634ff12_74708105_81055433;
+defparam bootram.RAM5.INIT_20=256'h71708405_84055408_530c7270_71708405_84055408_530c7270_71708405_84055408;
+defparam bootram.RAM5.INIT_21=256'h70840554_27953872_c9388372_52718f26_530cf012_71708405_84055408_530c7270;
+defparam bootram.RAM5.INIT_22=256'h059f0533_7971028c_fc3d0d76_54ff8339_26ed3870_12527183_05530cfc_08717084;
+defparam bootram.RAM5.INIT_23=256'h70810555_93387373_5271ff2e_a238ff12_5170802e_38748306_8372278a_57555355;
+defparam bootram.RAM5.INIT_24=256'h2b075154_07707190_74882b75_3d0d0474_74800c86_8106ef38_71ff2e09_34ff1252;
+defparam bootram.RAM5.INIT_25=256'h71708405_05530c72_72717084_8405530c_0c727170_70840553_a5387271_518f7227;
+defparam bootram.RAM5.INIT_26=256'hf2387053_52718326_530cfc12_71708405_27903872_dd388372_52718f26_530cf012;
+defparam bootram.RAM5.INIT_27=256'h2e80d438_06517080_71740783_2e80d938_55527280_7c705455_3d0d787a_ff9039fa;
+defparam bootram.RAM5.INIT_28=256'h7081ff06_2e818738_a9387280_2e098106_56517471_71337433_ff2eb138_ff135372;
+defparam bootram.RAM5.INIT_29=256'h56517081_71337433_8106d138_72ff2e09_15555552_128115ff_80fc3881_5170802e;
+defparam bootram.RAM5.INIT_2A=256'h71087408_73278838_74575583_3d0d0471_70800c88_31515252_ff067171_ff067581;
+defparam bootram.RAM5.INIT_2B=256'h70f88482_fdff1206_7009f7fb_b1387408_5372802e_9739fc13_765552ff_2e883874;
+defparam bootram.RAM5.INIT_2C=256'h765552fe_2ed03874_74087608_7327d038_17575583_38841584_5151709a_81800651;
+defparam bootram.RAM5.INIT_2D=256'hf3a40cff_9e387380_5472812e_e7e80854_0d800b80_0d04fd3d_800c883d_df39800b;
+defparam bootram.RAM5.INIT_2E=256'hffad813f_80f3a40c_f6a33f72_3f800851_51ffb5b8_e89c5281_acba3f80_ad9e3fff;
+defparam bootram.RAM5.INIT_2F=256'ha40bfc05_3d0d80e8_00ff39ff_51f6863f_9b3f8008_8151ffb5_80e89c52_ffac9d3f;
+defparam bootram.RAM5.INIT_30=256'h0404ffad_38833d0d_098106f1_5270ff2e_12700852_38702dfc_70ff2e91_70085252;
+defparam bootram.RAM5.INIT_31=256'h636b6574_6c207061_6e74726f_6e20636f_6f722069_21457272_00000040_ac3f0400;
+defparam bootram.RAM5.INIT_32=256'h6c697479_74696269_6f6d7061_65642063_70656374_3a204578_646c6572_2068616e;
+defparam bootram.RAM5.INIT_33=256'h6f722069_21457272_25640a00_676f7420_62757420_25642c20_62657220_206e756d;
+defparam bootram.RAM5.INIT_34=256'h70656374_3a204578_646c6572_2068616e_636b6574_6c207061_6e74726f_6e20636f;
+defparam bootram.RAM5.INIT_35=256'h74202564_7420676f_2c206275_68202564_656e6774_6164206c_61796c6f_65642070;
+defparam bootram.RAM5.INIT_36=256'h203d2025_70656564_643a2073_616e6765_6b206368_206c696e_0a657468_0a000000;
+defparam bootram.RAM5.INIT_37=256'h720a0000_6f616465_6f6f746c_44502062_31302055_50204e32_0a555352_640a0000;
+defparam bootram.RAM5.INIT_38=256'h640a0000_723a2025_756d6265_7479206e_62696c69_70617469_20636f6d_46504741;
+defparam bootram.RAM5.INIT_39=256'h723a2025_756d6265_7479206e_62696c69_70617469_20636f6d_77617265_4669726d;
+defparam bootram.RAM5.INIT_3A=256'h7061636b_65727920_65636f76_69702072_476f7420_00000000_61646472_640a0000;
+defparam bootram.RAM5.INIT_3B=256'h00000826_00000826_00000826_00000826_00000826_00000731_00000000_65743a20;
+defparam bootram.RAM5.INIT_3C=256'h00000826_00000826_000007fc_00000826_00000826_00000776_0000078d_00000826;
+defparam bootram.RAM5.INIT_3D=256'h000007cf_000007ca_000007c5_0000073e_000007aa_00000826_00000826_00000826;
+defparam bootram.RAM5.INIT_3E=256'hffffff00_c0a80a01_c0a80a02_3fff0000_0050c285_000007ea_000007dd_000007d6;
+defparam bootram.RAM5.INIT_3F=256'h30313233_2e256400_642e2564_25642e25_45000000_01b200d9_05160364_14580a2c;
+defparam bootram.RAM6.INIT_00=256'h5f706b74_73656e64_ffff0000_ffffffff_00000000_43444546_38394142_34353637;
+defparam bootram.RAM6.INIT_01=256'h72206275_6e642f6f_656e2061_6f66206c_656e7420_69676e6d_6420616c_3a206261;
+defparam bootram.RAM6.INIT_02=256'h74206361_6f206869_65642074_6661696c_6f6e3a20_636f6d6d_6e65745f_66000000;
+defparam bootram.RAM6.INIT_03=256'h6172703a_646c655f_0a68616e_00000000_666f7220_696e6720_6c6f6f6b_63686520;
+defparam bootram.RAM6.INIT_04=256'h6e736973_696e636f_55445020_0a000000_3d202564_697a6520_72642073_20776569;
+defparam bootram.RAM6.INIT_05=256'h53746172_0b0b0b0b_00000000_2025640a_3a202564_67746873_206c656e_74656e74;
+defparam bootram.RAM6.INIT_06=256'h6164696e_2e204c6f_6d6f6465_61666520_696e2073_50322b20_20555352_74696e67;
+defparam bootram.RAM6.INIT_07=256'h20666f72_6b696e67_43686563_00000000_6172652e_69726d77_66652066_67207361;
+defparam bootram.RAM6.INIT_08=256'h2e2e2e00_6d616765_47412069_6e204650_6374696f_726f6475_69642070_2076616c;
+defparam bootram.RAM6.INIT_09=256'h666f756e_61676520_4120696d_20465047_74696f6e_6f647563_64207072_56616c69;
+defparam bootram.RAM6.INIT_0A=256'h616c6964_4e6f2076_742e0000_20626f6f_6720746f_7074696e_7474656d_642e2041;
+defparam bootram.RAM6.INIT_0B=256'h2e0a4661_6f756e64_67652066_20696d61_46504741_696f6e20_64756374_2070726f;
+defparam bootram.RAM6.INIT_0C=256'h726d7761_6e206669_6c742d69_20627569_6820746f_726f7567_67207468_6c6c696e;
+defparam bootram.RAM6.INIT_0D=256'h6520666f_6d776172_20666972_74696f6e_6f647563_64207072_56616c69_72652e00;
+defparam bootram.RAM6.INIT_0E=256'h64696e67_206c6f61_73686564_46696e69_2e2e2e00_64696e67_204c6f61_756e642e;
+defparam bootram.RAM6.INIT_0F=256'h65747572_523a2052_4552524f_2e000000_6d616765_6e672069_61727469_2e205374;
+defparam bootram.RAM6.INIT_10=256'h6f756c64_73207368_20546869_72616d21_70726f67_61696e20_6f6d206d_6e206672;
+defparam bootram.RAM6.INIT_11=256'h64756374_2070726f_616c6964_4e6f2076_6e210000_61707065_65722068_206e6576;
+defparam bootram.RAM6.INIT_12=256'h7468726f_696e6720_46616c6c_6e642e20_20666f75_77617265_6669726d_696f6e20;
+defparam bootram.RAM6.INIT_13=256'h53706565_2e000000_77617265_6669726d_2d696e20_75696c74_746f2062_75676820;
+defparam bootram.RAM6.INIT_14=256'h58000000_57455f54_00000000_4e4f4e45_00000000_2025640a_7420746f_64207365;
+defparam bootram.RAM6.INIT_15=256'h20666c6f_726e6574_65746865_43000000_45545249_53594d4d_58000000_57455f52;
+defparam bootram.RAM6.INIT_16=256'h2077726f_4144563a_4e45475f_4155544f_5048595f_6c3a2000_6e74726f_7720636f;
+defparam bootram.RAM6.INIT_17=256'h00000001_00030003_00000000_780a0000_20307825_20676f74_7825782c_74652030;
+defparam bootram.RAM6.INIT_18=256'h68616e64_6b657420_20706163_64617465_6e207570_6f722069_21457272_00030203;
+defparam bootram.RAM6.INIT_19=256'h2025642c_6e677468_64206c65_796c6f61_64207061_65637465_20457870_6c65723a;
+defparam bootram.RAM6.INIT_1A=256'h00002261_000022b1_000022b1_0000220b_00000000_2025640a_20676f74_20627574;
+defparam bootram.RAM6.INIT_1B=256'h000022b1_000022b1_000022b1_000022b1_000022b1_000022b1_0000222a_0000224c;
+defparam bootram.RAM6.INIT_1C=256'h000022b1_000022a7_00002290_000022b1_000022b1_000022b1_000022b1_000022b1;
+defparam bootram.RAM6.INIT_1D=256'h34353637_30313233_00000000_6f72740a_0a0a6162_0000227d_0000223c_000022b1;
+defparam bootram.RAM6.INIT_1E=256'hffff00ff_ff00ffff_00ffffff_65000000_792e6578_64756d6d_43444546_38394142;
+defparam bootram.RAM6.INIT_1F=256'hffff0031_05050400_01010100_0000342c_00000000_00000000_00000000_ffffff00;
+defparam bootram.RAM6.INIT_20=256'h000033c8_10101200_000032a8_000032a0_00003298_00003290_000b0000_0018000f;
+defparam bootram.RAM6.INIT_21=256'h00000000_00000000_00000000_00000000_00000000_ffffffff_00000000_ffffffff;
defparam bootram.RAM6.INIT_22=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000;
defparam bootram.RAM6.INIT_23=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000;
defparam bootram.RAM6.INIT_24=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000;
diff --git a/fpga/usrp2/top/N2x0/u2plus_core.v b/fpga/usrp2/top/N2x0/u2plus_core.v
index abc32406e..e2539e183 100644
--- a/fpga/usrp2/top/N2x0/u2plus_core.v
+++ b/fpga/usrp2/top/N2x0/u2plus_core.v
@@ -149,10 +149,10 @@ module u2plus_core
);
localparam SR_MISC = 0; // 7 regs
- localparam SR_SIMTIMER = 8; // 2
+ localparam SR_USER_REGS = 8; // 2
localparam SR_TIME64 = 10; // 6
localparam SR_BUF_POOL = 16; // 4
- localparam SR_USER_REGS = 20; // 2
+ localparam SR_SPI_CORE = 20; // 3
localparam SR_RX_FRONT = 24; // 5
localparam SR_RX_CTRL0 = 32; // 9
localparam SR_RX_DSP0 = 48; // 7
@@ -278,9 +278,11 @@ module u2plus_core
.sf_dat_o(sf_dat_o),.sf_adr_o(sf_adr),.sf_sel_o(sf_sel),.sf_we_o(sf_we),.sf_cyc_o(sf_cyc),.sf_stb_o(sf_stb),
.sf_dat_i(sf_dat_i),.sf_ack_i(sf_ack),.sf_err_i(0),.sf_rty_i(0));
- // Unused Slaves 9, b, c
+ assign s2_ack = 0;
assign s4_ack = 0;
- assign s9_ack = 0; assign sb_ack = 0; assign sc_ack = 0;
+ assign s9_ack = 0;
+ assign sb_ack = 0;
+ assign sc_ack = 0;
// ////////////////////////////////////////////////////////////////////////////////////////
// Reset Controller
@@ -373,6 +375,10 @@ module u2plus_core
wire wr3_ready_i, wr3_ready_o;
wire [35:0] wr0_dat, wr1_dat, wr2_dat, wr3_dat;
+ wire [35:0] sfc_wr_data, sfc_rd_data;
+ wire sfc_wr_ready, sfc_rd_ready;
+ wire sfc_wr_valid, sfc_rd_valid;
+
wire [35:0] tx_err_data;
wire tx_err_src_rdy, tx_err_dst_rdy;
@@ -393,21 +399,27 @@ module u2plus_core
.dsp0_inp_data(wr1_dat), .dsp0_inp_valid(wr1_ready_i), .dsp0_inp_ready(wr1_ready_o),
.dsp1_inp_data(wr3_dat), .dsp1_inp_valid(wr3_ready_i), .dsp1_inp_ready(wr3_ready_o),
.eth_inp_data(wr2_dat), .eth_inp_valid(wr2_ready_i), .eth_inp_ready(wr2_ready_o),
- .err_inp_data(tx_err_data), .err_inp_ready(tx_err_dst_rdy), .err_inp_valid(tx_err_src_rdy),
+ .err_inp_data(tx_err_data), .err_inp_valid(tx_err_src_rdy), .err_inp_ready(tx_err_dst_rdy),
+ .ctl_inp_data(sfc_wr_data), .ctl_inp_valid(sfc_wr_valid), .ctl_inp_ready(sfc_wr_ready),
.ser_out_data(rd0_dat), .ser_out_valid(rd0_ready_o), .ser_out_ready(rd0_ready_i),
.dsp_out_data(rd1_dat), .dsp_out_valid(rd1_ready_o), .dsp_out_ready(rd1_ready_i),
+ .ctl_out_data(sfc_rd_data), .ctl_out_valid(sfc_rd_valid), .ctl_out_ready(sfc_rd_ready),
.eth_out_data(rd2_dat), .eth_out_valid(rd2_ready_o), .eth_out_ready(rd2_ready_i)
);
// /////////////////////////////////////////////////////////////////////////
// SPI -- Slave #2
- spi_top shared_spi
- (.wb_clk_i(wb_clk),.wb_rst_i(wb_rst),.wb_adr_i(s2_adr[4:0]),.wb_dat_i(s2_dat_o),
- .wb_dat_o(s2_dat_i),.wb_sel_i(s2_sel),.wb_we_i(s2_we),.wb_stb_i(s2_stb),
- .wb_cyc_i(s2_cyc),.wb_ack_o(s2_ack),.wb_err_o(),.wb_int_o(spi_int),
- .ss_pad_o({sen_adc, sen_tx_db,sen_tx_adc,sen_tx_dac,sen_rx_db,sen_rx_adc,sen_rx_dac,sen_dac,sen_clk}),
- .sclk_pad_o(sclk),.mosi_pad_o(mosi),.miso_pad_i(miso) );
+ wire [31:0] spi_debug;
+ wire [31:0] spi_readback;
+ wire spi_ready;
+ simple_spi_core #(.BASE(SR_SPI_CORE), .WIDTH(9)) shared_spi(
+ .clock(dsp_clk), .reset(dsp_rst),
+ .set_stb(set_stb_dsp), .set_addr(set_addr_dsp), .set_data(set_data_dsp),
+ .readback(spi_readback), .ready(spi_ready),
+ .sen({sen_adc, sen_tx_db,sen_tx_adc,sen_tx_dac,sen_rx_db,sen_rx_adc,sen_rx_dac,sen_dac,sen_clk}),
+ .sclk(sclk), .mosi(mosi), .miso(miso), .debug(spi_debug)
+ );
// /////////////////////////////////////////////////////////////////////////
// I2C -- Slave #3
@@ -436,18 +448,19 @@ module u2plus_core
// Buffer Pool Status -- Slave #5
//compatibility number -> increment when the fpga has been sufficiently altered
- localparam compat_num = {16'd9, 16'd1}; //major, minor
- wire [31:0] churn = 0; //tweak churn until timing meets!
+ localparam compat_num = {16'd10, 16'd0}; //major, minor
+
+ wire [31:0] irq_readback = {18'b0, button, spi_ready, clk_status, serdes_link_up, 10'b0};
wb_readback_mux buff_pool_status
(.wb_clk_i(wb_clk), .wb_rst_i(wb_rst), .wb_stb_i(s5_stb),
.wb_adr_i(s5_adr), .wb_dat_o(s5_dat_i), .wb_ack_o(s5_ack),
- .word00(churn),.word01(32'b0),.word02(32'b0),.word03(32'b0),
- .word04(32'b0),.word05(32'b0),.word06(32'b0),.word07(32'b0),
- .word08(status),.word09(gpio_readback),.word10(vita_time[63:32]),
- .word11(vita_time[31:0]),.word12(compat_num),.word13({18'b0, button, 1'b0, clk_status, serdes_link_up, 10'b0}),
- .word14(vita_time_pps[63:32]),.word15(vita_time_pps[31:0])
+ .word00(spi_readback),.word01(32'hffff_ffff),.word02(32'hffff_ffff),.word03(32'hffff_ffff),
+ .word04(32'hffff_ffff),.word05(32'hffff_ffff),.word06(32'hffff_ffff),.word07(32'hffff_ffff),
+ .word08(status),.word09(32'hffff_ffff),.word10(32'hffff_ffff),
+ .word11(vita_time[31:0]),.word12(compat_num),.word13(irq_readback),
+ .word14(32'hffff_ffff),.word15(32'hffff_ffff)
);
// /////////////////////////////////////////////////////////////////////////
@@ -477,9 +490,19 @@ module u2plus_core
assign s7_dat_i = 32'd0;
- settings_bus_crossclock settings_bus_crossclock
+ wire set_stb_dsp0, set_stb_dsp1;
+ wire [31:0] set_data_dsp0, set_data_dsp1;
+ wire [7:0] set_addr_dsp0, set_addr_dsp1;
+
+ //mux settings_bus_crossclock and settings_readback_bus_fifo_ctrl with prio
+ assign set_stb_dsp = set_stb_dsp0 | set_stb_dsp1;
+ assign set_addr_dsp = set_stb_dsp1? set_addr_dsp1 : set_addr_dsp0;
+ assign set_data_dsp = set_stb_dsp1? set_data_dsp1 : set_data_dsp0;
+
+ settings_bus_crossclock #(.FLOW_CTRL(1/*on*/)) settings_bus_crossclock
(.clk_i(wb_clk), .rst_i(wb_rst), .set_stb_i(set_stb), .set_addr_i(set_addr), .set_data_i(set_data),
- .clk_o(dsp_clk), .rst_o(dsp_rst), .set_stb_o(set_stb_dsp), .set_addr_o(set_addr_dsp), .set_data_o(set_data_dsp));
+ .clk_o(dsp_clk), .rst_o(dsp_rst), .set_stb_o(set_stb_dsp0), .set_addr_o(set_addr_dsp0), .set_data_o(set_data_dsp0),
+ .blocked(set_stb_dsp1));
user_settings #(.BASE(SR_USER_REGS)) user_settings
(.clk(dsp_clk),.rst(dsp_rst),.set_stb(set_stb_dsp),
@@ -487,6 +510,29 @@ module u2plus_core
.set_addr_user(set_addr_user),.set_data_user(set_data_user),
.set_stb_user(set_stb_user) );
+ // /////////////////////////////////////////////////////////////////////////
+ // Settings + Readback Bus -- FIFO controlled
+
+ wire [31:0] sfc_debug;
+ wire sfc_clear;
+ settings_fifo_ctrl #(.PROT_DEST(3), .PROT_HDR(1)) sfc
+ (
+ .clock(dsp_clk), .reset(dsp_rst), .clear(sfc_clear),
+ .vita_time(vita_time), .perfs_ready(spi_ready),
+ .in_data(sfc_rd_data), .in_valid(sfc_rd_valid), .in_ready(sfc_rd_ready),
+ .out_data(sfc_wr_data), .out_valid(sfc_wr_valid), .out_ready(sfc_wr_ready),
+ .strobe(set_stb_dsp1), .addr(set_addr_dsp1), .data(set_data_dsp1),
+ .word00(spi_readback),.word01(32'hffff_ffff),.word02(32'hffff_ffff),.word03(32'hffff_ffff),
+ .word04(32'hffff_ffff),.word05(32'hffff_ffff),.word06(32'hffff_ffff),.word07(32'hffff_ffff),
+ .word08(32'hffff_ffff),.word09(gpio_readback),.word10(vita_time[63:32]),
+ .word11(vita_time[31:0]),.word12(32'hffff_ffff),.word13(irq_readback),
+ .word14(vita_time_pps[63:32]),.word15(vita_time_pps[31:0]),
+ .debug(sfc_debug)
+ );
+
+ setting_reg #(.my_addr(SR_BUF_POOL+1/*same as packet dispatcher*/),.width(1)) sr_clear_sfc
+ (.clk(dsp_clk),.rst(dsp_rst),.strobe(set_stb_dsp),.addr(set_addr_dsp),.in(set_data_dsp),.changed(sfc_clear));
+
// Output control lines
wire [7:0] clock_outs, serdes_outs, adc_outs;
assign {clock_ready, clk_en[1:0], clk_sel[1:0]} = clock_outs[4:0];
diff --git a/fpga/usrp2/top/USRP2/Makefile b/fpga/usrp2/top/USRP2/Makefile
index 10610c7dc..94480a811 100644
--- a/fpga/usrp2/top/USRP2/Makefile
+++ b/fpga/usrp2/top/USRP2/Makefile
@@ -70,7 +70,7 @@ SYNTHESIZE_PROPERTIES = \
"Use Clock Enable" Auto \
"Use Synchronous Reset" Auto \
"Use Synchronous Set" Auto \
-"Verilog Macros" "$(CUSTOM_DEFS)"
+"Verilog Macros" "FIFO_CTRL_NO_TIME=1 $(CUSTOM_DEFS)"
TRANSLATE_PROPERTIES = \
"Macro Search Path" "$(shell pwd)/../../coregen/"
diff --git a/fpga/usrp2/top/USRP2/u2_core.v b/fpga/usrp2/top/USRP2/u2_core.v
index 93064254f..d8fe8cf10 100644
--- a/fpga/usrp2/top/USRP2/u2_core.v
+++ b/fpga/usrp2/top/USRP2/u2_core.v
@@ -154,10 +154,10 @@ module u2_core
);
localparam SR_MISC = 0; // 7 regs
- localparam SR_SIMTIMER = 8; // 2
+ localparam SR_USER_REGS = 8; // 2
localparam SR_TIME64 = 10; // 6
localparam SR_BUF_POOL = 16; // 4
- localparam SR_USER_REGS = 20; // 2
+ localparam SR_SPI_CORE = 20; // 3
localparam SR_RX_FRONT = 24; // 5
localparam SR_RX_CTRL0 = 32; // 9
localparam SR_RX_DSP0 = 48; // 7
@@ -284,10 +284,14 @@ module u2_core
.sf_dat_o(sf_dat_o),.sf_adr_o(sf_adr),.sf_sel_o(sf_sel),.sf_we_o(sf_we),.sf_cyc_o(sf_cyc),.sf_stb_o(sf_stb),
.sf_dat_i(sf_dat_i),.sf_ack_i(sf_ack),.sf_err_i(0),.sf_rty_i(0));
- // Unused Slaves 4, 9 and b-f
+ assign s2_ack = 0;
assign s4_ack = 0;
- assign s9_ack = 0; assign sb_ack = 0; assign sc_ack = 0;
- assign sd_ack = 0; assign se_ack = 0; assign fc_ack = 0;
+ assign s9_ack = 0;
+ assign sb_ack = 0;
+ assign sc_ack = 0;
+ assign sd_ack = 0;
+ assign se_ack = 0;
+ assign sf_ack = 0;
// ////////////////////////////////////////////////////////////////////////////////////////
// Reset Controller
@@ -379,6 +383,10 @@ module u2_core
wire wr3_ready_i, wr3_ready_o;
wire [35:0] wr0_dat, wr1_dat, wr2_dat, wr3_dat;
+ wire [35:0] sfc_wr_data, sfc_rd_data;
+ wire sfc_wr_ready, sfc_rd_ready;
+ wire sfc_wr_valid, sfc_rd_valid;
+
wire [35:0] tx_err_data;
wire tx_err_src_rdy, tx_err_dst_rdy;
@@ -399,21 +407,27 @@ module u2_core
.dsp0_inp_data(wr1_dat), .dsp0_inp_valid(wr1_ready_i), .dsp0_inp_ready(wr1_ready_o),
.dsp1_inp_data(wr3_dat), .dsp1_inp_valid(wr3_ready_i), .dsp1_inp_ready(wr3_ready_o),
.eth_inp_data(wr2_dat), .eth_inp_valid(wr2_ready_i), .eth_inp_ready(wr2_ready_o),
- .err_inp_data(tx_err_data), .err_inp_ready(tx_err_dst_rdy), .err_inp_valid(tx_err_src_rdy),
+ .err_inp_data(tx_err_data), .err_inp_valid(tx_err_src_rdy), .err_inp_ready(tx_err_dst_rdy),
+ .ctl_inp_data(sfc_wr_data), .ctl_inp_valid(sfc_wr_valid), .ctl_inp_ready(sfc_wr_ready),
.ser_out_data(rd0_dat), .ser_out_valid(rd0_ready_o), .ser_out_ready(rd0_ready_i),
.dsp_out_data(rd1_dat), .dsp_out_valid(rd1_ready_o), .dsp_out_ready(rd1_ready_i),
+ .ctl_out_data(sfc_rd_data), .ctl_out_valid(sfc_rd_valid), .ctl_out_ready(sfc_rd_ready),
.eth_out_data(rd2_dat), .eth_out_valid(rd2_ready_o), .eth_out_ready(rd2_ready_i)
);
// /////////////////////////////////////////////////////////////////////////
// SPI -- Slave #2
- spi_top shared_spi
- (.wb_clk_i(wb_clk),.wb_rst_i(wb_rst),.wb_adr_i(s2_adr[4:0]),.wb_dat_i(s2_dat_o),
- .wb_dat_o(s2_dat_i),.wb_sel_i(s2_sel),.wb_we_i(s2_we),.wb_stb_i(s2_stb),
- .wb_cyc_i(s2_cyc),.wb_ack_o(s2_ack),.wb_err_o(),.wb_int_o(spi_int),
- .ss_pad_o({sen_tx_db,sen_tx_adc,sen_tx_dac,sen_rx_db,sen_rx_adc,sen_rx_dac,sen_dac,sen_clk}),
- .sclk_pad_o(sclk),.mosi_pad_o(mosi),.miso_pad_i(miso) );
+ wire [31:0] spi_debug;
+ wire [31:0] spi_readback;
+ wire spi_ready;
+ simple_spi_core #(.BASE(SR_SPI_CORE), .WIDTH(8)) shared_spi(
+ .clock(dsp_clk), .reset(dsp_rst),
+ .set_stb(set_stb_dsp), .set_addr(set_addr_dsp), .set_data(set_data_dsp),
+ .readback(spi_readback), .ready(spi_ready),
+ .sen({sen_tx_db,sen_tx_adc,sen_tx_dac,sen_rx_db,sen_rx_adc,sen_rx_dac,sen_dac,sen_clk}),
+ .sclk(sclk), .mosi(mosi), .miso(miso), .debug(spi_debug)
+ );
// /////////////////////////////////////////////////////////////////////////
// I2C -- Slave #3
@@ -442,17 +456,18 @@ module u2_core
// Buffer Pool Status -- Slave #5
//compatibility number -> increment when the fpga has been sufficiently altered
- localparam compat_num = {16'd9, 16'd1}; //major, minor
- wire [31:0] churn = 0; //tweak churn until timing meets!
+ localparam compat_num = {16'd10, 16'd0}; //major, minor
+
+ wire [31:0] irq_readback = {19'b0, spi_ready, clk_status, serdes_link_up, 10'b0};
wb_readback_mux buff_pool_status
(.wb_clk_i(wb_clk), .wb_rst_i(wb_rst), .wb_stb_i(s5_stb),
.wb_adr_i(s5_adr), .wb_dat_o(s5_dat_i), .wb_ack_o(s5_ack),
- .word00(churn),.word01(32'b0),.word02(32'b0),.word03(32'b0),
- .word04(32'b0),.word05(32'b0),.word06(32'b0),.word07(32'b0),
+ .word00(spi_readback),.word01(32'hffff_ffff),.word02(32'hffff_ffff),.word03(32'hffff_ffff),
+ .word04(32'hffff_ffff),.word05(32'hffff_ffff),.word06(32'hffff_ffff),.word07(32'hffff_ffff),
.word08(status),.word09(gpio_readback),.word10(vita_time[63:32]),
- .word11(vita_time[31:0]),.word12(compat_num),.word13({20'b0, clk_status, serdes_link_up, 10'b0}),
+ .word11(vita_time[31:0]),.word12(compat_num),.word13(irq_readback),
.word14(vita_time_pps[63:32]),.word15(vita_time_pps[31:0])
);
@@ -483,9 +498,19 @@ module u2_core
assign s7_dat_i = 32'd0;
- settings_bus_crossclock settings_bus_crossclock
+ wire set_stb_dsp0, set_stb_dsp1;
+ wire [31:0] set_data_dsp0, set_data_dsp1;
+ wire [7:0] set_addr_dsp0, set_addr_dsp1;
+
+ //mux settings_bus_crossclock and settings_readback_bus_fifo_ctrl with prio
+ assign set_stb_dsp = set_stb_dsp0 | set_stb_dsp1;
+ assign set_addr_dsp = set_stb_dsp1? set_addr_dsp1 : set_addr_dsp0;
+ assign set_data_dsp = set_stb_dsp1? set_data_dsp1 : set_data_dsp0;
+
+ settings_bus_crossclock #(.FLOW_CTRL(1/*on*/)) settings_bus_crossclock
(.clk_i(wb_clk), .rst_i(wb_rst), .set_stb_i(set_stb), .set_addr_i(set_addr), .set_data_i(set_data),
- .clk_o(dsp_clk), .rst_o(dsp_rst), .set_stb_o(set_stb_dsp), .set_addr_o(set_addr_dsp), .set_data_o(set_data_dsp));
+ .clk_o(dsp_clk), .rst_o(dsp_rst), .set_stb_o(set_stb_dsp0), .set_addr_o(set_addr_dsp0), .set_data_o(set_data_dsp0),
+ .blocked(set_stb_dsp1));
user_settings #(.BASE(SR_USER_REGS)) user_settings
(.clk(dsp_clk),.rst(dsp_rst),.set_stb(set_stb_dsp),
@@ -493,6 +518,38 @@ module u2_core
.set_addr_user(set_addr_user),.set_data_user(set_data_user),
.set_stb_user(set_stb_user) );
+ // /////////////////////////////////////////////////////////////////////////
+ // Settings + Readback Bus -- FIFO controlled
+
+ wire [31:0] sfc_debug;
+ wire sfc_clear;
+ /*
+ settings_fifo_ctrl #(.PROT_DEST(3), .PROT_HDR(1)) sfc
+ (
+ .clock(dsp_clk), .reset(dsp_rst), .clear(sfc_clear),
+ .vita_time(vita_time), .perfs_ready(spi_ready),
+ .in_data(sfc_rd_data), .in_valid(sfc_rd_valid), .in_ready(sfc_rd_ready),
+ .out_data(sfc_wr_data), .out_valid(sfc_wr_valid), .out_ready(sfc_wr_ready),
+ .strobe(set_stb_dsp1), .addr(set_addr_dsp1), .data(set_data_dsp1),
+ .word00(spi_readback),.word01(32'hffff_ffff),.word02(32'hffff_ffff),.word03(32'hffff_ffff),
+ .word04(32'hffff_ffff),.word05(32'hffff_ffff),.word06(32'hffff_ffff),.word07(32'hffff_ffff),
+ .word08(32'hffff_ffff),.word09(gpio_readback),.word10(vita_time[63:32]),
+ .word11(vita_time[31:0]),.word12(32'hffff_ffff),.word13(irq_readback),
+ .word14(vita_time_pps[63:32]),.word15(vita_time_pps[31:0]),
+ .debug(sfc_debug)
+ );
+ */
+ assign sfc_debug = 0;
+ assign set_stb_dsp1 = 0;
+ assign set_addr_dsp1 = 0;
+ assign set_data_dsp1 = 0;
+ assign sfc_rd_ready = 1;
+ assign sfc_wr_valid = 0;
+ assign sfc_wr_data = 0;
+
+ setting_reg #(.my_addr(SR_BUF_POOL+1/*same as packet dispatcher*/),.width(1)) sr_clear_sfc
+ (.clk(dsp_clk),.rst(dsp_rst),.strobe(set_stb_dsp),.addr(set_addr_dsp),.in(set_data_dsp),.changed(sfc_clear));
+
// Output control lines
wire [7:0] clock_outs, serdes_outs, adc_outs;
assign {clock_ready, clk_en[1:0], clk_sel[1:0]} = clock_outs[4:0];
diff --git a/fpga/usrp2/top/extract_usage.py b/fpga/usrp2/top/extract_usage.py
new file mode 100755
index 000000000..55fbf384c
--- /dev/null
+++ b/fpga/usrp2/top/extract_usage.py
@@ -0,0 +1,60 @@
+#!/usr/bin/env python
+#
+# Copyright 2012 Ettus Research LLC
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+import os
+import sys
+
+ALL_MAP_FILES = """\
+./N2x0/build-N210R4/u2plus_map.map N210
+./N2x0/build-N200R4/u2plus_map.map N200
+./USRP2/build/u2_rev3_map.map USRP2
+./E1x0/build-E100/u1e_map.map E100
+./E1x0/build-E110/u1e_map.map E110
+./B100/build-B100/B100_map.map B100
+"""
+
+def extract_map_from_file(path):
+ output = ''
+ found = False
+ for line in open(path).readlines():
+ if line.strip() == 'Mapping completed.': found = False
+ if line.strip() == 'Logic Utilization:': found = True
+ if found: output += line
+ return output
+
+def extract_maps():
+ output = ''
+ for line in ALL_MAP_FILES.splitlines():
+ path, name = line.split()
+ if not os.path.exists(path):
+ print 'DNE ', path, ' skipping...'
+ output += """
+
+
+
+########################################################################
+## %s Usage Summary
+########################################################################
+
+%s"""%(name, extract_map_from_file(path).strip())
+ return output + '\n\n'
+
+if __name__ == '__main__':
+ summary = extract_maps()
+ if len(sys.argv) == 1: print summary
+ else: open(sys.argv[1], 'w').write(summary)
diff --git a/fpga/usrp2/vrt/vita_rx_framer.v b/fpga/usrp2/vrt/vita_rx_framer.v
index 514df1151..6e4b8025d 100644
--- a/fpga/usrp2/vrt/vita_rx_framer.v
+++ b/fpga/usrp2/vrt/vita_rx_framer.v
@@ -85,9 +85,11 @@ module vita_rx_framer
(.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr),
.in(set_data),.out(samples_per_packet),.changed());
- setting_reg #(.my_addr(BASE+8),.width(4), .at_reset(1)) sr_numchan
+ assign numchan = 0;/*
+ setting_reg #(.my_addr(BASE+8),.width(4), .at_reset(0)) sr_numchan
(.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr),
.in(set_data),.out(numchan),.changed());
+ */
// Output FIFO for packetized data
localparam VITA_IDLE = 0;
@@ -164,7 +166,7 @@ module vita_rx_framer
VITA_PAYLOAD :
if(sample_fifo_src_rdy_i)
begin
- if(sample_phase == (numchan-4'd1))
+ if(sample_phase == numchan)
begin
sample_phase <= 0;
sample_ctr <= sample_ctr + 1;
@@ -213,7 +215,7 @@ module vita_rx_framer
assign data_o[35:34] = 2'b00; // Always write full lines
assign sample_fifo_dst_rdy_o = pkt_fifo_rdy &
( ((vita_state==VITA_PAYLOAD) &
- (sample_phase == (numchan-4'd1)) &
+ (sample_phase == numchan) &
~|flags_fifo_o[4:1]) |
(vita_state==VITA_ERR_PAYLOAD));
diff --git a/fpga/usrp2/vrt/vita_tx_deframer.v b/fpga/usrp2/vrt/vita_tx_deframer.v
index 6919da11a..ed3916311 100644
--- a/fpga/usrp2/vrt/vita_tx_deframer.v
+++ b/fpga/usrp2/vrt/vita_tx_deframer.v
@@ -43,10 +43,11 @@ module vita_tx_deframer
localparam FIFOWIDTH = 5+64+16+(32*MAXCHAN);
- wire [1:0] numchan;
+ wire [1:0] numchan = 0;/*
setting_reg #(.my_addr(BASE), .at_reset(0), .width(2)) sr_numchan
(.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr),
.in(set_data),.out(numchan),.changed());
+ */
reg [3:0] vita_state;
wire has_streamid, has_classid, has_secs, has_tics, has_trailer;