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

501 lines
16 KiB
Verilog

`timescale 1 ns / 1 ps
module c64pro_top#
(
parameter VERSION = 32'h20000005 ,
parameter CLK_FREQ = 100 ,
parameter CLK_PERIOD = 10 ,
//----------------------------------------- RHS2116
parameter RSH2116_QTY = 4 ,
//----------------------------------------- ADS1299
parameter ADS1299_QTY = 8 ,
parameter ADS1299_SPI_QTY = 4
)
(
//--------------------------------------------- PS: DDR
inout [14:0] DDR_addr ,
inout [ 2:0] DDR_ba ,
inout DDR_cas_n ,
inout DDR_ck_n ,
inout DDR_ck_p ,
inout DDR_cke ,
inout DDR_cs_n ,
inout [ 3:0] DDR_dm ,
inout [31:0] DDR_dq ,
inout [ 3:0] DDR_dqs_n ,
inout [ 3:0] DDR_dqs_p ,
inout DDR_odt ,
inout DDR_ras_n ,
inout DDR_reset_n ,
inout DDR_we_n ,
inout FIXED_IO_ddr_vrn ,
inout FIXED_IO_ddr_vrp ,
inout [53:0] FIXED_IO_mio ,
inout FIXED_IO_ps_clk ,
inout FIXED_IO_ps_porb ,
inout FIXED_IO_ps_srstb ,
//--------------------------------------------- Power Management
inout gauge_scl ,
inout gauge_sda ,
input gauge_indicate ,
output power_on_rsh2116_a , //analog
output power_on_rsh2116_d , //digtal
output power_on_ads1299 ,
output power_on_z ,
output power_sw_z ,
//--------------------------------------------- impl measure
inout z_scl ,
inout z_sda ,
//--------------------------------------------- Display LED
output led_state ,
// output led_charge ,
output led_wifi ,
output led_stim ,
//--------------------------------------------- RSH2116
output [RSH2116_QTY-1:0] rsh2116_enable ,
output [RSH2116_QTY-1:0] rsh2116_spi_cs ,
output [RSH2116_QTY-1:0] rsh2116_spi_sclk ,
output [RSH2116_QTY-1:0] rsh2116_spi_mosi ,
input [RSH2116_QTY-1:0] rsh2116_spi_miso ,
//--------------------------------------------- ADS1299 for EEG
output [ADS1299_QTY-1:0] eeg_ads1299_spi_cs ,
output [ 4-1:0] eeg_ads1299_spi_sclk ,
output [ 4-1:0] eeg_ads1299_spi_mosi ,
input [ 4-1:0] eeg_ads1299_spi_miso ,
input [ 4-1:0] eeg_ads1299_drdy_n ,
output eeg_ads1299_start ,
//--------------------------------------------- ADS1299 for EMG
output emg_ads1299_spi_cs ,
output emg_ads1299_spi_sclk ,
output emg_ads1299_spi_mosi ,
input emg_ads1299_spi_miso ,
input emg_ads1299_drdy_n ,
output emg_ads1299_start ,
output emg_ads1299_reset_n ,
output emg_ads1299_pwdn_n ,
//--------------------------------------------- ADG1414
output adg1414_spi_sync ,
output adg1414_spi_sclk ,
output adg1414_spi_mosi ,
input adg1414_spi_miso ,
//--------------------------------------------- MEMS
output accel_spi_cs ,
output accel_spi_sclk ,
output accel_spi_mosi ,
inout accel_spi_miso ,
input accel_int0 ,
input accel_int1 ,
//--------------------------------------------- Trigger
input [ 3-1:0] trigger_i ,
output reg [ 1-1:0] trigger_o ,
//--------------------------------------------- usb plug check
input usb_power_check ,
//--------------------------------------------- For developer
output [ 2-1:0] led_pl
);
//*****************************************************************************
// Parameter definition
//*****************************************************************************
//*****************************************************************************
// Internal register and wire declarations
//*****************************************************************************
wire clk ;
wire rst_n ;
wire [13-1:0] bram_stim_addr ;
wire bram_stim_clk ;
wire [32-1:0] bram_stim_din ;
wire [32-1:0] bram_stim_dout ;
wire bram_stim_en ;
wire bram_stim_rst ;
wire [ 4-1:0] bram_stim_we ;
wire [13-1:0] bram_eeg_addr ;
wire bram_eeg_clk ;
wire [32-1:0] bram_eeg_din ;
wire [32-1:0] bram_eeg_dout ;
wire bram_eeg_en ;
wire bram_eeg_rst ;
wire [ 4-1:0] bram_eeg_we ;
wire [13-1:0] bram_emg_addr ;
wire bram_emg_clk ;
wire [32-1:0] bram_emg_din ;
wire [32-1:0] bram_emg_dout ;
wire bram_emg_en ;
wire bram_emg_rst ;
wire [ 4-1:0] bram_emg_we ;
wire [13-1:0] bram_accel_addr ;
wire bram_accel_clk ;
wire [32-1:0] bram_accel_din ;
wire [32-1:0] bram_accel_dout ;
wire bram_accel_en ;
wire bram_accel_rst ;
wire [ 4-1:0] bram_accel_we ;
wire [13-1:0] bram_msg_addr ;
wire bram_msg_clk ;
wire [32-1:0] bram_msg_din ;
wire [32-1:0] bram_msg_dout ;
wire bram_msg_en ;
wire bram_msg_rst ;
wire [ 4-1:0] bram_msg_we ;
wire stim_int ;
wire eeg_int ;
wire emg_int ;
wire accel_int ;
wire [32-1:0] axis_stim_tdata ;
wire axis_stim_tlast ;
wire axis_stim_tready ;
wire axis_stim_tvalid ;
wire axis_record_tfull ;
wire [ 8-1:0] axis_record_tdata ;
wire [ 1-1:0] axis_record_tkeep ;
wire axis_record_tlast ;
wire axis_record_tready ;
wire axis_record_tvalid ;
wire [ 8-1:0] gpio0_0_tri_i ;
wire [32-1:0] gpio0_1_tri_o ;
wire [ 4-1:0] debug_sig ;
wire [ADS1299_QTY-1:0] eeg_spi_cs ;
wire [ 4-1:0] eeg_spi_sclk ;
wire [ 4-1:0] eeg_spi_mosi ;
wire [ 4-1:0] eeg_spi_miso ;
wire trigger_reset ;
wire [32-1:0] trigger_in ;
wire [32-1:0] trigger_out ;
wire [ 3-1:0] led_cmd_wifi ;
//*****************************************************************************
// Instantiation
//*****************************************************************************
design_a9_1_wrapper u_ps_a9_1
(
.clk ( clk ),
.rst_n ( rst_n ),
.DDR_addr ( DDR_addr ),
.DDR_ba ( DDR_ba ),
.DDR_cas_n ( DDR_cas_n ),
.DDR_ck_n ( DDR_ck_n ),
.DDR_ck_p ( DDR_ck_p ),
.DDR_cke ( DDR_cke ),
.DDR_cs_n ( DDR_cs_n ),
.DDR_dm ( DDR_dm ),
.DDR_dq ( DDR_dq ),
.DDR_dqs_n ( DDR_dqs_n ),
.DDR_dqs_p ( DDR_dqs_p ),
.DDR_odt ( DDR_odt ),
.DDR_ras_n ( DDR_ras_n ),
.DDR_reset_n ( DDR_reset_n ),
.DDR_we_n ( DDR_we_n ),
.FIXED_IO_ddr_vrn ( FIXED_IO_ddr_vrn ),
.FIXED_IO_ddr_vrp ( FIXED_IO_ddr_vrp ),
.FIXED_IO_mio ( FIXED_IO_mio ),
.FIXED_IO_ps_clk ( FIXED_IO_ps_clk ),
.FIXED_IO_ps_porb ( FIXED_IO_ps_porb ),
.FIXED_IO_ps_srstb ( FIXED_IO_ps_srstb ),
.int0 ( stim_int ),
.int1 ( eeg_int ),
.int2 ( emg_int ),
.int3 ( accel_int ),
.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_mems_addr ( bram_accel_addr ),
.bram_mems_clk ( bram_accel_clk ),
.bram_mems_din ( bram_accel_din ),
.bram_mems_dout ( bram_accel_dout ),
.bram_mems_en ( bram_accel_en ),
.bram_mems_rst ( bram_accel_rst ),
.bram_mems_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 ),
.m_axis_stim_tdata ( axis_stim_tdata ),
.m_axis_stim_tlast ( axis_stim_tlast ),
.m_axis_stim_tready ( axis_stim_tready ),
.m_axis_stim_tvalid ( axis_stim_tvalid ),
.s_axis_record_tfull ( axis_record_tfull ),
.s_axis_record_tdata ( axis_record_tdata ),
.s_axis_record_tkeep ( axis_record_tkeep ),
.s_axis_record_tlast ( axis_record_tlast ),
.s_axis_record_tready ( axis_record_tready ),
.s_axis_record_tvalid ( axis_record_tvalid ),
.gpio0_0_tri_i ( gpio0_0_tri_i ),
.gpio0_1_tri_o ( gpio0_1_tri_o ),
//gauge
.iic0_scl_io ( gauge_scl ),
.iic0_sda_io ( gauge_sda ),
//Z
.iic1_scl_io ( z_scl ),
.iic1_sda_io ( z_sda )
);
pl_top#
(
.VERSION ( VERSION ),
.CLK_FREQ ( CLK_FREQ ),
.CLK_PERIOD ( CLK_PERIOD ),
.RSH2116_QTY ( RSH2116_QTY ),
.ADS1299_QTY ( ADS1299_QTY ),
.ADS1299_SPI_QTY ( ADS1299_SPI_QTY )
)
u_pl_top
(
.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 ( axis_stim_tdata ),
.m_axis_stim_tlast ( axis_stim_tlast ),
.m_axis_stim_tready ( axis_stim_tready ),
.m_axis_stim_tvalid ( axis_stim_tvalid ),
.m_axis_record_tfull ( axis_record_tfull ),
.m_axis_record_tdata ( axis_record_tdata ),
.m_axis_record_tkeep ( axis_record_tkeep ),
.m_axis_record_tlast ( axis_record_tlast ),
.m_axis_record_tready ( axis_record_tready ),
.m_axis_record_tvalid ( 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
.eeg_ads1299_spi_cs ( eeg_spi_cs ),
.eeg_ads1299_spi_sclk ( eeg_spi_sclk ),
.eeg_ads1299_spi_mosi ( eeg_spi_mosi ),
.eeg_ads1299_spi_miso ( eeg_spi_miso ),
.eeg_ads1299_drdy_n ( eeg_ads1299_drdy_n ),
.eeg_ads1299_start ( eeg_ads1299_start ),
//------------------------------------------ device: ads1299 emg
.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 ( adg1414_spi_miso ),
//------------------------------------------ Trigger
.trigger_reset ( trigger_reset ),
.trigger_in ( trigger_in ),
.trigger_out ( trigger_out ),
//------------------------------------------ Debug
.debug_sig ( debug_sig )
);
led_ctrl#
(
.CLK_PERIOD ( CLK_PERIOD )
)
u_led_wifi
(
.clk ( clk ),
.rst_n ( rst_n ),
.cmd ( led_cmd_wifi ),
.led ( led_wifi )
);
//*****************************************************************************
always @ ( posedge clk or negedge rst_n ) begin
if( !rst_n )
trigger_o <= 1'b0;
else if ( trigger_out==32'h000003E8 )
trigger_o <= 1'b1;
else if ( trigger_out==32'h000003E9 )
trigger_o <= 1'b0;
end
//*****************************************************************************
// Wire assignment
//*****************************************************************************
//gpio0_0: input with interrupt
assign gpio0_0_tri_i[0] = gauge_indicate;
assign gpio0_0_tri_i[1] = accel_int0;
assign gpio0_0_tri_i[2] = accel_int1;
assign gpio0_0_tri_i[3] = usb_power_check;
assign gpio0_0_tri_i[4] = 1'b0;
assign gpio0_0_tri_i[5] = 1'b0;
assign gpio0_0_tri_i[6] = 1'b0;
assign gpio0_0_tri_i[7] = 1'b0;
//gpio0_1: output
assign power_on_rsh2116_a = gpio0_1_tri_o[ 0];
assign power_on_rsh2116_d = gpio0_1_tri_o[ 1];
assign power_on_ads1299 = gpio0_1_tri_o[ 2];
assign led_state = gpio0_1_tri_o[ 3];
assign led_stim = gpio0_1_tri_o[ 4];
assign led_cmd_wifi[0] = gpio0_1_tri_o[ 5];
assign led_cmd_wifi[1] = gpio0_1_tri_o[ 6];
assign led_cmd_wifi[2] = gpio0_1_tri_o[ 7];
assign trigger_reset = gpio0_1_tri_o[ 8];
assign power_on_z = gpio0_1_tri_o[ 9];
assign power_sw_z = gpio0_1_tri_o[10];
assign trigger_in = {29'd0, trigger_i};
// assign trigger_o = (trigger_out==32'h000003E8)? 1'b1:((trigger_out==32'h000003E9)? 1'b1:1'b0);
assign led_pl[1] = 1'b0;
assign led_pl[0] = 1'b0;
// assign led_pl[1] = debug_sig[0]; //r75
// assign led_pl[0] = debug_sig[1]; //r76
// assign led_state = debug_sig[2];
// assign led_stim = debug_sig[3];
assign eeg_ads1299_spi_cs[0] = eeg_spi_cs[0];
assign eeg_ads1299_spi_cs[1] = eeg_spi_cs[1];
assign eeg_ads1299_spi_cs[2] = eeg_spi_cs[2];
assign eeg_ads1299_spi_cs[3] = eeg_spi_cs[3];
assign eeg_ads1299_spi_cs[4] = eeg_spi_cs[4];
assign eeg_ads1299_spi_cs[5] = eeg_spi_cs[5];
assign eeg_ads1299_spi_cs[6] = eeg_spi_cs[6];
assign eeg_ads1299_spi_cs[7] = eeg_spi_cs[7];
assign eeg_ads1299_spi_sclk[0] = eeg_spi_sclk[0];
assign eeg_ads1299_spi_sclk[1] = eeg_spi_sclk[1];
assign eeg_ads1299_spi_sclk[2] = eeg_spi_sclk[2];
assign eeg_ads1299_spi_sclk[3] = eeg_spi_sclk[3];
assign eeg_ads1299_spi_mosi[0] = eeg_spi_mosi[0];
assign eeg_ads1299_spi_mosi[1] = eeg_spi_mosi[1];
assign eeg_ads1299_spi_mosi[2] = eeg_spi_mosi[2];
assign eeg_ads1299_spi_mosi[3] = eeg_spi_mosi[3];
assign eeg_spi_miso[0] = eeg_ads1299_spi_miso[0];
assign eeg_spi_miso[1] = eeg_ads1299_spi_miso[1];
assign eeg_spi_miso[2] = eeg_ads1299_spi_miso[2];
assign eeg_spi_miso[3] = eeg_ads1299_spi_miso[3];
endmodule