Files
BSI-901-fpga-software/c64_pro.srcs/sources_1/rtl/upload/upload_top.v
T
2024-10-28 13:14:49 +08:00

285 lines
8.5 KiB
Verilog

`timescale 1 ns / 1 ps
module upload_top#
(
parameter CLK_PERIOD = 10 ,
parameter CHANNLE_QTY = 64 ,
parameter PRE_MSG_LEN = 128
)
(
input clk ,
input rst_n ,
input [13-1:0] bram_addr ,
input bram_clk ,
input [32-1:0] bram_din ,
output [32-1:0] bram_dout ,
input bram_en ,
input bram_rst ,
input [ 4-1:0] bram_we ,
output interrupt ,
input [32-1:0] s_axis_trigger_tdata ,
input s_axis_trigger_tvalid ,
output s_axis_trigger_tready ,
input [32-1:0] s_axis_eeg16_tdata ,
input s_axis_eeg16_tlast ,
output s_axis_eeg16_tready ,
input s_axis_eeg16_tvalid ,
input [32-1:0] s_axis_eeg24_tdata ,
input s_axis_eeg24_tlast ,
output s_axis_eeg24_tready ,
input s_axis_eeg24_tvalid ,
input [32-1:0] s_axis_emg_tdata ,
input s_axis_emg_tlast ,
output s_axis_emg_tready ,
input s_axis_emg_tvalid ,
input [48-1:0] accel_data ,
input m_axis_record_tfull ,
output [ 8-1:0] m_axis_record_tdata ,
output [ 1-1:0] m_axis_record_tkeep ,
output m_axis_record_tlast ,
input m_axis_record_tready ,
output m_axis_record_tvalid ,
output [ 4-1:0] debug_sig
);
//*****************************************************************************
// localparam definition
//*****************************************************************************
//*****************************************************************************
// Internal register and wire declarations
//*****************************************************************************
wire pulse_ms ;
wire [64-1:0] run_time_ms ;
wire eeg_sel ;
wire protocol_sel ;
wire reset_package_id ;
wire [32-1:0] overtime_ms ;
wire [ 8*PRE_MSG_LEN-1:0] pre_message_array ;
wire [ 8-1:0] pre_message_length ;
wire [ 8*CHANNLE_QTY-1:0] ch_mapping2pc_array ;
wire [ CHANNLE_QTY-1:0] upload_ch_array ;
wire [32-1:0] upload_round_qty_set ;
wire [32-1:0] s_axis_trig_ql_tdata ;
wire s_axis_trig_ql_tvalid ;
wire s_axis_trig_ql_tready ;
wire [32-1:0] s_axis_trig_intan_tdata ;
wire s_axis_trig_intan_tvalid ;
wire s_axis_trig_intan_tready ;
wire [ 8-1:0] m_axis_eeg_tdata ;
wire m_axis_eeg_tlast ;
wire m_axis_eeg_tready ;
wire m_axis_eeg_tvalid ;
wire m_axis_eeg_ql_tready ;
wire m_axis_eeg_intan_tready ;
wire m_axis_ql_tfull ;
wire [ 8-1:0] m_axis_ql_tdata ;
wire [ 1-1:0] m_axis_ql_tkeep ;
wire m_axis_ql_tlast ;
wire m_axis_ql_tready ;
wire m_axis_ql_tvalid ;
wire m_axis_intan_tfull ;
wire [ 8-1:0] m_axis_intan_tdata ;
wire [ 1-1:0] m_axis_intan_tkeep ;
wire m_axis_intan_tlast ;
wire m_axis_intan_tready ;
wire m_axis_intan_tvalid ;
wire [ 4-1:0] debug_sig_sort ;
genvar i;
//*****************************************************************************
// Instantiation
//*****************************************************************************
run_time#
(
.CLK_PERIOD ( CLK_PERIOD )
)
u_run_time
(
.clk ( clk ),
.rst_n ( rst_n ),
.pulse_ms ( pulse_ms ),
.run_time_ms ( run_time_ms )
);
upload_config#
(
.CHANNLE_QTY ( CHANNLE_QTY ),
.PRE_MSG_LEN ( PRE_MSG_LEN )
)
u_upload_config
(
.clk ( clk ),
.rst_n ( rst_n ),
.bram_addr ( bram_addr ),
.bram_clk ( bram_clk ),
.bram_din ( bram_din ),
.bram_dout ( bram_dout ),
.bram_en ( bram_en ),
.bram_rst ( bram_rst ),
.bram_we ( bram_we ),
.eeg_sel ( eeg_sel ),
.protocol_sel ( protocol_sel ),
.pre_message_array ( pre_message_array ),
.pre_message_length ( pre_message_length ),
.upload_round_qty_set ( upload_round_qty_set ),
.ch_mapping2pc_array ( ch_mapping2pc_array ),
.upload_ch_array ( upload_ch_array ),
.reset_package_id ( reset_package_id ),
.package_overtime_ms ( overtime_ms )
);
upload_sort#
(
.CLK_PERIOD ( CLK_PERIOD ),
.CHANNLE_QTY ( CHANNLE_QTY )
)
u_upload_sort
(
.clk ( clk ),
.rst_n ( rst_n ),
.eeg_sel ( eeg_sel ),
.protocol_sel ( protocol_sel ),
.ch_mapping2pc_array ( ch_mapping2pc_array ),
.upload_ch_array ( upload_ch_array ),
//------------------------------------------ PL logic
.s_axis_eeg16_tdata ( s_axis_eeg16_tdata ),
.s_axis_eeg16_tlast ( s_axis_eeg16_tlast ),
.s_axis_eeg16_tready ( s_axis_eeg16_tready ),
.s_axis_eeg16_tvalid ( s_axis_eeg16_tvalid ),
.s_axis_eeg24_tdata ( s_axis_eeg24_tdata ),
.s_axis_eeg24_tlast ( s_axis_eeg24_tlast ),
.s_axis_eeg24_tready ( s_axis_eeg24_tready ),
.s_axis_eeg24_tvalid ( s_axis_eeg24_tvalid ),
//------------------------------------------ PC logic
.m_axis_eeg_tdata ( m_axis_eeg_tdata ),
.m_axis_eeg_tlast ( m_axis_eeg_tlast ),
.m_axis_eeg_tready ( m_axis_eeg_tready ),
.m_axis_eeg_tvalid ( m_axis_eeg_tvalid ),
.debug_sig_sort ( debug_sig_sort )
);
upload_protocol_ql#
(
.CLK_PERIOD ( CLK_PERIOD ),
.PRE_MSG_LEN ( PRE_MSG_LEN )
)
u_upload_protocol_ql
(
.clk ( clk ),
.rst_n ( rst_n ),
.enable ( protocol_sel ),
.pulse_ms ( pulse_ms ),
.run_time_ms ( run_time_ms ),
.pre_message_array ( pre_message_array ),
.pre_message_length ( pre_message_length ),
.upload_round_qty_set ( upload_round_qty_set ),
.reset_package_id ( reset_package_id ),
.package_overtime_ms ( overtime_ms ),
.s_axis_trigger_tdata ( s_axis_trig_ql_tdata ),
.s_axis_trigger_tvalid ( s_axis_trig_ql_tvalid ),
.s_axis_trigger_tready ( s_axis_trig_ql_tready ),
.s_axis_eeg_tdata ( m_axis_eeg_tdata ),
.s_axis_eeg_tlast ( m_axis_eeg_tlast ),
.s_axis_eeg_tready ( m_axis_eeg_ql_tready ),
.s_axis_eeg_tvalid ( m_axis_eeg_tvalid ),
.accel_data ( accel_data ),
.m_axis_record_tfull ( m_axis_ql_tfull ),
.m_axis_record_tdata ( m_axis_ql_tdata ),
.m_axis_record_tkeep ( m_axis_ql_tkeep ),
.m_axis_record_tlast ( m_axis_ql_tlast ),
.m_axis_record_tready ( m_axis_ql_tready ),
.m_axis_record_tvalid ( m_axis_ql_tvalid )
);
upload_protocol_intan#
(
.CLK_PERIOD ( CLK_PERIOD )
)
u_upload_protocol_intan
(
.clk ( clk ),
.rst_n ( rst_n ),
.enable ( !protocol_sel ),
.interrupt ( ),
.pulse_ms ( pulse_ms ),
.upload_round_qty_set ( upload_round_qty_set ),
.reset_package_id ( reset_package_id ),
.package_overtime_ms ( overtime_ms ),
.s_axis_trigger_tdata ( s_axis_trig_intan_tdata ),
.s_axis_trigger_tvalid ( s_axis_trig_intan_tvalid ),
.s_axis_trigger_tready ( s_axis_trig_intan_tready ),
.s_axis_eeg_tdata ( m_axis_eeg_tdata ),
.s_axis_eeg_tlast ( m_axis_eeg_tlast ),
.s_axis_eeg_tready ( m_axis_eeg_intan_tready),
.s_axis_eeg_tvalid ( m_axis_eeg_tvalid ),
.m_axis_record_tfull ( m_axis_intan_tfull ),
.m_axis_record_tdata ( m_axis_intan_tdata ),
.m_axis_record_tkeep ( m_axis_intan_tkeep ),
.m_axis_record_tlast ( m_axis_intan_tlast ),
.m_axis_record_tready ( m_axis_intan_tready ),
.m_axis_record_tvalid ( m_axis_intan_tvalid )
);
//*****************************************************************************
// Wire assignment
//*****************************************************************************
assign s_axis_trig_ql_tdata = s_axis_trigger_tdata;
assign s_axis_trig_ql_tvalid = s_axis_trigger_tvalid;
assign s_axis_trig_intan_tdata = s_axis_trigger_tdata;
assign s_axis_trig_intan_tvalid = s_axis_trigger_tvalid;
assign s_axis_trigger_tready = s_axis_trig_ql_tready || s_axis_trig_intan_tready;
assign m_axis_eeg_tready = m_axis_eeg_ql_tready || m_axis_eeg_intan_tready;
assign m_axis_record_tdata = (protocol_sel)? m_axis_ql_tdata : m_axis_intan_tdata;
assign m_axis_record_tkeep = (protocol_sel)? m_axis_ql_tkeep : m_axis_intan_tkeep;
assign m_axis_record_tlast = (protocol_sel)? m_axis_ql_tlast : m_axis_intan_tlast;
assign m_axis_record_tvalid = (protocol_sel)? m_axis_ql_tvalid: m_axis_intan_tvalid;
assign m_axis_ql_tfull = m_axis_record_tfull;
assign m_axis_intan_tfull = m_axis_record_tfull;
assign m_axis_ql_tready = m_axis_record_tready;
assign m_axis_intan_tready = m_axis_record_tready;
endmodule