Files
BSI-901-fpga-software/c64_pro.srcs/sources_1/rtl/eeg/eeg_top1.v
T

273 lines
7.9 KiB
Verilog

`timescale 1 ns / 1 ps
module eeg_top1#
(
parameter CLK_PERIOD = 10 ,
parameter CHIPSET_QTY = 4 ,//8
parameter CHIPSET_CH_QTY = 8 ,
parameter SPIS_QTY = 2 ,//4
parameter SPI_SLAVE_QTY = 2 ,
parameter SPI_CLK_DIV = 3 ,
parameter SPI_DATA_WIDTH = 8 ,
parameter SPI_TRANS_PERIOD = 2000 //Unit: ns
)
(
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 ,
output [32-1:0] axis_record_tdata ,
output axis_record_tlast ,
input axis_record_tready ,
output axis_record_tvalid ,
output [CHIPSET_QTY-1:0] cs ,
output [ SPIS_QTY-1:0] sclk ,
output [ SPIS_QTY-1:0] mosi ,
input [ SPIS_QTY-1:0] miso ,
input [ SPIS_QTY-1:0] drdy ,
output [ SPIS_QTY-1:0] start ,
output [ 4-1:0] debug_sig
);
//*****************************************************************************
// localparam definition
//*****************************************************************************
//*****************************************************************************
// Internal register and wire declarations
//*****************************************************************************
wire [32-1:0] eeg_er ;
wire [32-1:0] eeg_cr ;
wire [32-1:0] eeg_sr ;
wire [32*SPIS_QTY-1:0] eeg_tr_array ;
wire [32*SPIS_QTY-1:0] eeg_rr_array ;
wire eeg_sr_r_evt ;
wire [SPI_SLAVE_QTY-1:0] cs_w[SPIS_QTY-1:0] ;
wire send_enable[SPIS_QTY-1:0] ;
wire [ 8-1:0] send_cs_n[SPIS_QTY-1:0] ;
wire [ 8-1:0] send_length[SPIS_QTY-1:0] ;
wire [32-1:0] send_data_array[SPIS_QTY-1:0] ;
wire [32-1:0] recv_data_array[SPIS_QTY-1:0] ;
wire recv_data_en_array[SPIS_QTY-1:0];
wire [ 8-1:0] t_cs_n[SPIS_QTY-1:0] ;
wire [ 8-1:0] t_tdata[SPIS_QTY-1:0] ;
wire t_tlast[SPIS_QTY-1:0] ;
wire t_tready[SPIS_QTY-1:0] ;
wire t_tvalid[SPIS_QTY-1:0] ;
wire [ 8-1:0] r_tdata[SPIS_QTY-1:0] ;
wire r_tlast[SPIS_QTY-1:0] ;
wire r_tvalid[SPIS_QTY-1:0] ;
wire cnv_start[SPIS_QTY-1:0] ;
wire cnv_drdy[SPIS_QTY-1:0] ;
wire upload_round[SPIS_QTY-1:0] ;
//------------------------------------------ record stream rx
wire [32-1:0] cnv_res_tdata[SPIS_QTY-1:0] ;
wire cnv_res_tlast[SPIS_QTY-1:0] ;
wire cnv_res_tready[SPIS_QTY-1:0] ;
wire cnv_res_tvalid[SPIS_QTY-1:0] ;
wire [32*SPIS_QTY-1:0] cnv_res_tdata_array ;
wire [ SPIS_QTY-1:0] cnv_res_tlast_array ;
wire [ SPIS_QTY-1:0] cnv_res_tready_array ;
wire [ SPIS_QTY-1:0] cnv_res_tvalid_array ;
wire record_enable ;
genvar i;
//*****************************************************************************
// Instantiation
//*****************************************************************************
eeg_config#
(
.SPIS_QTY ( 2 ),//4
.SPI_DATA_WIDTH ( 8 )
)
u_eeg_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
.eeg_er ( eeg_er ),
.eeg_cr ( eeg_cr ),
.eeg_sr ( eeg_sr ),
.eeg_tr_array ( eeg_tr_array ),
.eeg_rr_array ( eeg_rr_array ),
.eeg_sr_r_evt ( eeg_sr_r_evt )
);
generate
for(i=0;i<SPIS_QTY;i=i+1) begin : transmit_arrange
ads1299_arrange#
(
.CLK_PERIOD ( 10 ),
.SPI_DATA_WIDTH ( 8 ),
.SPI_TRANS_PERIOD ( SPI_TRANS_PERIOD )
)
u_ads1299_arrange
(
.clk ( clk ),
.rst_n ( rst_n ),
.send_cs_n ( send_cs_n[i] ),
.send_enable ( send_enable[i] ),
.send_length ( send_length[i] ),
.send_data_array ( send_data_array[i] ),
.recv_data_en ( recv_data_en_array[i] ),
.recv_data_array ( recv_data_array[i] ),
.t_cs_n ( t_cs_n[i] ),
.t_tdata ( t_tdata[i] ),
.t_tlast ( t_tlast[i] ),
.t_tready ( t_tready[i] ),
.t_tvalid ( t_tvalid[i] ),
.r_tdata ( r_tdata[i] ),
.r_tlast ( r_tlast[i] ),
.r_tvalid ( r_tvalid[i] ),
.rdatac_enable ( record_enable ),
.cnv_start ( cnv_start[i] ),
.cnv_drdy ( cnv_drdy[0] ),
.upload_round ( upload_round[i] )
);
end
endgenerate
generate
for(i=0;i<SPIS_QTY;i=i+1) begin : trans_if
ads1299_if1#
(
.SPI_CLK_DIV ( SPI_CLK_DIV ),
.SPI_DATA_WIDTH ( SPI_DATA_WIDTH ),
.SPI_SLAVE_QTY ( SPI_SLAVE_QTY )
)
u_ads1299_if1
(
.clk ( clk ),
.rst_n ( rst_n ),
.upload_enable ( record_enable ),
.upload_round ( upload_round[i] ),
//------------------------------------------ spi direct communication
.t_cs_n ( t_cs_n[i] ),
.t_tdata ( t_tdata[i] ),
.t_tlast ( t_tlast[i] ),
.t_tready ( t_tready[i] ),
.t_tvalid ( t_tvalid[i] ),
.r_tdata ( r_tdata[i] ),
.r_tlast ( r_tlast[i] ),
.r_tvalid ( r_tvalid[i] ),
//------------------------------------------ record stream rx
.cnv_res_tdata ( cnv_res_tdata[i] ),
.cnv_res_tlast ( cnv_res_tlast[i] ),
.cnv_res_tready ( cnv_res_tready[i] ),
.cnv_res_tvalid ( cnv_res_tvalid[i] ),
//------------------------------------------ device spi
.cs ( cs_w[i] ),
.sclk ( sclk[i] ),
.mosi ( mosi[i] ),
.miso ( miso[i] )
);
end
endgenerate
eeg_upload#
(
.CLK_PERIOD ( CLK_PERIOD ),
.CHIPSET_QTY ( SPIS_QTY ),
.CH_OF_CHIPSET ( CHIPSET_CH_QTY*SPI_SLAVE_QTY )
)
u_eeg_upload
(
.clk ( clk ),
.rst_n ( rst_n ),
.trans_round ( upload_round[0] ),
.cnv_res_tdata_array ( cnv_res_tdata_array ),
.cnv_res_tlast_array ( cnv_res_tlast_array ),
.cnv_res_tready_array ( cnv_res_tready_array ),
.cnv_res_tvalid_array ( cnv_res_tvalid_array ),
.axi_str_rxd_tdata ( axis_record_tdata ),
.axi_str_rxd_tlast ( axis_record_tlast ),
.axi_str_rxd_tready ( axis_record_tready ),
.axi_str_rxd_tvalid ( axis_record_tvalid )
);
//*****************************************************************************
// Procedural blocks
//*****************************************************************************
//*****************************************************************************
// Wire assignment
//*****************************************************************************
assign record_enable = eeg_cr[31];
assign start = {cnv_start[0],cnv_start[0]};
generate
for(i=0;i<SPIS_QTY;i=i+1) begin : mapping
assign send_enable[i] = eeg_er[i];
assign send_cs_n[i] = {6'd0, eeg_cr[5*i+1:5*i+0]};//[4*i+1:4*i+0]
assign send_length[i] = {5'd0, eeg_cr[5*i+4:5*i+2]};//[4*i+3:4*i+2]
assign send_data_array[i] = eeg_tr_array[32*i+31:32*i];
assign eeg_rr_array[32*i+31:32*i] = recv_data_array[i];
assign cs[SPI_SLAVE_QTY*(i+1)-1 : SPI_SLAVE_QTY*i] = cs_w[i];
assign cnv_drdy[i] = drdy[i];
assign cnv_res_tdata_array[32*i+31 : 32*i] = cnv_res_tdata[i];
assign cnv_res_tlast_array[i] = cnv_res_tlast[i];
assign cnv_res_tvalid_array[i] = cnv_res_tvalid[i];
assign cnv_res_tready[i] = cnv_res_tready_array[i];
end
endgenerate
assign interrupt = 1'b0;
assign debug_sig[0] = record_enable;
assign debug_sig[1] = 1'b0;
assign debug_sig[2] = 1'b0;
assign debug_sig[3] = 1'b0;
endmodule