`timescale 1 ns / 1 ps module upload_config# ( parameter CHANNLE_QTY = 64 , parameter PRE_MSG_LEN = 24 ) ( input clk , input rst_n , input [13-1:0] bram_addr , input bram_clk , input [32-1:0] bram_din , output reg [32-1:0] bram_dout , input bram_en , input bram_rst , input [ 4-1:0] bram_we , output reg eeg_sel , output reg protocol_sel , output [ 8*PRE_MSG_LEN-1:0] pre_message_array , output [ 8*CHANNLE_QTY-1:0] ch_mapping2pc_array , output [ CHANNLE_QTY-1:0] upload_ch_array , output reg [32-1:0] upload_round_qty_set, output reg [ 8-1:0] pre_message_length , output reg reset_package_id , output reg [32-1:0] package_overtime_ms ); //***************************************************************************** // localparam definition //***************************************************************************** localparam BRAM_ADDR_TEST_RO = 13'h0000; localparam BRAM_ADDR_TEST_RW = 13'h0004; localparam BRAM_ADDR_SEL = 13'h0010; localparam BRAM_ADDR_ROUNDS_QTY = 13'h0014; localparam BRAM_ADDR_PRE_MSG_LTH = 13'h0018; localparam BRAM_ADDR_RESET_PACKAGE_ID = 13'h001C; localparam BRAM_ADDR_PACKAGE_OVERTIME = 13'h0020; localparam BRAM_ADDR_MESSAGE_END = 13'h0024; localparam BRAM_ADDR_PRE_MSG_START = 13'h0100; localparam BRAM_ADDR_PRE_MSG_MASK = 13'h1F00; localparam BRAM_ADDR_CH_MAP_START = 13'h0200; localparam BRAM_ADDR_CH_MAP_MASK = 13'h1F00; localparam BRAM_ADDR_UPLOAD_CH_START = 13'h0300; localparam BRAM_ADDR_UPLOAD_CH_MASK = 13'h1F00; localparam N = (CHANNLE_QTY+7)/8; //***************************************************************************** // Internal register and wire declarations //***************************************************************************** reg [32-1:0] test_data ; wire bram_wr_valid ; wire bram_rd_valid ; reg [ 8-1:0] pre_message[0:PRE_MSG_LEN-1] ; reg [ 8-1:0] ch_mapping2pc[0:CHANNLE_QTY-1] ; reg [ 8-1:0] upload_ch[0:N-1] ; wire [8*N-1:0] upload_ch_array_w ; integer n; genvar i; //***************************************************************************** // Instantiation //***************************************************************************** //***************************************************************************** // Procedural blocks //***************************************************************************** //write bram/Set config always @ ( posedge clk or negedge rst_n ) begin if( !rst_n ) test_data <= 0; else if ( bram_wr_valid && ( bram_addr == BRAM_ADDR_TEST_RW ) ) test_data <= bram_din; end always @ ( posedge clk or negedge rst_n ) begin if ( !rst_n ) begin eeg_sel <= 1'b0; protocol_sel <= 1'b0; end else if ( bram_wr_valid && ( bram_addr == BRAM_ADDR_SEL ) ) begin eeg_sel <= bram_din[0]; protocol_sel <= bram_din[1]; end end always @ ( posedge clk or negedge rst_n ) begin if( !rst_n ) upload_round_qty_set <= 0; else if ( bram_wr_valid && ( bram_addr == BRAM_ADDR_ROUNDS_QTY ) ) upload_round_qty_set <= bram_din; end always @ ( posedge clk or negedge rst_n ) begin if( !rst_n ) pre_message_length <= 0; else if ( bram_wr_valid && ( bram_addr == BRAM_ADDR_PRE_MSG_LTH ) ) pre_message_length <= bram_din[7:0]; end always @ ( posedge clk or negedge rst_n ) begin if( !rst_n ) reset_package_id <= 1'b0; else if ( bram_wr_valid && ( bram_addr == BRAM_ADDR_RESET_PACKAGE_ID ) ) reset_package_id <= 1'b1; else reset_package_id <= 1'b0; end always @ ( posedge clk or negedge rst_n ) begin if( !rst_n ) package_overtime_ms <= 10; else if ( bram_wr_valid && ( bram_addr == BRAM_ADDR_PACKAGE_OVERTIME ) ) package_overtime_ms <= bram_din; end always @ ( posedge clk or negedge rst_n ) begin if( !rst_n ) begin for(n=0; n