Advertisement
carruinar

noc_block_ddc.v

Nov 27th, 2018
242
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VeriLog 13.22 KB | None | 0 0
  1. //
  2. // Copyright 2016 Ettus Research
  3. // Copyright 2018 Ettus Research, a National Instruments Company
  4. //
  5. // SPDX-License-Identifier: LGPL-3.0-or-later
  6. //
  7.  
  8. module noc_block_ddc #(
  9.   parameter NOC_ID            = 64'hDDC0_0000_0000_0000,
  10.   parameter STR_SINK_FIFOSIZE = 11,     //Log2 of input buffer size in 8-byte words (must hold at least 2 MTU packets)
  11.   parameter MTU               = 10,     //Log2 of output buffer size in 8-byte words (must hold at least 1 MTU packet)
  12.   parameter NUM_CHAINS        = 2,
  13.   parameter COMPAT_NUM_MAJOR  = 32'h2,
  14.   parameter COMPAT_NUM_MINOR  = 32'h0,
  15.   parameter NUM_HB            = 3,
  16.   parameter CIC_MAX_DECIM     = 255
  17. )(
  18.   input bus_clk, input bus_rst,
  19.   input ce_clk, input ce_rst,
  20.   input  [63:0] i_tdata, input  i_tlast, input  i_tvalid, output i_tready,
  21.   output [63:0] o_tdata, output o_tlast, output o_tvalid, input  o_tready,
  22.   output [63:0] debug
  23. );
  24.  
  25.   localparam NUM_INPUTS  = 1;
  26.   localparam NUM_OUTPUTS = 4;
  27.  
  28.   ////////////////////////////////////////////////////////////
  29.   //
  30.   // RFNoC Shell
  31.   //
  32.   ////////////////////////////////////////////////////////////
  33.   wire [NUM_OUTPUTS*32-1:0]      set_data;
  34.   wire [NUM_OUTPUTS*8-1:0]       set_addr;
  35.   wire [NUM_OUTPUTS-1:0]         set_stb;
  36.   wire [NUM_OUTPUTS*64-1:0]      set_time;
  37.   wire [NUM_OUTPUTS-1:0]         set_has_time;
  38.   wire [NUM_OUTPUTS-1:0]         rb_stb;
  39.   wire [8*NUM_OUTPUTS-1:0]       rb_addr;
  40.   reg  [64*NUM_OUTPUTS-1:0]      rb_data;
  41.  
  42.   wire [63:0]                   cmdout_tdata, ackin_tdata;
  43.   wire                          cmdout_tlast, cmdout_tvalid, cmdout_tready, ackin_tlast, ackin_tvalid, ackin_tready;
  44.  
  45.   wire [64*NUM_OUTPUTS-1:0]      str_src_tdata;
  46.   wire [NUM_OUTPUTS-1:0]         str_src_tlast, str_src_tvalid, str_src_tready;
  47.  
  48.   wire [64*NUM_INPUTS-1:0]      str_sink_tdata;
  49.   wire [NUM_INPUTS-1:0]         str_sink_tlast, str_sink_tready;
  50.   wire [NUM_INPUTS-1:0]         str_sink_tvalid;
  51.  
  52.   wire [NUM_OUTPUTS-1:0]        clear_tx_seqnum;
  53.   wire [16*NUM_OUTPUTS-1:0]     src_sid, next_dst_sid, resp_out_dst_sid;
  54.   wire [16*NUM_INPUTS-1:0]      resp_in_dst_sid;
  55.  
  56.   noc_shell #(
  57.     .NOC_ID(NOC_ID),
  58.     .INPUT_PORTS(NUM_INPUTS),
  59.     .OUTPUT_PORTS(NUM_OUTPUTS),
  60.     .STR_SINK_FIFOSIZE({NUM_INPUTS{STR_SINK_FIFOSIZE[7:0]}}))
  61.   noc_shell (
  62.     .bus_clk(bus_clk), .bus_rst(bus_rst),
  63.     .i_tdata(i_tdata), .i_tlast(i_tlast), .i_tvalid(i_tvalid), .i_tready(i_tready),
  64.     .o_tdata(o_tdata), .o_tlast(o_tlast), .o_tvalid(o_tvalid), .o_tready(o_tready),
  65.     // Computer Engine Clock Domain
  66.     .clk(ce_clk), .reset(ce_rst),
  67.     // Control Sink
  68.     .set_data(set_data), .set_addr(set_addr), .set_stb(set_stb), .set_time(set_time), .set_has_time(set_has_time),
  69.     .rb_stb(rb_stb), .rb_data(rb_data), .rb_addr(rb_addr),
  70.     // Control Source
  71.     .cmdout_tdata(cmdout_tdata), .cmdout_tlast(cmdout_tlast), .cmdout_tvalid(cmdout_tvalid), .cmdout_tready(cmdout_tready),
  72.     .ackin_tdata(ackin_tdata), .ackin_tlast(ackin_tlast), .ackin_tvalid(ackin_tvalid), .ackin_tready(ackin_tready),
  73.     // Stream Sink
  74.     .str_sink_tdata(str_sink_tdata), .str_sink_tlast(str_sink_tlast), .str_sink_tvalid(str_sink_tvalid), .str_sink_tready({str_sink_tready[0],str_sink_tready[0]}),
  75.     // Stream Source
  76.     .str_src_tdata(str_src_tdata), .str_src_tlast(str_src_tlast), .str_src_tvalid(str_src_tvalid), .str_src_tready(str_src_tready),
  77.     // Stream IDs set by host
  78.     .src_sid(src_sid),                   // SID of this block
  79.     .next_dst_sid(next_dst_sid),         // Next destination SID
  80.     .resp_in_dst_sid(resp_in_dst_sid),   // Response destination SID for input stream responses / errors
  81.     .resp_out_dst_sid(resp_out_dst_sid), // Response destination SID for output stream responses / errors
  82.     // Misc
  83.     .vita_time(64'd0),
  84.     .clear_tx_seqnum(clear_tx_seqnum),
  85.     .debug(debug));
  86.  
  87.   // Control Source Unused
  88.   assign cmdout_tdata = 64'd0;
  89.   assign cmdout_tlast = 1'b0;
  90.   assign cmdout_tvalid = 1'b0;
  91.   assign ackin_tready = 1'b1;
  92.  
  93.   // NoC Shell registers 0 - 127,
  94.   // User register address space starts at 128
  95.   localparam SR_N_ADDR        = 128;
  96.   localparam SR_M_ADDR        = 129;
  97.   localparam SR_CONFIG_ADDR   = 130;
  98.   localparam SR_FREQ_ADDR     = 132;
  99.   localparam SR_SCALE_IQ_ADDR = 133;
  100.   localparam SR_DECIM_ADDR    = 134;
  101.   localparam SR_MUX_ADDR      = 135;
  102.   localparam SR_COEFFS_ADDR   = 136;
  103.   localparam RB_COMPAT_NUM    = 0;
  104.   localparam RB_NUM_HB        = 1;
  105.   localparam RB_CIC_MAX_DECIM = 2;
  106.   localparam COMPAT_NUM       = {COMPAT_NUM_MAJOR, COMPAT_NUM_MINOR};
  107.   localparam MAX_N = CIC_MAX_DECIM * 2<<(NUM_HB-1);
  108.  
  109.   wire [31:0] sample_in_tdata [0:NUM_OUTPUTS-1];
  110.   wire [0:NUM_OUTPUTS-1] sample_out_tready;
  111.   wire [0:NUM_OUTPUTS-1] sample_in_tuser;
  112.   wire [0:NUM_OUTPUTS-1] sample_in_eob;
  113.   wire [0:NUM_OUTPUTS-1] sample_in_tvalid;
  114.   wire [0:NUM_OUTPUTS-1] sample_in_tlast;
  115.  
  116.   wire sample_out_tready_all;
  117.   assign sample_out_tready_all = sample_out_tready[0] && sample_out_tready[1];
  118.  
  119.   genvar i;
  120.   generate
  121.     for (i = 0; i < NUM_OUTPUTS; i = i + 1) begin : gen_ddc_chains
  122.       ////////////////////////////////////////////////////////////
  123.       //
  124.       // AXI Wrapper
  125.       // Convert RFNoC Shell interface into AXI stream interface
  126.       //
  127.       ////////////////////////////////////////////////////////////
  128.       wire [31:0]  m_axis_data_tdata;
  129.       wire         m_axis_data_tlast;
  130.       wire         m_axis_data_tvalid;
  131.       wire         m_axis_data_tready;
  132.       wire [127:0] m_axis_data_tuser;
  133.  
  134.       wire [31:0]  s_axis_data_tdata;
  135.       wire         s_axis_data_tlast;
  136.       wire         s_axis_data_tvalid;
  137.       wire         s_axis_data_tready;
  138.       wire [127:0] s_axis_data_tuser;
  139.  
  140.       wire clear_user;
  141.  
  142.       wire        set_stb_int      = set_stb[i];
  143.       wire [7:0]  set_addr_int     = set_addr[8*i+7:8*i];
  144.       wire [31:0] set_data_int     = set_data[32*i+31:32*i];
  145.       wire [63:0] set_time_int     = set_time[64*i+63:64*i];
  146.       wire        set_has_time_int = set_has_time[i];
  147.  
  148.       // TODO Readback register for number of FIR filter taps
  149.       always @*
  150.         case(rb_addr[8*i+7:8*i])
  151.           RB_COMPAT_NUM    : rb_data[64*i+63:64*i] <= {COMPAT_NUM};
  152.           RB_NUM_HB        : rb_data[64*i+63:64*i] <= {NUM_HB};
  153.           RB_CIC_MAX_DECIM : rb_data[64*i+63:64*i] <= {CIC_MAX_DECIM};
  154.           default          : rb_data[64*i+63:64*i] <= 64'h0BADC0DE0BADC0DE;
  155.         endcase
  156.  
  157.       axi_wrapper #(
  158.         .SIMPLE_MODE(0), .MTU(MTU))
  159.       axi_wrapper (
  160.         .bus_clk(bus_clk), .bus_rst(bus_rst),
  161.         .clk(ce_clk), .reset(ce_rst),
  162.         .clear_tx_seqnum(clear_tx_seqnum[i]),
  163.         .next_dst(next_dst_sid[16*i+15:16*i]),
  164.         .set_stb(set_stb_int), .set_addr(set_addr_int), .set_data(set_data_int),
  165.         .i_tdata(str_sink_tdata[64*0+63:64*0]), .i_tlast(str_sink_tlast[0]), .i_tvalid(str_sink_tvalid[0]), .i_tready(str_sink_tready[i]),
  166.         .o_tdata(str_src_tdata[64*i+63:64*i]), .o_tlast(str_src_tlast[i]), .o_tvalid(str_src_tvalid[i]), .o_tready(str_src_tready[0]),
  167.         .m_axis_data_tdata(m_axis_data_tdata),
  168.         .m_axis_data_tlast(m_axis_data_tlast),
  169.         .m_axis_data_tvalid(m_axis_data_tvalid),
  170.         .m_axis_data_tready(m_axis_data_tready),
  171.         .m_axis_data_tuser(m_axis_data_tuser),
  172.         .s_axis_data_tdata(s_axis_data_tdata),
  173.         .s_axis_data_tlast(s_axis_data_tlast),
  174.         .s_axis_data_tvalid(s_axis_data_tvalid),
  175.         .s_axis_data_tready(s_axis_data_tready),
  176.         .s_axis_data_tuser(s_axis_data_tuser),
  177.         .m_axis_config_tdata(),
  178.         .m_axis_config_tlast(),
  179.         .m_axis_config_tvalid(),
  180.         .m_axis_config_tready(),
  181.         .m_axis_pkt_len_tdata(),
  182.         .m_axis_pkt_len_tvalid(),
  183.         .m_axis_pkt_len_tready());
  184.  
  185.       ////////////////////////////////////////////////////////////
  186.       //
  187.       // Timed Commands
  188.       //
  189.       ////////////////////////////////////////////////////////////
  190.       wire [31:0]  m_axis_tagged_tdata;
  191.       wire         m_axis_tagged_tlast;
  192.       wire         m_axis_tagged_tvalid;
  193.       wire         m_axis_tagged_tready;
  194.       wire [127:0] m_axis_tagged_tuser;
  195.       wire         m_axis_tagged_tag;
  196.  
  197.       wire         out_set_stb;
  198.       wire [7:0]   out_set_addr;
  199.       wire [31:0]  out_set_data;
  200.       wire         timed_set_stb;
  201.       wire [7:0]   timed_set_addr;
  202.       wire [31:0]  timed_set_data;
  203.  
  204.       wire         timed_cmd_fifo_full;
  205.  
  206.       axi_tag_time #(
  207.         .NUM_TAGS(1),
  208.         .SR_TAG_ADDRS(SR_FREQ_ADDR))
  209.       axi_tag_time (
  210.         .clk(ce_clk),
  211.         .reset(ce_rst),
  212.         .clear(clear_tx_seqnum[i]),
  213.         .tick_rate(16'd1),
  214.         .timed_cmd_fifo_full(timed_cmd_fifo_full),
  215.         .s_axis_data_tdata(m_axis_data_tdata), .s_axis_data_tlast(m_axis_data_tlast),
  216.         .s_axis_data_tvalid(m_axis_data_tvalid), .s_axis_data_tready(m_axis_data_tready),
  217.         .s_axis_data_tuser(m_axis_data_tuser),
  218.         .m_axis_data_tdata(m_axis_tagged_tdata), .m_axis_data_tlast(m_axis_tagged_tlast),
  219.         .m_axis_data_tvalid(m_axis_tagged_tvalid), .m_axis_data_tready(m_axis_tagged_tready),
  220.         .m_axis_data_tuser(m_axis_tagged_tuser), .m_axis_data_tag(m_axis_tagged_tag),
  221.         .in_set_stb(set_stb_int), .in_set_addr(set_addr_int), .in_set_data(set_data_int),
  222.         .in_set_time(set_time_int), .in_set_has_time(set_has_time_int),
  223.         .out_set_stb(out_set_stb), .out_set_addr(out_set_addr), .out_set_data(out_set_data),
  224.         .timed_set_stb(timed_set_stb), .timed_set_addr(timed_set_addr), .timed_set_data(timed_set_data));
  225.  
  226.       // Hold off reading additional commands if internal FIFO is full
  227.       assign rb_stb[i] = ~timed_cmd_fifo_full;
  228.  
  229.       ////////////////////////////////////////////////////////////
  230.       //
  231.       // Reduce Rate
  232.       //
  233.       ////////////////////////////////////////////////////////////
  234.       // wire [31:0] sample_in_tdata;
  235.       // wire sample_in_tuser;
  236.       // wire sample_in_eob;
  237.       // wire sample_in_tvalid;
  238.       // wire sample_in_tlast;
  239.       //
  240.       wire [31:0] sample_out_tdata;
  241.       // wire sample_in_tready;
  242.       wire sample_out_tvalid;
  243.       //
  244.       wire nc;
  245.       wire warning_long_throttle;
  246.       wire error_extra_outputs;
  247.       wire error_drop_pkt_lockup;
  248.       axi_rate_change #(
  249.         .WIDTH(33),
  250.         .MAX_N(MAX_N),
  251.         .MAX_M(1),
  252.         .SR_N_ADDR(SR_N_ADDR),
  253.         .SR_M_ADDR(SR_M_ADDR),
  254.         .SR_CONFIG_ADDR(SR_CONFIG_ADDR))
  255.       axi_rate_change (
  256.         .clk(ce_clk), .reset(ce_rst), .clear(clear_tx_seqnum[i]), .clear_user(clear_user),
  257.         .src_sid(src_sid[16*i+15:16*i]), .dst_sid(next_dst_sid[16*i+15:16*i]),
  258.         .set_stb(out_set_stb), .set_addr(out_set_addr), .set_data(out_set_data),
  259.         .i_tdata({m_axis_tagged_tag,m_axis_tagged_tdata}), .i_tlast(m_axis_tagged_tlast),
  260.         .i_tvalid(m_axis_tagged_tvalid), .i_tready(m_axis_tagged_tready),
  261.         .i_tuser(m_axis_tagged_tuser),
  262.         .o_tdata({nc,s_axis_data_tdata}), .o_tlast(s_axis_data_tlast), .o_tvalid(s_axis_data_tvalid),
  263.         .o_tready(s_axis_data_tready), .o_tuser(s_axis_data_tuser),
  264.         ////////////////////////////////////////////////////////////////////////
  265.         .m_axis_data_tdata({sample_in_tuser[i],sample_in_tdata[i]}), .m_axis_data_tlast(sample_in_tlast[i]),
  266.         .m_axis_data_tvalid(sample_in_tvalid[i]), .m_axis_data_tready(sample_in_tready),
  267.         ////////////////////////////////////////////////////////////////////////
  268.         .s_axis_data_tdata({1'b0,sample_out_tdata}), .s_axis_data_tlast(1'b0),
  269.         .s_axis_data_tvalid(sample_out_tvalid), .s_axis_data_tready(sample_out_tready[i]),
  270.         .warning_long_throttle(warning_long_throttle),
  271.         .error_extra_outputs(error_extra_outputs),
  272.         .error_drop_pkt_lockup(error_drop_pkt_lockup));
  273.  
  274.       assign sample_in_eob[i] = m_axis_tagged_tuser[124]; //this should align with last packet output from axi_rate_change
  275.  
  276.       ////////////////////////////////////////////////////////////
  277.       //
  278.       // Digital Down Converter
  279.       //
  280.       ////////////////////////////////////////////////////////////
  281.  
  282.       ddc #(
  283.         .SR_FREQ_ADDR(SR_FREQ_ADDR),
  284.         .SR_SCALE_IQ_ADDR(SR_SCALE_IQ_ADDR),
  285.         .SR_DECIM_ADDR(SR_DECIM_ADDR),
  286.         .SR_MUX_ADDR(SR_MUX_ADDR),
  287.         .SR_COEFFS_ADDR(SR_COEFFS_ADDR),
  288.         .NUM_HB(NUM_HB),
  289.         .CIC_MAX_DECIM(CIC_MAX_DECIM))
  290.       ddc (
  291.         .clk(ce_clk), .reset(ce_rst),
  292.         .clear(clear_user | clear_tx_seqnum[i]), // Use AXI Rate Change's clear user to reset block to initial state after EOB
  293.         .set_stb(out_set_stb), .set_addr(out_set_addr), .set_data(out_set_data),
  294.         .timed_set_stb(timed_set_stb), .timed_set_addr(timed_set_addr), .timed_set_data(timed_set_data),
  295.         ////////////////////////////////////////////////////////////////////////
  296.         .sample_in_tdata(sample_in_tdata[0]), .sample_in_tlast(sample_in_tlast[0]),
  297.         .sample_in_tvalid(sample_in_tvalid[0]), .sample_in_tready(sample_in_tready),
  298.         .sample_in_tuser(sample_in_tuser[0]), .sample_in_eob(sample_in_eob[0]),
  299.         ////////////////////////////////////////////////////////////////////////
  300.         .sample_out_tdata(sample_out_tdata), .sample_out_tlast(),
  301.         .sample_out_tvalid(sample_out_tvalid), .sample_out_tready(sample_out_tready[0])
  302.         );
  303.  
  304.     end
  305.   endgenerate
  306.  
  307. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement