`timescale 1ns/1ps module pl_top_tb(); //***************************************************************************** // Parameter definition //***************************************************************************** localparam T_CLK = 10 ; //ns localparam RSH2116_QTY = 4 ; localparam EEG_ADS1299_QTY = 8 ; localparam EEG_ADS1299_SPI_QTY = 4 ; //eeg ads1299 localparam EEG_BRAM_ADDR_TEST_RO = 13'h0000; localparam EEG_BRAM_ADDR_TEST_RW = 13'h0004; localparam EEG_BRAM_ADDR_EEG_ER = 13'h0040; localparam EEG_BRAM_ADDR_EEG_CR = 13'h0044; localparam EEG_BRAM_ADDR_EEG_SR = 13'h0048; localparam EEG_BRAM_ADDR_EEG_TR = 13'h0100; localparam EEG_BRAM_ADDR_EEG_RR = 13'h0200; localparam EEG_BRAM_ADDR_EEG_TR_MASK = 13'h1F00; localparam EEG_BRAM_ADDR_EEG_RR_MASK = 13'h1F00; //rhs2116 parameter CMD_CNV = 2'b00; parameter CMD_STIM = 2'b01; parameter CMD_NULL = 2'b01; parameter CMD_END = 2'b01; parameter CMD_WRITE = 2'b10; parameter CMD_READ = 2'b11; parameter STIM_POL_REG_ADDR = 8'd44; parameter POS_CUR_REG_ADDR = 8'd96; parameter NEG_CUR_REG_ADDR = 8'd64; localparam BRAM_ADDR_TEST_RW = 13'h0000; localparam BRAM_ADDR_TEST_RO_DATA = 13'h0004; localparam BRAM_ADDR_TEST_VERSION = 13'h0008; localparam BRAM_ADDR_UPDATE_PERIOD = 13'h0020; localparam BRAM_ADDR_UPLOAD_ROUND_NUM = 13'h0024; localparam BRAM_ADDR_ENABLE = 13'h0028; localparam BRAM_ADDR_RESET = 13'h002C; localparam BRAM_ADDR_DDS_PHASE_TRIG = 13'h0030; localparam BRAM_ADDR_SWITCH_CTRL = 13'h0034; localparam BRAM_ADDR_SWITCH_DATA0 = 13'h0040; localparam BRAM_ADDR_SWITCH_DATA1 = 13'h0044; localparam BRAM_ADDR_UPLOAD_TIMEOUT = 13'h0048; localparam BRAM_ADDR_SPI_STATE_START = 13'h0100; localparam BRAM_ADDR_SPI_TX_START = 13'h0180; localparam BRAM_ADDR_SPI_RX_START = 13'h0200; localparam BRAM_ADDR_SPI_ERR_START = 13'h0280; localparam BRAM_ADDR_DDS_PHASE_INC_START = 13'h0400; localparam BRAM_ADDR_DDS_PHASE_OFF_START = 13'h0480; localparam BRAM_ADDR_CHIP_0_CNV_CMD_LTH = 13'h0500; localparam BRAM_ADDR_CHIP_1_CNV_CMD_LTH = 13'h0504; localparam BRAM_ADDR_CHIP_2_CNV_CMD_LTH = 13'h0508; localparam BRAM_ADDR_CHIP_3_CNV_CMD_LTH = 13'h050C; localparam BRAM_ADDR_STIM_TRIM_P_MASK = 13'h1F00; localparam BRAM_ADDR_STIM_TRIM_P_START = 13'h0600; localparam BRAM_ADDR_STIM_TRIM_N_MASK = 13'h1F00; localparam BRAM_ADDR_STIM_TRIM_N_START = 13'h0700; localparam BRAM_ADDR_CHIP_0_STIM_CH_0_3_TRIM_P = 13'h0600; localparam BRAM_ADDR_CHIP_1_STIM_CH_0_3_TRIM_P = 13'h0610; localparam BRAM_ADDR_CHIP_2_STIM_CH_0_3_TRIM_P = 13'h0620; localparam BRAM_ADDR_CHIP_3_STIM_CH_0_3_TRIM_P = 13'h0630; localparam BRAM_ADDR_CHIP_0_STIM_CH_0_3_TRIM_N = 13'h0700; localparam BRAM_ADDR_CHIP_1_STIM_CH_0_3_TRIM_N = 13'h0710; localparam BRAM_ADDR_CHIP_2_STIM_CH_0_3_TRIM_N = 13'h0720; localparam BRAM_ADDR_CHIP_3_STIM_CH_0_3_TRIM_N = 13'h0730; localparam BRAM_ADDR_CHIP_0_CNV_CMD_START = 13'h1000; localparam BRAM_ADDR_CHIP_1_CNV_CMD_START = 13'h1040; localparam BRAM_ADDR_CHIP_2_CNV_CMD_START = 13'h1080; localparam BRAM_ADDR_CHIP_3_CNV_CMD_START = 13'h10C0; localparam COVER_Y = 1'b1; localparam COVER_N = 1'b0; localparam STAGE_SS = 4'h1; localparam STAGE_RE = 4'h3; localparam STAGE_FS = 4'h4; localparam STAGE_EE = 4'h2; localparam CHIP_0 = 4'h0; localparam CHIP_1 = 4'h1; localparam CHIP_2 = 4'h2; localparam CHIP_3 = 4'h3; localparam CHANNEL_0 = 0; localparam CHANNEL_1 = 1; localparam CHANNEL_2 = 2; localparam CHANNEL_3 = 3; localparam CHANNEL_4 = 4; localparam CHANNEL_5 = 5; localparam CHANNEL_6 = 6; localparam CHANNEL_7 = 7; localparam CHANNEL_8 = 8; localparam CHANNEL_9 = 9; localparam CHANNEL_A = 10; localparam CHANNEL_B = 11; localparam CHANNEL_C = 12; localparam CHANNEL_D = 13; localparam CHANNEL_E = 14; localparam CHANNEL_F = 15; localparam DDS_CH_0 = 0; localparam DDS_CH_1 = 1; localparam DDS_CH_2 = 2; localparam DDS_CH_3 = 3; localparam DDS_CH_4 = 4; localparam DDS_CH_5 = 5; localparam DDS_CH_6 = 6; localparam DDS_CH_7 = 7; localparam DDS_CH_8 = 8; localparam DDS_CH_9 = 9; localparam DDS_CH_A = 10; localparam DDS_CH_B = 11; localparam DDS_CH_C = 12; localparam DDS_CH_D = 13; localparam DDS_CH_E = 14; localparam DDS_CH_F = 15; localparam GAIN_MAX = 9'h100; //Message Config localparam BRAM_ADDR_MSG_TEST_RO = 13'h0000; localparam BRAM_ADDR_MSG_TEST_RW = 13'h0004; localparam BRAM_ADDR_MSG_SEL_EEG24 = 13'h0010; localparam BRAM_ADDR_MSG_ROUNDS_QTY = 13'h0014; localparam BRAM_ADDR_MSG_PRE_MSG_LTH = 13'h0018; localparam BRAM_ADDR_MSG_PRE_MSG_START = 13'h0100; localparam BRAM_ADDR_MSG_CH_MAP_START = 13'h0200; localparam BRAM_ADDR_MSG_UPLOAD_CH_START = 13'h0300; //***************************************************************************** // Internal register and wire declarations //***************************************************************************** reg clk ; reg rst_n ; reg [13-1:0] bram_stim_addr ; reg bram_stim_clk ; reg [32-1:0] bram_stim_din ; wire [32-1:0] bram_stim_dout ; reg bram_stim_en ; reg bram_stim_rst ; reg [ 4-1:0] bram_stim_we ; reg [13-1:0] bram_eeg_addr ; reg bram_eeg_clk ; reg [32-1:0] bram_eeg_din ; wire [32-1:0] bram_eeg_dout ; reg bram_eeg_en ; reg bram_eeg_rst ; reg [ 4-1:0] bram_eeg_we ; reg [13-1:0] bram_emg_addr ; reg bram_emg_clk ; reg [32-1:0] bram_emg_din ; wire [32-1:0] bram_emg_dout ; reg bram_emg_en ; reg bram_emg_rst ; reg [ 4-1:0] bram_emg_we ; reg [13-1:0] bram_accel_addr ; reg bram_accel_clk ; reg [32-1:0] bram_accel_din ; wire [32-1:0] bram_accel_dout ; reg bram_accel_en ; reg bram_accel_rst ; reg [ 4-1:0] bram_accel_we ; reg [13-1:0] bram_msg_addr ; reg bram_msg_clk ; reg [32-1:0] bram_msg_din ; wire [32-1:0] bram_msg_dout ; reg bram_msg_en ; reg bram_msg_rst ; reg [ 4-1:0] bram_msg_we ; wire stim_int ; wire eeg_int ; wire emg_int ; wire accel_int ; wire [32-1:0] m_axis_stim_tdata ; wire m_axis_stim_tlast ; wire m_axis_stim_tready ; wire m_axis_stim_tvalid ; reg m_axis_record_tfull ; wire [ 8-1:0] m_axis_record_tdata ; wire [ 1-1:0] m_axis_record_tkeep ; wire m_axis_record_tlast ; reg m_axis_record_tready ; wire m_axis_record_tvalid ; //--------------------------------------------- RSH2116 wire [RSH2116_QTY-1:0] rsh2116_enable ; wire [RSH2116_QTY-1:0] rsh2116_spi_cs ; wire [RSH2116_QTY-1:0] rsh2116_spi_sclk ; wire [RSH2116_QTY-1:0] rsh2116_spi_mosi ; wire [RSH2116_QTY-1:0] rsh2116_spi_miso ; //--------------------------------------------- ADS1299 for EEG wire [ EEG_ADS1299_QTY-1:0] eeg_ads1299_spi_cs ; wire [EEG_ADS1299_SPI_QTY-1:0] eeg_ads1299_spi_sclk; wire [EEG_ADS1299_SPI_QTY-1:0] eeg_ads1299_spi_mosi; wire [EEG_ADS1299_SPI_QTY-1:0] eeg_ads1299_spi_miso; wire [EEG_ADS1299_SPI_QTY-1:0] eeg_ads1299_drdy_n ; wire eeg_ads1299_start ; //--------------------------------------------- ADS1299 for EMG wire emg_ads1299_spi_cs ; wire emg_ads1299_spi_sclk ; wire emg_ads1299_spi_mosi ; reg emg_ads1299_spi_miso ; reg emg_ads1299_drdy_n ; wire emg_ads1299_start ; wire emg_ads1299_reset_n ; wire emg_ads1299_pwdn_n ; //--------------------------------------------- Accel wire accel_spi_cs ; wire accel_spi_sclk ; wire accel_spi_mosi ; reg accel_spi_miso ; reg accel_int0 ; reg accel_int1 ; //--------------------------------------------- ADG1414 wire adg1414_spi_sync ; wire adg1414_spi_sclk ; wire adg1414_spi_mosi ; //--------------------------------------------- Trigger reg trigger_reset ; reg [32-1:0] trigger_in ; wire [32-1:0] trigger_out ; //--------------------------------------------- FIFO: stim input reg [31:0] s_axis_tdata ; reg s_axis_tlast ; wire s_axis_tready ; reg s_axis_tvalid ; wire [EEG_ADS1299_QTY-1:0] emg_ads1299_cs_w ; wire [EEG_ADS1299_QTY-1:0] emg_ads1299_sclk_w ; wire [EEG_ADS1299_QTY-1:0] emg_ads1299_mosi_w ; wire [EEG_ADS1299_QTY-1:0] emg_ads1299_miso_w ; wire [EEG_ADS1299_QTY-1:0] emg_ads1299_drdy_w ; wire [EEG_ADS1299_QTY-1:0] emg_ads1299_start_w ; reg no_enable ; reg [32-1:0] temp32 ; reg [32-1:0] msg_byte_cnt ; reg msg_head_valid ; integer n; genvar i; //***************************************************************************** // Instantiation //***************************************************************************** axis_data_fifo_w32_d32 u_axis_stream_data_fifo_rs ( .s_axis_aclk ( clk ), .s_axis_aresetn ( rst_n ), .s_axis_tvalid ( s_axis_tvalid ), .s_axis_tready ( s_axis_tready ), .s_axis_tdata ( s_axis_tdata ), .s_axis_tlast ( s_axis_tlast ), .m_axis_tvalid ( m_axis_stim_tvalid ), .m_axis_tready ( m_axis_stim_tready ), .m_axis_tdata ( m_axis_stim_tdata ), .m_axis_tlast ( m_axis_stim_tlast ) ); pl_top# ( .CLK_FREQ ( 100 ), .CLK_PERIOD ( T_CLK ) ) DUT ( .clk ( clk ), .rst_n ( rst_n ), .bram_stim_addr ( bram_stim_addr ), .bram_stim_clk ( bram_stim_clk ), .bram_stim_din ( bram_stim_din ), .bram_stim_dout ( bram_stim_dout ), .bram_stim_en ( bram_stim_en ), .bram_stim_rst ( bram_stim_rst ), .bram_stim_we ( bram_stim_we ), .bram_eeg_addr ( bram_eeg_addr ), .bram_eeg_clk ( bram_eeg_clk ), .bram_eeg_din ( bram_eeg_din ), .bram_eeg_dout ( bram_eeg_dout ), .bram_eeg_en ( bram_eeg_en ), .bram_eeg_rst ( bram_eeg_rst ), .bram_eeg_we ( bram_eeg_we ), .bram_emg_addr ( bram_emg_addr ), .bram_emg_clk ( bram_emg_clk ), .bram_emg_din ( bram_emg_din ), .bram_emg_dout ( bram_emg_dout ), .bram_emg_en ( bram_emg_en ), .bram_emg_rst ( bram_emg_rst ), .bram_emg_we ( bram_emg_we ), .bram_accel_addr ( bram_accel_addr ), .bram_accel_clk ( bram_accel_clk ), .bram_accel_din ( bram_accel_din ), .bram_accel_dout ( bram_accel_dout ), .bram_accel_en ( bram_accel_en ), .bram_accel_rst ( bram_accel_rst ), .bram_accel_we ( bram_accel_we ), .bram_msg_addr ( bram_msg_addr ), .bram_msg_clk ( bram_msg_clk ), .bram_msg_din ( bram_msg_din ), .bram_msg_dout ( bram_msg_dout ), .bram_msg_en ( bram_msg_en ), .bram_msg_rst ( bram_msg_rst ), .bram_msg_we ( bram_msg_we ), .stim_int ( stim_int ), .eeg_int ( eeg_int ), .emg_int ( emg_int ), .accel_int ( accel_int ), //------------------------------------------ FIFO: stim input and record output .m_axis_stim_tdata ( m_axis_stim_tdata ), .m_axis_stim_tlast ( m_axis_stim_tlast ), .m_axis_stim_tready ( m_axis_stim_tready ), .m_axis_stim_tvalid ( m_axis_stim_tvalid ), .m_axis_record_tfull ( m_axis_record_tfull ), .m_axis_record_tdata ( m_axis_record_tdata ), .m_axis_record_tkeep ( m_axis_record_tkeep ), .m_axis_record_tlast ( m_axis_record_tlast ), .m_axis_record_tready ( m_axis_record_tready ), .m_axis_record_tvalid ( m_axis_record_tvalid ), //------------------------------------------ device: RHS2116 .rsh2116_enable ( rsh2116_enable ), .rsh2116_spi_cs ( rsh2116_spi_cs ), .rsh2116_spi_sclk ( rsh2116_spi_sclk ), .rsh2116_spi_mosi ( rsh2116_spi_mosi ), .rsh2116_spi_miso ( rsh2116_spi_miso ), //------------------------------------------ device: ads1299 .eeg_ads1299_spi_cs ( eeg_ads1299_spi_cs ), .eeg_ads1299_spi_sclk ( eeg_ads1299_spi_sclk ), .eeg_ads1299_spi_mosi ( eeg_ads1299_spi_mosi ), .eeg_ads1299_spi_miso ( eeg_ads1299_spi_miso ), .eeg_ads1299_drdy_n ( eeg_ads1299_drdy_n ), .eeg_ads1299_start ( eeg_ads1299_start ), //------------------------------------------ device: ads1299 .emg_ads1299_spi_cs ( emg_ads1299_spi_cs ), .emg_ads1299_spi_sclk ( emg_ads1299_spi_sclk ), .emg_ads1299_spi_mosi ( emg_ads1299_spi_mosi ), .emg_ads1299_spi_miso ( emg_ads1299_spi_miso ), .emg_ads1299_drdy_n ( emg_ads1299_drdy_n ), .emg_ads1299_start ( emg_ads1299_start ), .emg_ads1299_reset_n ( emg_ads1299_reset_n ), .emg_ads1299_pwdn_n ( emg_ads1299_pwdn_n ), //------------------------------------------ device: MEMS .accel_spi_cs ( accel_spi_cs ), .accel_spi_sclk ( accel_spi_sclk ), .accel_spi_mosi ( accel_spi_mosi ), .accel_spi_miso ( accel_spi_miso ), .accel_int0 ( accel_int0 ), .accel_int1 ( accel_int1 ), //------------------------------------------ ADG1414 .adg1414_spi_sync ( adg1414_spi_sync ), .adg1414_spi_sclk ( adg1414_spi_sclk ), .adg1414_spi_mosi ( adg1414_spi_mosi ), .adg1414_spi_miso ( 1'b0 ), //------------------------------------------ Trigger .trigger_reset ( trigger_reset ), .trigger_in ( trigger_in ), .trigger_out ( trigger_out ), //------------------------------------------ Debug .debug_sig ( ) ); generate for(i=0; i PC write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h03, 8'h39); //device type write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h04, 8'h01); //device ID: 32'04030201 write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h05, 8'h02); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h06, 8'h03); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h07, 8'h04); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h08, 8'h10); //message length write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h09, 8'h11); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h0A, 8'h12); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h0B, 8'h13); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h0C, 8'h56); //cmd: 16'h0456 write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h0D, 8'h04); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h0E, 8'h00); //run time(ms) write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h0F, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h10, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h11, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h12, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h13, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h14, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h15, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h16, 8'h00); //result write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h17, 8'h00); //package id write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h18, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h19, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h1A, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h1B, 8'hFF); //upload channel write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h1C, 8'hFF); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h1D, 8'hFF); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h1E, 8'hFF); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h1F, 8'hFF); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h20, 8'hFF); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h21, 8'hFF); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h22, 8'hFF); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h23, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h24, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h25, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h26, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h27, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h28, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h29, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h2A, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h2B, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h2C, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h2D, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h2E, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h2F, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h30, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h31, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h32, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h33, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h34, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h35, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h36, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h37, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h38, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h39, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h3A, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h3B, 8'h00); //OriRate write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h3C, 8'h7D); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h3D, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h3E, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h3F, 8'h00); //SampleRate write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h40, 8'h7D); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h41, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h42, 8'h00); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h43, 8'h01); //SampleLen write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h44, 8'h02); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h45, 8'h03); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h46, 8'h04); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h47, 8'h18); //resolution write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h48, 8'h00); //filter flag write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h49, 8'h10); //DataLen write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h4A, 8'h20); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h4B, 8'h30); write_bram_byte_msg(BRAM_ADDR_MSG_PRE_MSG_START+8'h4C, 8'h40); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd00, 8'd58); //PL_ch-0 -> PC_ch-59 write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd01, 8'd59); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd02, 8'd52); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd03, 8'd49); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd04, 8'd50); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd05, 8'd63); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd06, 8'd48); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd07, 8'd62); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd08, 8'd23); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd09, 8'd13); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd10, 8'd09); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd11, 8'd10); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd12, 8'd56); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd13, 8'd15); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd14, 8'd54); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd15, 8'd14); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd16, 8'd39); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd17, 8'd36); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd18, 8'd33); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd19, 8'd17); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd20, 8'd46); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd21, 8'd47); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd22, 8'd42); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd23, 8'd45); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd24, 8'd40); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd25, 8'd41); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd26, 8'd38); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd27, 8'd35); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd28, 8'd32); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd29, 8'd34); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd30, 8'd16); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd31, 8'd37); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd32, 8'd06); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd33, 8'd26); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd34, 8'd04); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd35, 8'd05); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd36, 8'd24); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd37, 8'd21); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd38, 8'd08); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd39, 8'd30); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd40, 8'd55); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd41, 8'd57); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd42, 8'd53); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd43, 8'd51); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd44, 8'd44); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd45, 8'd61); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd46, 8'd43); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd47, 8'd60); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd48, 8'd18); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd49, 8'd20); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd50, 8'd31); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd51, 8'd28); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd52, 8'd07); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd53, 8'd25); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd54, 8'd02); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd55, 8'd00); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd56, 8'd01); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd57, 8'd03); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd58, 8'd11); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd59, 8'd12); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd60, 8'd22); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd61, 8'd19); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd62, 8'd29); write_bram_byte_msg(BRAM_ADDR_MSG_CH_MAP_START+8'd63, 8'd27); //PL_ch-63 -> PC_ch-28 write_bram_msg(BRAM_ADDR_MSG_UPLOAD_CH_START+8'h0, 32'hFFFFFFFF); write_bram_msg(BRAM_ADDR_MSG_UPLOAD_CH_START+8'h4, 32'hFFFFFFFF); //record:(ads1299) // #1_000 // @ ( posedge clk ); // write_bram_eeg(EEG_BRAM_ADDR_EEG_CR, {1'b1, 15'd10, 16'd0}); //stim:(rhs2116) #1_000 //Config DDS write_bram_2116(BRAM_ADDR_DDS_PHASE_INC_START + 8'h00, 32'h000029F1); write_bram_2116(BRAM_ADDR_DDS_PHASE_OFF_START, 32'h0); write_bram_2116(BRAM_ADDR_DDS_PHASE_TRIG, 1); //Config update period write_bram_2116(BRAM_ADDR_UPDATE_PERIOD, 31250/T_CLK); write_bram_2116(BRAM_ADDR_UPLOAD_ROUND_NUM, 10); write_bram_2116(BRAM_ADDR_UPLOAD_TIMEOUT, 70); #100 @ ( posedge clk ); while(1) begin // write_fifo(code_stim_sine(CHIP_0, COVER_N, STAGE_SS, CHANNEL_0, DDS_CH_0, GAIN_MAX), 1'b0); // write_fifo(code_stim_sine(CHIP_0, COVER_N, STAGE_EE, CHANNEL_1, DDS_CH_0, GAIN_MAX), 1'b0); // write_fifo(code_write_u (CHIP_0, 8'd44, 16'h00), 1'b0); // write_fifo(code_read (CHIP_0, 8'd40), 1'b0); // write_fifo(code_cnv (CHIP_1, CHANNEL_0), 1'b0); // write_fifo(code_cnv (CHIP_1, CHANNEL_1), 1'b0); // write_fifo(code_read (CHIP_1, 8'hFB), 1'b0); // write_fifo(code_read (CHIP_1, 8'hFC), 1'b0); // write_fifo(code_stim_sine(CHIP_2, COVER_N, STAGE_SS, CHANNEL_0, DDS_CH_0, GAIN_MAX), 1'b0); // write_fifo(code_cnv (CHIP_2, CHANNEL_1), 1'b0); // write_fifo(code_write_u (CHIP_2, 8'd44, 16'h00), 1'b0); // write_fifo(code_read (CHIP_2, 8'd40), 1'b0); // write_fifo(code_null (CHIP_3), 1'b0); // write_fifo(code_null (CHIP_3), 1'b0); // write_fifo(code_null (CHIP_3), 1'b0); // write_fifo(code_null (CHIP_3), 1'b0); write_fifo(code_cnv (CHIP_0, CHANNEL_0), 1'b0); write_fifo(code_cnv (CHIP_0, CHANNEL_1), 1'b0); write_fifo(code_cnv (CHIP_0, CHANNEL_2), 1'b0); write_fifo(code_cnv (CHIP_0, CHANNEL_3), 1'b0); write_fifo(code_cnv (CHIP_0, CHANNEL_4), 1'b0); write_fifo(code_cnv (CHIP_0, CHANNEL_5), 1'b0); write_fifo(code_cnv (CHIP_0, CHANNEL_6), 1'b0); write_fifo(code_cnv (CHIP_0, CHANNEL_7), 1'b0); write_fifo(code_cnv (CHIP_0, CHANNEL_8), 1'b0); write_fifo(code_cnv (CHIP_0, CHANNEL_9), 1'b0); write_fifo(code_cnv (CHIP_0, CHANNEL_A), 1'b0); write_fifo(code_cnv (CHIP_0, CHANNEL_B), 1'b0); write_fifo(code_cnv (CHIP_0, CHANNEL_C), 1'b0); write_fifo(code_cnv (CHIP_0, CHANNEL_D), 1'b0); write_fifo(code_cnv (CHIP_0, CHANNEL_E), 1'b0); write_fifo(code_cnv (CHIP_0, CHANNEL_F), 1'b0); write_fifo(code_read (CHIP_0, 8'hFB), 1'b0); write_fifo(code_read (CHIP_0, 8'hFC), 1'b0); write_fifo(code_cnv (CHIP_1, CHANNEL_0), 1'b0); write_fifo(code_cnv (CHIP_1, CHANNEL_1), 1'b0); write_fifo(code_cnv (CHIP_1, CHANNEL_2), 1'b0); write_fifo(code_cnv (CHIP_1, CHANNEL_3), 1'b0); write_fifo(code_cnv (CHIP_1, CHANNEL_4), 1'b0); write_fifo(code_cnv (CHIP_1, CHANNEL_5), 1'b0); write_fifo(code_cnv (CHIP_1, CHANNEL_6), 1'b0); write_fifo(code_cnv (CHIP_1, CHANNEL_7), 1'b0); write_fifo(code_cnv (CHIP_1, CHANNEL_8), 1'b0); write_fifo(code_cnv (CHIP_1, CHANNEL_9), 1'b0); write_fifo(code_cnv (CHIP_1, CHANNEL_A), 1'b0); write_fifo(code_cnv (CHIP_1, CHANNEL_B), 1'b0); write_fifo(code_cnv (CHIP_1, CHANNEL_C), 1'b0); write_fifo(code_cnv (CHIP_1, CHANNEL_D), 1'b0); write_fifo(code_cnv (CHIP_1, CHANNEL_E), 1'b0); write_fifo(code_cnv (CHIP_1, CHANNEL_F), 1'b0); write_fifo(code_read (CHIP_1, 8'hFB), 1'b0); write_fifo(code_read (CHIP_1, 8'hFC), 1'b0); write_fifo(code_cnv (CHIP_2, CHANNEL_0), 1'b0); write_fifo(code_cnv (CHIP_2, CHANNEL_1), 1'b0); write_fifo(code_cnv (CHIP_2, CHANNEL_2), 1'b0); write_fifo(code_cnv (CHIP_2, CHANNEL_3), 1'b0); write_fifo(code_cnv (CHIP_2, CHANNEL_4), 1'b0); write_fifo(code_cnv (CHIP_2, CHANNEL_5), 1'b0); write_fifo(code_cnv (CHIP_2, CHANNEL_6), 1'b0); write_fifo(code_cnv (CHIP_2, CHANNEL_7), 1'b0); write_fifo(code_cnv (CHIP_2, CHANNEL_8), 1'b0); write_fifo(code_cnv (CHIP_2, CHANNEL_9), 1'b0); write_fifo(code_cnv (CHIP_2, CHANNEL_A), 1'b0); write_fifo(code_cnv (CHIP_2, CHANNEL_B), 1'b0); write_fifo(code_cnv (CHIP_2, CHANNEL_C), 1'b0); write_fifo(code_cnv (CHIP_2, CHANNEL_D), 1'b0); write_fifo(code_cnv (CHIP_2, CHANNEL_E), 1'b0); write_fifo(code_cnv (CHIP_2, CHANNEL_F), 1'b0); write_fifo(code_read (CHIP_2, 8'hFB), 1'b0); write_fifo(code_read (CHIP_2, 8'hFC), 1'b0); write_fifo(code_cnv (CHIP_3, CHANNEL_0), 1'b0); write_fifo(code_cnv (CHIP_3, CHANNEL_1), 1'b0); write_fifo(code_cnv (CHIP_3, CHANNEL_2), 1'b0); write_fifo(code_cnv (CHIP_3, CHANNEL_3), 1'b0); write_fifo(code_cnv (CHIP_3, CHANNEL_4), 1'b0); write_fifo(code_cnv (CHIP_3, CHANNEL_5), 1'b0); write_fifo(code_cnv (CHIP_3, CHANNEL_6), 1'b0); write_fifo(code_cnv (CHIP_3, CHANNEL_7), 1'b0); write_fifo(code_cnv (CHIP_3, CHANNEL_8), 1'b0); write_fifo(code_cnv (CHIP_3, CHANNEL_9), 1'b0); write_fifo(code_cnv (CHIP_3, CHANNEL_A), 1'b0); write_fifo(code_cnv (CHIP_3, CHANNEL_B), 1'b0); write_fifo(code_cnv (CHIP_3, CHANNEL_C), 1'b0); write_fifo(code_cnv (CHIP_3, CHANNEL_D), 1'b0); write_fifo(code_cnv (CHIP_3, CHANNEL_E), 1'b0); write_fifo(code_cnv (CHIP_3, CHANNEL_F), 1'b0); write_fifo(code_read (CHIP_3, 8'hFB), 1'b0); write_fifo(code_read (CHIP_3, 8'hFC), 1'b0); write_fifo(code_end (0, 0), 1'b1); // //if has stim // @ ( posedge clk ); // if (no_enable) begin // no_enable <= 1'b0; // write_fifo(code_end (1, 1), 1'b1); // end else // write_fifo(code_end (1, 0), 1'b1); end // $stop; end always @ ( posedge clk or negedge rst_n ) begin if( !rst_n ) msg_byte_cnt <= 0; else if ( m_axis_record_tvalid && m_axis_record_tready && m_axis_record_tlast ) msg_byte_cnt <= 0; else if ( m_axis_record_tvalid && m_axis_record_tready ) msg_byte_cnt <= msg_byte_cnt + 1'b1; end always @ ( posedge clk or negedge rst_n ) begin if( !rst_n ) msg_head_valid <= 1'b0; else if ( m_axis_record_tvalid && m_axis_record_tready && m_axis_record_tlast ) msg_head_valid <= 1'b0; else if ( m_axis_record_tvalid && m_axis_record_tready && msg_byte_cnt == 0 ) msg_head_valid <= (m_axis_record_tdata == 8'h5A)? 1'b1:1'b0; end //***************************************************************************** // Wire assignment //***************************************************************************** generate for(i=0;i