⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 alt_avalonst_pfc_0.v

📁 ddc的vhdl源代码
💻 V
📖 第 1 页 / 共 2 页
字号:
// --------------------------------------------------------------------------------//| Packet Format Converter// --------------------------------------------------------------------------------// Packet Descriptors// in0 : I,Q / 1// out0 : I / 1// out1 : Q / 1`timescale 100ps / 100psmodule alt_avalonst_pfc_0 (          // Interface: clk      input              clk,      input              reset_n,      // Interface: in0      input              in0_valid,      output reg         in0_ready,      input      [15: 0] in0_data,      input              in0_startofpacket,      input              in0_endofpacket,      // Interface: out0      output reg         out0_valid,      input              out0_ready,      output reg [15: 0] out0_data,      output reg         out0_startofpacket,      output reg         out0_endofpacket,      output reg [ 0: 0] out0_error,      // Interface: out1      output reg         out1_valid,      input              out1_ready,      output reg [15: 0] out1_data,      output reg         out1_startofpacket,      output reg         out1_endofpacket,      output reg [ 0: 0] out1_error);   // ---------------------------------------------------------------------   //| Signal Declarations   // ---------------------------------------------------------------------      // ------------------   // Errdor Handling   reg          error_reset_n;   reg          error_detected;   reg          internal_reset_n;   // ------------------   // Input Control   reg  [ 3: 0] in0_wr_ptr;   reg  [ 3: 0] in0_beat_counter;   reg  [15: 0] in0_mem [15:0];   reg  [ 6: 0] in0_space_used;   reg  [ 6: 0] in0_new_beats_available;      reg  [ 6: 0] in0_beats_available;   reg          in0_waiting_for_sop;   reg  [ 6: 0] in0_beats_available_minus_enable;         // ------------------   // p2 stage   reg          p2_beat_counter;   reg          p2_data_available;   reg          p2_enable;   reg  [ 6: 0] p2_out0_beats_used; // Warning: Stale value   reg  [ 6: 0] p2_out0_new_beats_used; // Warning: Stale value   reg          p2_out0_valid;            reg          p2_out0_startofpacket;    reg          p2_out0_endofpacket;      reg          p2_out0_empty;   reg  [ 9: 0] p2_out0_s0_select;   // The input symbol to take from   reg  [ 3: 0] p2_out0_s0_in0_rd_ptr;   reg  [ 6: 0] p2_out0_in0_space_available;   reg  [ 6: 0] p2_out1_beats_used; // Warning: Stale value   reg  [ 6: 0] p2_out1_new_beats_used; // Warning: Stale value   reg          p2_out1_valid;            reg          p2_out1_startofpacket;    reg          p2_out1_endofpacket;      reg          p2_out1_empty;   reg  [ 9: 0] p2_out1_s0_select;   // The input symbol to take from   reg  [ 3: 0] p2_out1_s0_in0_rd_ptr;   reg  [ 6: 0] p2_out1_in0_space_available;   // ------------------   // p1 stage   reg          p1_enable;   reg          p1_out0_valid;    reg          p1_out0_startofpacket;   reg          p1_out0_endofpacket;   reg          p1_out0_empty;   reg  [ 9: 0] p1_out0_s0_select;   reg  [ 6: 0] p1_out0_in0_space_available;   reg  [ 6: 0] p1_out0_in0_space_difference;   reg          p1_out1_valid;    reg          p1_out1_startofpacket;   reg          p1_out1_endofpacket;   reg          p1_out1_empty;   reg  [ 9: 0] p1_out1_s0_select;   reg  [ 6: 0] p1_out1_in0_space_available;   reg  [ 6: 0] p1_out1_in0_space_difference;   // ------------------   // p0 stage   reg          p0_enable;   reg          p0_out0_valid;    reg          p0_out0_startofpacket;   reg          p0_out0_endofpacket;   reg          p0_out0_empty;   reg  [ 9: 0] p0_out0_s0_select;   wire [15: 0] p0_out0_s0_in0_rd_data;   reg  [ 6: 0] p0_out0_in0_space_difference;   reg          p0_out1_valid;    reg          p0_out1_startofpacket;   reg          p0_out1_endofpacket;   reg          p0_out1_empty;   reg  [ 9: 0] p0_out1_s0_select;   wire [15: 0] p0_out1_s0_in0_rd_data;   reg  [ 6: 0] p0_out1_in0_space_difference;   // ------------------   // to egress fifo   wire         tofifo_out0_ready;   reg          tofifo_out0_valid;    reg  [15: 0] tofifo_out0_data;   reg          tofifo_out0_startofpacket;   reg          tofifo_out0_endofpacket;   reg          tofifo_out0_empty;   reg  [ 0: 0] tofifo_out0_error;   wire         tofifo_out1_ready;   reg          tofifo_out1_valid;    reg  [15: 0] tofifo_out1_data;   reg          tofifo_out1_startofpacket;   reg          tofifo_out1_endofpacket;   reg          tofifo_out1_empty;   reg  [ 0: 0] tofifo_out1_error;    // ------------------   // from egress fifo   reg          fromfifo_out0_ready;   wire         fromfifo_out0_valid;    wire [15: 0] fromfifo_out0_data;   wire         fromfifo_out0_startofpacket;   wire         fromfifo_out0_endofpacket;   wire         fromfifo_out0_empty;   wire [ 0: 0] fromfifo_out0_error;   reg          fromfifo_out1_ready;   wire         fromfifo_out1_valid;    wire [15: 0] fromfifo_out1_data;   wire         fromfifo_out1_startofpacket;   wire         fromfifo_out1_endofpacket;   wire         fromfifo_out1_empty;   wire [ 0: 0] fromfifo_out1_error;    // ------------------   // output stage   reg          tofifo_out_ready;   reg          tofifo_out_enable;   reg          tofifo_out0_error_reported;   reg          tofifo_out1_error_reported;   // ------------------   // optimizing   reg          in0_beats_equals_out0_beats;   reg          in0_beats_equals_out1_beats;   // ------------------   // dummy signals.   reg          out0_empty = 0;   reg          out1_empty = 0;   // ----------------------------------------------------------------------   //| Reset Control   // ----------------------------------------------------------------------   always @* begin      internal_reset_n = reset_n && error_reset_n;   end      always @ (negedge reset_n, posedge clk) begin      if (!reset_n) begin         error_reset_n <= 0;      end else begin      error_reset_n <= 0;      if (!tofifo_out0_error_reported)         error_reset_n <= 1;      if (!tofifo_out1_error_reported)         error_reset_n <= 1;      end   end         // ----------------------------------------------------------------------   //| Input Stages - write to FIFOs. (1 FIFO per input interface/symbol.)   // ----------------------------------------------------------------------   always @* begin        in0_new_beats_available = in0_beats_available;                //----------------------------------------        // Interface: in0        if (in0_ready && in0_valid && (in0_startofpacket || ~in0_waiting_for_sop )) begin           // Update the number of symbols that are available for each            // output based on knowledge of the packet format.           case (in0_beat_counter)              0 : in0_new_beats_available = in0_beats_available  + 0;              1 : in0_new_beats_available = in0_beats_available  + 1;              default : in0_new_beats_available = in0_beats_available  + 0;           endcase        end   end       always @ (negedge internal_reset_n, posedge clk) begin      if (!internal_reset_n) begin        error_detected <= 0;        in0_ready <= 0;        in0_wr_ptr <= 0;        in0_beat_counter <= 0;        in0_space_used <= 0;        in0_beats_available <= 0;        in0_waiting_for_sop <= 1;      end else begin                //----------------------------------------        // Interface: in0        // If the write pointer is getting close to         // the read pointer, backpressure        in0_ready <= 1;                  if (p1_out0_in0_space_difference <= 2 )           in0_ready <= 0;         if (p1_out1_in0_space_difference <= 2 )           in0_ready <= 0;         if (in0_ready && in0_valid && in0_startofpacket)           in0_waiting_for_sop <= 0;                      if (in0_ready && in0_valid && (in0_startofpacket || ~in0_waiting_for_sop )) begin           in0_wr_ptr <= in0_wr_ptr + 1'b1;           in0_space_used <= in0_space_used + 1'b1;       	   in0_beat_counter <= in0_beat_counter + 1'b1;           if (in0_beat_counter == 1) begin              in0_beat_counter <= 0;           end           // Frame Delineation Error Detection           if ( (in0_beat_counter == 0)  // SOP Expected              || (in0_beat_counter == 2)               || (in0_beat_counter == 0)            ) begin               if (in0_startofpacket==0) begin                 error_detected <= 1;              end           end else begin              if (in0_startofpacket==1) begin                 error_detected <= 1;              end           end                                 if ( (in0_beat_counter == 1)  // EOP Expected              || (in0_beat_counter == 3)               || (in0_beat_counter == 1)            ) begin               if (in0_endofpacket==0) begin                 error_detected <= 1;              end           end else begin              if (in0_endofpacket==1) begin                 error_detected <= 1;              end           end                      // Update the number of symbols that are available for each            // output based on knowledge of the packet format.           case (in0_beat_counter)              0 : in0_beats_available <= in0_beats_available  + 0;              1 : in0_beats_available <= in0_beats_available  + 1;           endcase	        end        in0_beats_available <= in0_new_beats_available;      end   end   // ---------------------------------------------------------------------   //| Instantiate Memory   // ---------------------------------------------------------------------       altsyncram          #(           .operation_mode ("DUAL_PORT"),           .width_a       (16),           .widthad_a     (4),           .numwords_a    (15+1),                 .width_b       (16),           .widthad_b     (4),                 .numwords_b    (15+1),                 .address_reg_b ("CLOCK0"),           .outdata_reg_b ("CLOCK0")          )          out0_s0_in0_mem         (           .clock0        (clk),           .wren_a        (in0_ready && in0_valid),           .address_a     (in0_wr_ptr),           .data_a        (in0_data),           .address_b     (p2_out0_s0_in0_rd_ptr),           .q_b           (p0_out0_s0_in0_rd_data)         );              altsyncram          #(           .operation_mode ("DUAL_PORT"),           .width_a       (16),           .widthad_a     (4),           .numwords_a    (15+1),                 .width_b       (16),           .widthad_b     (4),                 .numwords_b    (15+1),                 .address_reg_b ("CLOCK0"),           .outdata_reg_b ("CLOCK0")          )          out1_s0_in0_mem         (           .clock0        (clk),           .wren_a        (in0_ready && in0_valid),           .address_a     (in0_wr_ptr),           .data_a        (in0_data),           .address_b     (p2_out1_s0_in0_rd_ptr),           .q_b           (p0_out1_s0_in0_rd_data)         );          // ----------------------------------------------------------------------   //| Backpressure / Flow control   // ----------------------------------------------------------------------      // ----------------------------------------------------------------------   //| Main Output Counter   // ----------------------------------------------------------------------   always @ (negedge internal_reset_n, posedge clk) begin      if (!internal_reset_n) begin        tofifo_out_enable <= 0;        p0_enable <= 0;        p1_enable <= 0;        p2_enable <= 0;      end else begin        tofifo_out_enable <= p0_enable;        p0_enable <= p1_enable;        p1_enable <= p2_enable;        p2_enable <= tofifo_out_ready && p2_data_available;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -