initial commit

This commit is contained in:
2026-04-14 21:34:37 -07:00
commit 50f8791588
181 changed files with 344781 additions and 0 deletions

View File

@@ -0,0 +1,460 @@
`timescale 1ns/1ps
`define IP_MODULE_NAME(name) name
module `IP_MODULE_NAME(MacRxCheckSumChecker) (
input wire io_input_valid,
output reg io_input_ready,
input wire io_input_payload_last,
input wire io_input_payload_fragment_error,
input wire [7:0] io_input_payload_fragment_data,
output reg io_output_valid,
input wire io_output_ready,
output reg io_output_payload_last,
output reg io_output_payload_fragment_error,
output reg [7:0] io_output_payload_fragment_data,
input wire clk,
input wire reset
);
//pragma protect
//pragma protect begin
/* Encryption Envelope */
`pragma protect begin_protected
`pragma protect version = 1
`pragma protect encrypt_agent = "QuestaSim" , encrypt_agent_info = "2021.1"
`pragma protect key_keyowner = "Efinix Inc." , key_keyname = "EFX_K01"
`pragma protect key_method = "rsa"
`pragma protect encoding = ( enctype = "base64" , line_length = 64 , bytes = 256 )
`pragma protect key_block
hitigEdAF1oYulO+rzgvZGPZ/Fd2rMxle3YAk5YXRsXciII9biXM11yT9um6jJ8+
3kzVSR81TQjw7cIj5GSOo/ZUXLyM5C31H4zOLXmkRszAL1LLpcHPwqj/0zmRQxsk
Crgj5D989eHlroC0Prpz3dn6NdNSKLXz0GqV6d9E9r24bdIdCEg7IOxSJrlw18oq
t6GUxKyKSqV8FcH3XaacJ6RYAf6AeAQgEC04VhojxONJQnPlp2dcTeMRl6NhnRqs
sxE1pShW8ERncX+VZUigeFks09GmTIJcmh3dk//EuICiBGVdKtEDU3w0bxIs8mkX
fv849ddnaoUeK2vjnaRMXg==
`pragma protect data_method = "aes256-cbc"
`pragma protect encoding = ( enctype = "base64" , line_length = 64 , bytes = 20032 )
`pragma protect data_block
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
1HaTisqxJbDWbV49GlfnQg==
`pragma protect end_protected
//pragma protect end
`undef IP_MODULE_NAME

1744
fpga/source/MacTxLso.v Normal file

File diff suppressed because it is too large Load Diff

1494
fpga/source/design_modules.v Normal file

File diff suppressed because it is too large Load Diff

888
fpga/source/top_soc.v Normal file
View File

@@ -0,0 +1,888 @@
`define ETH_1000MBPS 1
module top_soc (
output jtagCtrl_tdi,
input jtagCtrl_tdo,
output jtagCtrl_enable,
output jtagCtrl_capture,
output jtagCtrl_shift,
output jtagCtrl_update,
output jtagCtrl_reset,
input ut_jtagCtrl_tdi,
output ut_jtagCtrl_tdo,
input ut_jtagCtrl_enable,
input ut_jtagCtrl_capture,
input ut_jtagCtrl_shift,
input ut_jtagCtrl_update,
input ut_jtagCtrl_reset,
input io_cfuClk,
input io_cfuReset,
input cpu0_customInstruction_cmd_valid,
output cpu0_customInstruction_cmd_ready,
input [9:0] cpu0_customInstruction_function_id,
input [31:0] cpu0_customInstruction_inputs_0,
input [31:0] cpu0_customInstruction_inputs_1,
output cpu0_customInstruction_rsp_valid,
input cpu0_customInstruction_rsp_ready,
output [31:0] cpu0_customInstruction_outputs_0,
input cpu1_customInstruction_cmd_valid,
output cpu1_customInstruction_cmd_ready,
input [9:0] cpu1_customInstruction_function_id,
input [31:0] cpu1_customInstruction_inputs_0,
input [31:0] cpu1_customInstruction_inputs_1,
output cpu1_customInstruction_rsp_valid,
input cpu1_customInstruction_rsp_ready,
output [31:0] cpu1_customInstruction_outputs_0,
input cpu2_customInstruction_cmd_valid,
output cpu2_customInstruction_cmd_ready,
input [9:0] cpu2_customInstruction_function_id,
input [31:0] cpu2_customInstruction_inputs_0,
input [31:0] cpu2_customInstruction_inputs_1,
output cpu2_customInstruction_rsp_valid,
input cpu2_customInstruction_rsp_ready,
output [31:0] cpu2_customInstruction_outputs_0,
input cpu3_customInstruction_cmd_valid,
output cpu3_customInstruction_cmd_ready,
input [9:0] cpu3_customInstruction_function_id,
input [31:0] cpu3_customInstruction_inputs_0,
input [31:0] cpu3_customInstruction_inputs_1,
output cpu3_customInstruction_rsp_valid,
input cpu3_customInstruction_rsp_ready,
output [31:0] cpu3_customInstruction_outputs_0,
output io_ddrMasters_0_aw_valid,
input io_ddrMasters_0_aw_ready,
output [31:0] io_ddrMasters_0_aw_payload_addr,
output [3:0] io_ddrMasters_0_aw_payload_id,
output [3:0] io_ddrMasters_0_aw_payload_region,
output [7:0] io_ddrMasters_0_aw_payload_len,
output [2:0] io_ddrMasters_0_aw_payload_size,
output [1:0] io_ddrMasters_0_aw_payload_burst,
output io_ddrMasters_0_aw_payload_lock,
output [3:0] io_ddrMasters_0_aw_payload_cache,
output [3:0] io_ddrMasters_0_aw_payload_qos,
output [2:0] io_ddrMasters_0_aw_payload_prot,
output io_ddrMasters_0_aw_payload_allStrb,
output io_ddrMasters_0_w_valid,
input io_ddrMasters_0_w_ready,
output [127:0] io_ddrMasters_0_w_payload_data,
output [15:0] io_ddrMasters_0_w_payload_strb,
output io_ddrMasters_0_w_payload_last,
input io_ddrMasters_0_b_valid,
output io_ddrMasters_0_b_ready,
input [3:0] io_ddrMasters_0_b_payload_id,
input [1:0] io_ddrMasters_0_b_payload_resp,
output io_ddrMasters_0_ar_valid,
input io_ddrMasters_0_ar_ready,
output [31:0] io_ddrMasters_0_ar_payload_addr,
output [3:0] io_ddrMasters_0_ar_payload_id,
output [3:0] io_ddrMasters_0_ar_payload_region,
output [7:0] io_ddrMasters_0_ar_payload_len,
output [2:0] io_ddrMasters_0_ar_payload_size,
output [1:0] io_ddrMasters_0_ar_payload_burst,
output io_ddrMasters_0_ar_payload_lock,
output [3:0] io_ddrMasters_0_ar_payload_cache,
output [3:0] io_ddrMasters_0_ar_payload_qos,
output [2:0] io_ddrMasters_0_ar_payload_prot,
input io_ddrMasters_0_r_valid,
output io_ddrMasters_0_r_ready,
input [127:0] io_ddrMasters_0_r_payload_data,
input [3:0] io_ddrMasters_0_r_payload_id,
input [1:0] io_ddrMasters_0_r_payload_resp,
input io_ddrMasters_0_r_payload_last,
input io_ddrMasters_0_clk,
input io_ddrMasters_0_reset,
output io_ddrMasters_memCheck_pass,
output userInterruptA,
output userInterruptB,
output userInterruptC,
output userInterruptD,
output userInterruptE,
output userInterruptF,
output userInterruptH,
output userInterruptG,
output userInterruptI,
input [3:0] system_gpio_0_io_read,
output [3:0] system_gpio_0_io_write,
output [3:0] system_gpio_0_io_writeEnable,
output system_uart_0_io_txd,
input system_uart_0_io_rxd,
output system_spi_0_io_sclk_write,
output system_spi_0_io_data_0_writeEnable,
input system_spi_0_io_data_0_read,
output system_spi_0_io_data_0_write,
output system_spi_0_io_data_1_writeEnable,
input system_spi_0_io_data_1_read,
output system_spi_0_io_data_1_write,
output system_spi_0_io_data_2_writeEnable,
input system_spi_0_io_data_2_read,
output system_spi_0_io_data_2_write,
output system_spi_0_io_data_3_writeEnable,
input system_spi_0_io_data_3_read,
output system_spi_0_io_data_3_write,
output [3:0] system_spi_0_io_ss,
output system_i2c_0_io_sda_writeEnable,
output system_i2c_0_io_sda_write,
input system_i2c_0_io_sda_read,
output system_i2c_0_io_scl_writeEnable,
output system_i2c_0_io_scl_write,
input system_i2c_0_io_scl_read,
input [31:0] axiA_awaddr,
input [7:0] axiA_awlen,
input [2:0] axiA_awsize,
input [1:0] axiA_awburst,
input axiA_awlock,
input [3:0] axiA_awcache,
input [2:0] axiA_awprot,
input [3:0] axiA_awqos,
input [3:0] axiA_awregion,
input axiA_awvalid,
output axiA_awready,
input [31:0] axiA_wdata,
input [3:0] axiA_wstrb,
input axiA_wvalid,
input axiA_wlast,
output axiA_wready,
output [1:0] axiA_bresp,
output axiA_bvalid,
input axiA_bready,
input [31:0] axiA_araddr,
input [7:0] axiA_arlen,
input [2:0] axiA_arsize,
input [1:0] axiA_arburst,
input axiA_arlock,
input [3:0] axiA_arcache,
input [2:0] axiA_arprot,
input [3:0] axiA_arqos,
input [3:0] axiA_arregion,
input axiA_arvalid,
output axiA_arready,
output [31:0] axiA_rdata,
output [1:0] axiA_rresp,
output axiA_rlast,
output axiA_rvalid,
input axiA_rready,
output axiAInterrupt,
input cfg_done,
output cfg_start,
output cfg_sel,
output cfg_reset,
input io_peripheralClk,
input io_peripheralReset,
output io_asyncReset,
input io_gpio_sw_n,
input pll_peripheral_locked,
input pll_system_locked,
input pll_tse_locked,
// SDHC
input sd_base_clk,
output sd_clk_hi,
output sd_clk_lo,
input sd_cmd_i,
output sd_cmd_o,
output sd_cmd_oe,
input [3:0] sd_dat_i,
output [3:0] sd_dat_o,
output [3:0] sd_dat_oe,
input sd_cd_n,
input sd_wp,
// TSEMAC
input io_tseClk,
// MAC
output [3:0] rgmii_txd_HI,
output [3:0] rgmii_txd_LO,
output rgmii_tx_ctl_HI,
output rgmii_tx_ctl_LO,
output rgmii_txc_HI,
output rgmii_txc_LO,
input [3:0] rgmii_rxd_HI,
input [3:0] rgmii_rxd_LO,
input rgmii_rx_ctl_HI,
input rgmii_rx_ctl_LO,
input mux_clk,
output [1:0] mux_clk_sw,
// PHY
output phy_rst,
input phy_mdi,
output phy_mdo,
output phy_mdo_en,
output phy_mdc,
input rgmii_rxc,
input rgmii_rxc_slow
);
////////////////////////////////////////////////////////////////////////////
localparam PERI_FREQ = 200;
localparam AXIS_DEV = 3;
localparam AXIM_DEV = 2;
localparam SLB = 0;
// SDHC
localparam SDHC = 1;
localparam MSDHC = 0;
// TSEMAC
localparam TSE = 2;
localparam MTSE = 1;
////////////////////////////////////////////////////////////////////////////
// Switch between sdhc and slb
wire [(AXIS_DEV*32)-1:0] gAXIS_m_awaddr;
wire [(AXIS_DEV*8)-1:0] gAXIS_m_awlen;
wire [(AXIS_DEV*3)-1:0] gAXIS_m_awsize;
wire [(AXIS_DEV*2)-1:0] gAXIS_m_awburst;
wire [(AXIS_DEV*2)-1:0] gAXIS_m_awlock;
wire [(AXIS_DEV*4)-1:0] gAXIS_m_awcache;
wire [(AXIS_DEV*4)-1:0] gAXIS_m_awprot;
wire [(AXIS_DEV*4)-1:0] gAXIS_m_awqos;
wire [(AXIS_DEV*4)-1:0] gAXIS_m_awregion;
wire [AXIS_DEV-1:0] gAXIS_m_awvalid;
wire [AXIS_DEV-1:0] gAXIS_m_awready;
wire [(AXIS_DEV*32)-1:0] gAXIS_m_wdata;
wire [(AXIS_DEV*4)-1:0] gAXIS_m_wstrb;
wire [AXIS_DEV-1:0] gAXIS_m_wvalid;
wire [AXIS_DEV-1:0] gAXIS_m_wlast;
wire [AXIS_DEV-1:0] gAXIS_m_wready;
wire [(AXIS_DEV*2)-1:0] gAXIS_m_bresp;
wire [AXIS_DEV-1:0] gAXIS_m_bvalid;
wire [AXIS_DEV-1:0] gAXIS_m_bready;
wire [(AXIS_DEV*32)-1:0] gAXIS_m_araddr;
wire [(AXIS_DEV*8)-1:0] gAXIS_m_arlen;
wire [(AXIS_DEV*3)-1:0] gAXIS_m_arsize;
wire [(AXIS_DEV*2)-1:0] gAXIS_m_arburst;
wire [(AXIS_DEV*2)-1:0] gAXIS_m_arlock;
wire [(AXIS_DEV*4)-1:0] gAXIS_m_arcache;
wire [(AXIS_DEV*4)-1:0] gAXIS_m_arprot;
wire [(AXIS_DEV*4)-1:0] gAXIS_m_arqos;
wire [(AXIS_DEV*4)-1:0] gAXIS_m_arregion;
wire [AXIS_DEV-1:0] gAXIS_m_arvalid;
wire [AXIS_DEV-1:0] gAXIS_m_arready;
wire [(AXIS_DEV*32)-1:0] gAXIS_m_rdata;
wire [(AXIS_DEV*2)-1:0] gAXIS_m_rresp;
wire [AXIS_DEV-1:0] gAXIS_m_rlast;
wire [AXIS_DEV-1:0] gAXIS_m_rvalid;
wire [AXIS_DEV-1:0] gAXIS_m_rready;
// Switch between sdhc and tsemac
wire [(AXIM_DEV*32)-1:0] gAXIM_s_awaddr;
wire [(AXIM_DEV*8)-1:0] gAXIM_s_awlen;
wire [(AXIM_DEV*3)-1:0] gAXIM_s_awsize;
wire [(AXIM_DEV*2)-1:0] gAXIM_s_awburst;
wire [(AXIM_DEV*2)-1:0] gAXIM_s_awlock;
wire [(AXIM_DEV*4)-1:0] gAXIM_s_awcache;
wire [(AXIM_DEV*4)-1:0] gAXIM_s_awprot;
wire [(AXIM_DEV*4)-1:0] gAXIM_s_awqos;
wire [(AXIM_DEV*4)-1:0] gAXIM_s_awregion;
wire [AXIM_DEV-1:0] gAXIM_s_awvalid;
wire [AXIM_DEV-1:0] gAXIM_s_awready;
wire [(AXIM_DEV*128)-1:0] gAXIM_s_wdata;
wire [(AXIM_DEV*16)-1:0] gAXIM_s_wstrb;
wire [AXIM_DEV-1:0] gAXIM_s_wvalid;
wire [AXIM_DEV-1:0] gAXIM_s_wlast;
wire [AXIM_DEV-1:0] gAXIM_s_wready;
wire [(AXIM_DEV*2)-1:0] gAXIM_s_bresp;
wire [AXIM_DEV-1:0] gAXIM_s_bvalid;
wire [AXIM_DEV-1:0] gAXIM_s_bready;
wire [(AXIM_DEV*32)-1:0] gAXIM_s_araddr;
wire [(AXIM_DEV*8)-1:0] gAXIM_s_arlen;
wire [(AXIM_DEV*3)-1:0] gAXIM_s_arsize;
wire [(AXIM_DEV*2)-1:0] gAXIM_s_arburst;
wire [(AXIM_DEV*2)-1:0] gAXIM_s_arlock;
wire [(AXIM_DEV*4)-1:0] gAXIM_s_arcache;
wire [(AXIM_DEV*4)-1:0] gAXIM_s_arprot;
wire [(AXIM_DEV*4)-1:0] gAXIM_s_arqos;
wire [(AXIM_DEV*4)-1:0] gAXIM_s_arregion;
wire [AXIM_DEV-1:0] gAXIM_s_arvalid;
wire [AXIM_DEV-1:0] gAXIM_s_arready;
wire [(AXIM_DEV*128)-1:0] gAXIM_s_rdata;
wire [(AXIM_DEV*2)-1:0] gAXIM_s_rresp;
wire [AXIM_DEV-1:0] gAXIM_s_rlast;
wire [AXIM_DEV-1:0] gAXIM_s_rvalid;
wire [AXIM_DEV-1:0] gAXIM_s_rready;
// SDHC
wire sd_rst;
wire sd_int;
wire sd_dat_oe_i;
// DMA
wire dma_tx_rst;
wire dma_rx_rst;
wire dma_tx_descriptorUpdate;
wire [1:0] dma_interrupts;
wire [31:0] dma_apb3_paddr;
wire dma_apb3_psel;
wire dma_apb3_penable;
wire dma_apb3_pready;
wire dma_apb3_pwrite;
wire [31:0] dma_apb3_pwdata;
wire [31:0] dma_apb3_prdata;
wire dma_apb3_pslverror;
// TSE
wire tse_pll_ok;
wire phy_sw_rst;
wire mac_ext_rst;
wire [2:0] eth_speed;
wire s_eth_tx_tvalid;
wire s_eth_tx_tready;
wire [7:0] s_eth_tx_tdata;
wire [0:0] s_eth_tx_tkeep;
wire [3:0] s_eth_tx_tdest;
wire s_eth_tx_tlast;
wire m_eth_rx_tvalid;
wire m_eth_rx_tready;
wire [7:0] m_eth_rx_tdata;
wire [0:0] m_eth_rx_tkeep;
wire [3:0] m_eth_rx_tdest;
wire m_eth_rx_tlast;
//reset
wire io_asyncReset_soc;
wire watchdog_reset;
gAXIS_1to3_switch u_AXIS_1to3_switch
(
.rst_n ( ~io_peripheralReset ),
.clk ( io_peripheralClk ),
.m_axi_awvalid ( gAXIS_m_awvalid ),
.m_axi_awready ( gAXIS_m_awready ),
.m_axi_awid ( ),
.m_axi_awaddr ( gAXIS_m_awaddr ),
.m_axi_awburst ( gAXIS_m_awburst ),
.m_axi_awlen ( gAXIS_m_awlen ),
.m_axi_awsize ( gAXIS_m_awsize ),
.m_axi_awcache ( gAXIS_m_awcache ),
.m_axi_awqos ( gAXIS_m_awqos ),
.m_axi_awprot ( gAXIS_m_awprot ),
.m_axi_awuser ( ),
.m_axi_awlock ( gAXIS_m_awlock ),
.m_axi_awregion ( gAXIS_m_awregion ),
.m_axi_wvalid ( gAXIS_m_wvalid ),
.m_axi_wready ( gAXIS_m_wready ),
.m_axi_wdata ( gAXIS_m_wdata ),
.m_axi_wstrb ( gAXIS_m_wstrb ),
.m_axi_wlast ( gAXIS_m_wlast ),
.m_axi_wuser ( ),
.m_axi_bready ( gAXIS_m_bready ),
.m_axi_bvalid ( gAXIS_m_bvalid ),
.m_axi_bresp ( gAXIS_m_bresp ),
.m_axi_buser ( {AXIS_DEV{3'h0}} ),
.m_axi_bid ( {AXIS_DEV{8'h0}} ),
.m_axi_arvalid ( gAXIS_m_arvalid ),
.m_axi_arready ( gAXIS_m_arready ),
.m_axi_arid ( ),
.m_axi_araddr ( gAXIS_m_araddr ),
.m_axi_arburst ( gAXIS_m_arburst ),
.m_axi_arlen ( gAXIS_m_arlen ),
.m_axi_arsize ( gAXIS_m_arsize ),
.m_axi_arlock ( gAXIS_m_arlock ),
.m_axi_arprot ( gAXIS_m_arprot ),
.m_axi_arcache ( gAXIS_m_arcache ),
.m_axi_arqos ( gAXIS_m_arqos ),
.m_axi_aruser ( ),
.m_axi_arregion ( gAXIS_m_arregion ),
.m_axi_ruser ( {AXIS_DEV{3'h0}}),
.m_axi_rvalid ( gAXIS_m_rvalid ),
.m_axi_rready ( gAXIS_m_rready ),
.m_axi_rid ( {AXIS_DEV{8'h0}}),
.m_axi_rdata ( gAXIS_m_rdata ),
.m_axi_rresp ( gAXIS_m_rresp ),
.m_axi_rlast ( gAXIS_m_rlast ),
.s_axi_awvalid ( axiA_awvalid ),
.s_axi_awready ( axiA_awready ),
.s_axi_awaddr ( {7'h00, axiA_awaddr[24:0]} ),
.s_axi_awid ( 8'h00 ),
.s_axi_awburst ( axiA_awburst ),
.s_axi_awlen ( axiA_awlen ),
.s_axi_awsize ( axiA_awsize ),
.s_axi_awprot ( {1'b0, axiA_awprot} ),
.s_axi_awlock ( {1'b0, axiA_awlock} ),
.s_axi_awcache ( axiA_awcache ),
.s_axi_awqos ( axiA_awqos ),
.s_axi_awuser ( 3'h0 ),
.s_axi_wvalid ( axiA_wvalid ),
.s_axi_wready ( axiA_wready ),
.s_axi_wid ( 8'h00 ),
.s_axi_wdata ( axiA_wdata ),
.s_axi_wlast ( axiA_wlast ),
.s_axi_wstrb ( axiA_wstrb ),
.s_axi_wuser ( 3'h0 ),
.s_axi_bvalid ( axiA_bvalid ),
.s_axi_bready ( axiA_bready ),
.s_axi_bresp ( axiA_bresp ),
.s_axi_bid ( ),
.s_axi_buser ( ),
.s_axi_arvalid ( axiA_arvalid ),
.s_axi_arready ( axiA_arready ),
.s_axi_araddr ( {7'h00, axiA_araddr[24:0]} ),
.s_axi_arid ( 8'h00 ),
.s_axi_arburst ( axiA_arburst ),
.s_axi_arlen ( axiA_arlen ),
.s_axi_arsize ( axiA_arsize ),
.s_axi_arprot ( { 1'b0, axiA_arprot} ),
.s_axi_arlock ( { 1'b0, axiA_arlock} ),
.s_axi_arcache ( axiA_arcache ),
.s_axi_arqos ( axiA_arqos ),
.s_axi_aruser ( 3'h0 ),
.s_axi_rready ( axiA_rready ),
.s_axi_rvalid ( axiA_rvalid ),
.s_axi_rdata ( axiA_rdata ),
.s_axi_rresp ( axiA_rresp ),
.s_axi_rlast ( axiA_rlast ),
.s_axi_rid ( ),
.s_axi_ruser ( )
);
gAXIM_2to1_switch u_AXIM_2to1_switch
(
.rst_n ( ~io_ddrMasters_0_reset ),
.clk ( io_ddrMasters_0_clk ),
.m_axi_awvalid ( io_ddrMasters_0_aw_valid ),
.m_axi_awready ( io_ddrMasters_0_aw_ready ),
.m_axi_awid ( io_ddrMasters_0_aw_payload_id ),
.m_axi_awaddr ( io_ddrMasters_0_aw_payload_addr ),
.m_axi_awburst ( io_ddrMasters_0_aw_payload_burst ),
.m_axi_awlen ( io_ddrMasters_0_aw_payload_len ),
.m_axi_awsize ( io_ddrMasters_0_aw_payload_size ),
.m_axi_awcache ( io_ddrMasters_0_aw_payload_cache ),
.m_axi_awqos ( io_ddrMasters_0_aw_payload_qos ),
.m_axi_awprot ( io_ddrMasters_0_aw_payload_prot ),
.m_axi_awuser ( ),
.m_axi_awlock ( io_ddrMasters_0_aw_payload_lock ),
.m_axi_awregion ( io_ddrMasters_0_aw_payload_region ),
.m_axi_wvalid ( io_ddrMasters_0_w_valid ),
.m_axi_wready ( io_ddrMasters_0_w_ready ),
.m_axi_wdata ( io_ddrMasters_0_w_payload_data ),
.m_axi_wstrb ( io_ddrMasters_0_w_payload_strb ),
.m_axi_wlast ( io_ddrMasters_0_w_payload_last ),
.m_axi_wuser ( ),
.m_axi_bready ( io_ddrMasters_0_b_ready ),
.m_axi_bvalid ( io_ddrMasters_0_b_valid ),
.m_axi_bresp ( io_ddrMasters_0_b_payload_resp ),
.m_axi_buser ( 3'h0 ),
.m_axi_bid ( {4'h0, io_ddrMasters_0_b_payload_id} ),
.m_axi_arvalid ( io_ddrMasters_0_ar_valid ),
.m_axi_arready ( io_ddrMasters_0_ar_ready ),
.m_axi_arid ( io_ddrMasters_0_ar_payload_id ),
.m_axi_araddr ( io_ddrMasters_0_ar_payload_addr ),
.m_axi_arburst ( io_ddrMasters_0_ar_payload_burst ),
.m_axi_arlen ( io_ddrMasters_0_ar_payload_len ),
.m_axi_arsize ( io_ddrMasters_0_ar_payload_size ),
.m_axi_arlock ( io_ddrMasters_0_ar_payload_lock ),
.m_axi_arprot ( io_ddrMasters_0_ar_payload_prot ),
.m_axi_arcache ( io_ddrMasters_0_ar_payload_cache ),
.m_axi_arqos ( io_ddrMasters_0_ar_payload_qos ),
.m_axi_aruser ( ),
.m_axi_arregion ( io_ddrMasters_0_ar_payload_region ),
.m_axi_ruser ( 3'h0),
.m_axi_rvalid ( io_ddrMasters_0_r_valid ),
.m_axi_rready ( io_ddrMasters_0_r_ready ),
.m_axi_rid ( 8'h0 ),
.m_axi_rdata ( io_ddrMasters_0_r_payload_data ),
.m_axi_rresp ( io_ddrMasters_0_r_payload_resp ),
.m_axi_rlast ( io_ddrMasters_0_r_payload_last ),
.s_axi_awvalid ( gAXIM_s_awvalid ),
.s_axi_awready ( gAXIM_s_awready ),
.s_axi_awaddr ( gAXIM_s_awaddr ),
.s_axi_awid ( {AXIM_DEV{8'h00}} ),
.s_axi_awburst ( gAXIM_s_awburst ),
.s_axi_awlen ( gAXIM_s_awlen ),
.s_axi_awsize ( gAXIM_s_awsize ),
.s_axi_awprot ( gAXIM_s_awprot ),
.s_axi_awlock ( gAXIM_s_awlock ),
.s_axi_awcache ( gAXIM_s_awcache ),
.s_axi_awqos ( gAXIM_s_awqos ),
.s_axi_awuser ( {AXIM_DEV{3'h0}} ),
.s_axi_wvalid ( gAXIM_s_wvalid ),
.s_axi_wready ( gAXIM_s_wready ),
.s_axi_wid ( {AXIM_DEV{8'h00}} ),
.s_axi_wdata ( gAXIM_s_wdata ),
.s_axi_wlast ( gAXIM_s_wlast ),
.s_axi_wstrb ( gAXIM_s_wstrb ),
.s_axi_wuser ( {AXIM_DEV{3'h0}} ),
.s_axi_bvalid ( gAXIM_s_bvalid ),
.s_axi_bready ( gAXIM_s_bready ),
.s_axi_bresp ( gAXIM_s_bresp ),
.s_axi_bid ( ),
.s_axi_buser ( ),
.s_axi_arvalid ( gAXIM_s_arvalid ),
.s_axi_arready ( gAXIM_s_arready ),
.s_axi_araddr ( gAXIM_s_araddr ),
.s_axi_arid ( {AXIM_DEV{8'h00}} ),
.s_axi_arburst ( gAXIM_s_arburst ),
.s_axi_arlen ( gAXIM_s_arlen ),
.s_axi_arsize ( gAXIM_s_arsize ),
.s_axi_arprot ( gAXIM_s_axiA_arprot ),
.s_axi_arlock ( gAXIM_s_axiA_arlock ),
.s_axi_arcache ( gAXIM_s_arcache ),
.s_axi_arqos ( gAXIM_s_arqos ),
.s_axi_aruser ( {AXIM_DEV{3'h0}} ),
.s_axi_rready ( gAXIM_s_rready ),
.s_axi_rvalid ( gAXIM_s_rvalid ),
.s_axi_rdata ( gAXIM_s_rdata ),
.s_axi_rresp ( gAXIM_s_rresp ),
.s_axi_rlast ( gAXIM_s_rlast ),
.s_axi_rid ( ),
.s_axi_ruser ( )
);
assign sd_rst = io_peripheralReset;
assign gAXIS_m_rlast[SDHC*1 +: 1] = 1'b1;
assign sd_dat_oe = {4{sd_dat_oe_i}};
assign userInterruptI = sd_int;
gSDHC u_gSDHC
(
.sd_rst ( sd_rst ),
.sd_base_clk ( sd_base_clk ),
.sd_int ( sd_int ),
.sd_cd_n ( sd_cd_n ),
.sd_wp ( sd_wp ),
.s_axi_aclk ( io_peripheralClk ),
.s_axi_awaddr ( gAXIS_m_awaddr[SDHC*32 +: 32] ),
.s_axi_awready ( gAXIS_m_awready[SDHC*1 +: 1] ),
.s_axi_awvalid ( gAXIS_m_awvalid[SDHC*1 +: 1] ),
.s_axi_wstrb ( gAXIS_m_wstrb[SDHC*4 +: 4]),
.s_axi_wdata ( gAXIS_m_wdata[SDHC*32 +: 32] ),
.s_axi_wready ( gAXIS_m_wready[SDHC*1 +: 1] ),
.s_axi_wvalid ( gAXIS_m_wvalid[SDHC*1 +: 1] ),
.s_axi_bresp ( gAXIS_m_bresp[SDHC*2 +: 2] ),
.s_axi_bvalid ( gAXIS_m_bvalid[SDHC*1 +: 1] ),
.s_axi_araddr ( gAXIS_m_araddr[SDHC*32 +: 32] ),
.s_axi_bready ( gAXIS_m_bready[SDHC*1 +: 1] ),
.s_axi_arready ( gAXIS_m_arready[SDHC*1 +: 1] ),
.s_axi_arvalid ( gAXIS_m_arvalid[SDHC*1 +: 1] ),
.s_axi_rresp ( gAXIS_m_rresp[SDHC*2 +: 2] ),
.s_axi_rdata ( gAXIS_m_rdata[SDHC*32 +: 32]),
.s_axi_rvalid ( gAXIS_m_rvalid[SDHC*1 +: 1] ),
.s_axi_rready ( gAXIS_m_rready[SDHC*1 +: 1] ),
.m_axi_clk ( io_ddrMasters_0_clk ),
.m_axi_awaddr ( gAXIM_s_awaddr[MSDHC*32 +: 32] ),
.m_axi_awvalid ( gAXIM_s_awvalid[MSDHC*1 +: 1] ),
.m_axi_awlen ( gAXIM_s_awlen[MSDHC*8 +: 8] ),
.m_axi_awready ( gAXIM_s_awready[MSDHC*1 +: 1] ),
.m_axi_awburst ( gAXIM_s_awburst[MSDHC*2 +: 2] ),
.m_axi_awsize ( gAXIM_s_awsize[MSDHC*3 +: 3] ),
.m_axi_awcache ( gAXIM_s_awcache[MSDHC*4 +: 4] ),
.m_axi_awlock ( gAXIM_s_awlock[MSDHC*2 +: 2] ),
.m_axi_awprot ( gAXIM_s_awprot[MSDHC*4 +: 4] ),
.m_axi_wdata ( gAXIM_s_wdata[MSDHC*128 +: 128] ),
.m_axi_wstrb ( gAXIM_s_wstrb[MSDHC*16 +: 16] ),
.m_axi_wlast ( gAXIM_s_wlast[MSDHC*1 +: 1] ),
.m_axi_wvalid ( gAXIM_s_wvalid[MSDHC*1 +: 1] ),
.m_axi_wready ( gAXIM_s_wready[MSDHC*1 +:1] ),
.m_axi_bresp ( gAXIM_s_bresp[MSDHC*2 +: 2] ),
.m_axi_bvalid ( gAXIM_s_bvalid[MSDHC*1 +: 1] ),
.m_axi_bready ( gAXIM_s_bready[MSDHC*1 +: 1] ),
.m_axi_arvalid ( gAXIM_s_arvalid[MSDHC*1 +: 1] ),
.m_axi_araddr ( gAXIM_s_araddr[MSDHC*32 +: 32] ),
.m_axi_arlen ( gAXIM_s_arlen[MSDHC*8 +: 8] ),
.m_axi_arsize ( gAXIM_s_arsize[MSDHC*3 +: 3] ),
.m_axi_arburst ( gAXIM_s_arburst[MSDHC*2 +: 2] ),
.m_axi_arprot ( gAXIM_s_arprot[MSDHC*4 +: 4] ),
.m_axi_arlock ( gAXIM_s_arlock[MSDHC*2 +: 2] ),
.m_axi_arcache ( gAXIM_s_arcache[MSDHC*4 +: 4] ),
.m_axi_arready ( gAXIM_s_arready[MSDHC*1 +: 1] ),
.m_axi_rvalid ( gAXIM_s_rvalid[MSDHC*1 +: 1] ),
.m_axi_rdata ( gAXIM_s_rdata[MSDHC*128 +: 128] ),
.m_axi_rlast ( gAXIM_s_rlast[MSDHC*1 +: 1] ),
.m_axi_rresp ( gAXIM_s_rresp[MSDHC*2 +: 2] ),
.m_axi_rready ( gAXIM_s_rready[MSDHC*1 +: 1] ),
.sd_clk_hi ( sd_clk_hi ),
.sd_clk_lo ( sd_clk_lo ),
.sd_cmd_i ( sd_cmd_i ),
.sd_cmd_o ( sd_cmd_o ),
.sd_cmd_oe ( sd_cmd_oe ),
.sd_dat_i ( sd_dat_i ),
.sd_dat_o ( sd_dat_o ),
.sd_dat_oe ( sd_dat_oe_i )
);
assign m_eth_rx_tdest = 4'h0;
assign phy_rst = phy_sw_rst;
assign tse_pll_ok = pll_tse_locked & pll_peripheral_locked;
tseCore u_tseCore (
.io_peripheralClk ( io_peripheralClk ),
.io_peripheralReset ( io_peripheralReset ),
.io_tseClk ( io_tseClk ),
.pll_locked ( tse_pll_ok ),
.phy_sw_rst ( phy_sw_rst ),
.mac_ext_rst ( mac_ext_rst ),
.dma_rx_rst ( dma_rx_rst ),
.dma_tx_rst ( dma_tx_rst ),
.dma_tx_descriptorUpdate ( dma_tx_descriptorUpdate ),
.dma_interrupts ( dma_interrupts ),
.eth_speed ( eth_speed ),
.rgmii_txd_HI ( rgmii_txd_HI ),
.rgmii_txd_LO ( rgmii_txd_LO ),
.rgmii_tx_ctl_HI ( rgmii_tx_ctl_HI ),
.rgmii_tx_ctl_LO ( rgmii_tx_ctl_LO ),
.rgmii_txc_HI ( rgmii_txc_HI ),
.rgmii_txc_LO ( rgmii_txc_LO ),
.rgmii_rxd_HI ( rgmii_rxd_HI ),
.rgmii_rxd_LO ( rgmii_rxd_LO ),
.rgmii_rx_ctl_HI ( rgmii_rx_ctl_HI ),
.rgmii_rx_ctl_LO ( rgmii_rx_ctl_LO ),
`ifdef ETH_1000MBPS
.rgmii_rxc ( rgmii_rxc ),
`else
.rgmii_rxc ( rgmii_rxc_slow ),
`endif
.phy_mdi ( phy_mdi ),
.phy_mdo ( phy_mdo ),
.phy_mdo_en ( phy_mdo_en ),
.phy_mdc ( phy_mdc ),
.s_axi_awaddr ( gAXIS_m_awaddr[TSE*32 +: 32] ),
.s_axi_awvalid ( gAXIS_m_awvalid[TSE*1 +: 1] ),
.s_axi_awready ( gAXIS_m_awready[TSE*1 +: 1] ),
.s_axi_wdata ( gAXIS_m_wdata[TSE*32 +: 32] ),
.s_axi_wstrb ( gAXIS_m_wstrb[TSE*4 +: 4] ),
.s_axi_wlast ( gAXIS_m_wlast[TSE*1 +: 1] ),
.s_axi_wvalid ( gAXIS_m_wvalid[TSE*1 +: 1] ),
.s_axi_wready ( gAXIS_m_wready[TSE*1 +: 1] ),
.s_axi_bresp ( gAXIS_m_bresp[TSE*2 +: 2] ),
.s_axi_bvalid ( gAXIS_m_bvalid[TSE*1 +: 1] ),
.s_axi_bready ( gAXIS_m_bready[TSE*1 +: 1] ),
.s_axi_araddr ( gAXIS_m_araddr[TSE*32 +: 32] ),
.s_axi_arvalid ( gAXIS_m_arvalid[TSE*1 +: 1] ),
.s_axi_arready ( gAXIS_m_arready[TSE*1 +: 1] ),
.s_axi_rresp ( gAXIS_m_rresp[TSE*2 +: 2] ),
.s_axi_rdata ( gAXIS_m_rdata[TSE*32 +: 32] ),
.s_axi_rlast ( gAXIS_m_rlast[TSE*1 +: 1] ),
.s_axi_rvalid ( gAXIS_m_rvalid[TSE*1 +: 1] ),
.s_axi_rready ( gAXIS_m_rready[TSE*1 +: 1] ),
.s_eth_tx_tvalid ( s_eth_tx_tvalid ),
.s_eth_tx_tready ( s_eth_tx_tready ),
.s_eth_tx_tdata ( s_eth_tx_tdata ),
.s_eth_tx_tkeep ( s_eth_tx_tkeep ),
.s_eth_tx_tdest ( s_eth_tx_tdest ),
.s_eth_tx_tlast ( s_eth_tx_tlast ),
.m_eth_rx_tvalid ( m_eth_rx_tvalid ),
.m_eth_rx_tready ( m_eth_rx_tready ),
.m_eth_rx_tdata ( m_eth_rx_tdata ),
.m_eth_rx_tstrb ( m_eth_rx_tstrb ),
.m_eth_rx_tlast ( m_eth_rx_tlast )
);
assign userInterruptG = dma_interrupts[0];
assign userInterruptH = dma_interrupts[1];
gDMA u_gDMA (
.clk ( io_ddrMasters_0_clk ),
.reset ( io_ddrMasters_0_reset ),
.ctrl_clk ( io_peripheralClk ),
.ctrl_reset ( io_peripheralReset ),
.ctrl_PADDR ( dma_apb3_paddr ),
.ctrl_PREADY ( dma_apb3_pready ),
.ctrl_PENABLE ( dma_apb3_penable ),
.ctrl_PSEL ( dma_apb3_psel ),
.ctrl_PWRITE ( dma_apb3_pwrite ),
.ctrl_PWDATA ( dma_apb3_pwdata ),
.ctrl_PRDATA ( dma_apb3_prdata ),
.ctrl_PSLVERROR ( dma_apb3_pslverror ),
.ctrl_interrupts ( dma_interrupts ),
.read_arvalid ( gAXIM_s_arvalid[MTSE*1 +: 1] ),
.read_araddr ( gAXIM_s_araddr[MTSE*32 +: 32] ),
.read_arready ( gAXIM_s_arready[MTSE*1 +: 1] ),
.read_arregion ( gAXIM_s_arregion[MTSE*4 +: 4] ),
.read_arlen ( gAXIM_s_arlen[MTSE*8 +: 8] ),
.read_arsize ( gAXIM_s_arsize[MTSE*3 +: 3] ),
.read_arburst ( gAXIM_s_arburst[MTSE*2 +: 2] ),
.read_arlock ( gAXIM_s_arlock[MTSE*2 +: 2] ),
.read_arcache ( gAXIM_s_arcache[MTSE*4 +: 4] ),
.read_arqos ( gAXIM_s_arqos[MTSE*4 +: 4] ),
.read_arprot ( gAXIM_s_arprot[MTSE*4 +: 4] ),
.read_rready ( gAXIM_s_rready[MTSE*1 +: 1] ),
.read_rvalid ( gAXIM_s_rvalid[MTSE*1 +: 1] ),
.read_rdata ( gAXIM_s_rdata[MTSE*128 +: 128] ),
.read_rlast ( gAXIM_s_rlast[MTSE*1 +: 1] ),
.read_rresp ( gAXIM_s_rresp[MTSE*2 +: 2] ),
.write_awvalid ( gAXIM_s_awvalid[MTSE*1 +: 1] ),
.write_awready ( gAXIM_s_awready[MTSE*1 +: 1] ),
.write_awaddr ( gAXIM_s_awaddr[MTSE*32 +: 32] ),
.write_awregion ( gAXIM_s_awregion[MTSE*4 +: 4] ),
.write_awlen ( gAXIM_s_awlen[MTSE*8 +: 8] ),
.write_awsize ( gAXIM_s_awsize[MTSE*3 +: 3] ),
.write_awburst ( gAXIM_s_awburst[MTSE*2 +: 2] ),
.write_awlock ( gAXIM_s_awlock[MTSE*2 +: 2] ),
.write_awcache ( gAXIM_s_awcache[MTSE*4 +: 4] ),
.write_awqos ( gAXIM_s_awqos[MTSE*4 +: 4] ),
.write_awprot ( gAXIM_s_awprot[MTSE*4 +: 4] ),
.write_wvalid ( gAXIM_s_wvalid[MTSE*1 +: 1] ),
.write_wready ( gAXIM_s_wready[MTSE*1 +: 1] ),
.write_wdata ( gAXIM_s_wdata[MTSE*128 +: 128] ),
.write_wstrb ( gAXIM_s_wstrb[MTSE*16 +: 16] ),
.write_wlast ( gAXIM_s_wlast[MTSE*1 +: 1] ),
.write_bvalid ( gAXIM_s_bvalid[MTSE*1 +: 1] ),
.write_bready ( gAXIM_s_bready[MTSE*1 +: 1] ),
.write_bresp ( gAXIM_s_bresp[MTSE*2 +: 2] ),
.dat1_o_clk ( io_tseClk ),
.dat1_o_reset ( mac_ext_rst | dma_tx_rst),
.dat1_o_tvalid ( s_eth_tx_tvalid ),
.dat1_o_tready ( s_eth_tx_tready ),
.dat1_o_tdata ( s_eth_tx_tdata ),
.dat1_o_tkeep ( s_eth_tx_tkeep ),
.dat1_o_tdest ( s_eth_tx_tdest ),
.dat1_o_tlast ( s_eth_tx_tlast ),
`ifdef ETH_1000MBPS
.dat0_i_clk ( rgmii_rxc ),
`else
.dat0_i_clk ( rgmii_rxc_slow ),
`endif
.dat0_i_reset ( mac_ext_rst | dma_rx_rst ),
.dat0_i_tvalid ( m_eth_rx_tvalid ),
.dat0_i_tready ( m_eth_rx_tready ),
.dat0_i_tdata ( m_eth_rx_tdata ),
.dat0_i_tkeep ( 1'b1),
.dat0_i_tdest ( m_eth_rx_tdest ),
.dat0_i_tlast ( m_eth_rx_tlast ),
.io_1_descriptorUpdate ( ),
.io_0_descriptorUpdate (dma_tx_descriptorUpdate)
);
////////////////////////////////////////////////////////////////////////////
custom_instruction_tea cpu0_custom_instruction_tea_inst(
.clk(io_cfuClk),
.reset(io_cfuReset),
.cmd_valid(cpu0_customInstruction_cmd_valid),
.cmd_ready(cpu0_customInstruction_cmd_ready),
.cmd_function_id(cpu0_customInstruction_function_id),
.cmd_inputs_0(cpu0_customInstruction_inputs_0),
.cmd_inputs_1(cpu0_customInstruction_inputs_1),
.rsp_valid(cpu0_customInstruction_rsp_valid),
.rsp_ready(cpu0_customInstruction_rsp_ready),
.rsp_outputs_0(cpu0_customInstruction_outputs_0));
custom_instruction_tea cpu1_custom_instruction_tea_inst(
.clk(io_cfuClk),
.reset(io_cfuReset),
.cmd_valid(cpu1_customInstruction_cmd_valid),
.cmd_ready(cpu1_customInstruction_cmd_ready),
.cmd_function_id(cpu1_customInstruction_function_id),
.cmd_inputs_0(cpu1_customInstruction_inputs_0),
.cmd_inputs_1(cpu1_customInstruction_inputs_1),
.rsp_valid(cpu1_customInstruction_rsp_valid),
.rsp_ready(cpu1_customInstruction_rsp_ready),
.rsp_outputs_0(cpu1_customInstruction_outputs_0));
custom_instruction_tea cpu2_custom_instruction_tea_inst(
.clk(io_cfuClk),
.reset(io_cfuReset),
.cmd_valid(cpu2_customInstruction_cmd_valid),
.cmd_ready(cpu2_customInstruction_cmd_ready),
.cmd_function_id(cpu2_customInstruction_function_id),
.cmd_inputs_0(cpu2_customInstruction_inputs_0),
.cmd_inputs_1(cpu2_customInstruction_inputs_1),
.rsp_valid(cpu2_customInstruction_rsp_valid),
.rsp_ready(cpu2_customInstruction_rsp_ready),
.rsp_outputs_0(cpu2_customInstruction_outputs_0));
custom_instruction_tea cpu3_custom_instruction_tea_inst(
.clk(io_cfuClk),
.reset(io_cfuReset),
.cmd_valid(cpu3_customInstruction_cmd_valid),
.cmd_ready(cpu3_customInstruction_cmd_ready),
.cmd_function_id(cpu3_customInstruction_function_id),
.cmd_inputs_0(cpu3_customInstruction_inputs_0),
.cmd_inputs_1(cpu3_customInstruction_inputs_1),
.rsp_valid(cpu3_customInstruction_rsp_valid),
.rsp_ready(cpu3_customInstruction_rsp_ready),
.rsp_outputs_0(cpu3_customInstruction_outputs_0));
assign io_asyncReset = io_asyncReset_soc | watchdog_reset;
//axi4 bridge to various I/O
EfxSapphireHpSoc_slb u_top_peripherals(
.io_apbSlave_0_PADDR ( dma_apb3_paddr ),
.io_apbSlave_0_PENABLE ( dma_apb3_penable ),
.io_apbSlave_0_PRDATA ( dma_apb3_prdata ),
.io_apbSlave_0_PREADY ( dma_apb3_pready ),
.io_apbSlave_0_PSEL ( dma_apb3_psel ),
.io_apbSlave_0_PSLVERROR ( dma_apb3_pslverror ),
.io_apbSlave_0_PWDATA ( dma_apb3_pwdata ),
.io_apbSlave_0_PWRITE ( dma_apb3_pwrite ),
.system_spi_0_io_sclk_write ( system_spi_0_io_sclk_write ),
.system_spi_0_io_data_0_writeEnable ( system_spi_0_io_data_0_writeEnable ),
.system_spi_0_io_data_0_read ( system_spi_0_io_data_0_read ),
.system_spi_0_io_data_0_write ( system_spi_0_io_data_0_write ),
.system_spi_0_io_data_1_writeEnable ( system_spi_0_io_data_1_writeEnable ),
.system_spi_0_io_data_1_read ( system_spi_0_io_data_1_read ),
.system_spi_0_io_data_1_write ( system_spi_0_io_data_1_write ),
.system_spi_0_io_data_2_writeEnable ( system_spi_0_io_data_2_writeEnable ),
.system_spi_0_io_data_2_read ( system_spi_0_io_data_2_read ),
.system_spi_0_io_data_2_write ( system_spi_0_io_data_2_write ),
.system_spi_0_io_data_3_writeEnable ( system_spi_0_io_data_3_writeEnable ),
.system_spi_0_io_data_3_read ( system_spi_0_io_data_3_read ),
.system_spi_0_io_data_3_write ( system_spi_0_io_data_3_write ),
.system_spi_0_io_ss ( system_spi_0_io_ss ),
.system_uart_0_io_txd ( system_uart_0_io_txd ),
.system_uart_0_io_rxd ( system_uart_0_io_rxd ),
.system_i2c_0_io_sda_writeEnable ( system_i2c_0_io_sda_writeEnable ),
.system_i2c_0_io_sda_write ( system_i2c_0_io_sda_write ),
.system_i2c_0_io_sda_read ( system_i2c_0_io_sda_read ),
.system_i2c_0_io_scl_writeEnable ( system_i2c_0_io_scl_writeEnable ),
.system_i2c_0_io_scl_write ( system_i2c_0_io_scl_write ),
.system_i2c_0_io_scl_read ( system_i2c_0_io_scl_read ),
.jtagCtrl_tdi ( jtagCtrl_tdi ),
.jtagCtrl_tdo ( jtagCtrl_tdo ),
.jtagCtrl_enable ( jtagCtrl_enable ),
.jtagCtrl_capture ( jtagCtrl_capture ),
.jtagCtrl_shift ( jtagCtrl_shift ),
.jtagCtrl_update ( jtagCtrl_update ),
.jtagCtrl_reset ( jtagCtrl_reset ),
.ut_jtagCtrl_tdi ( ut_jtagCtrl_tdi ),
.ut_jtagCtrl_tdo ( ut_jtagCtrl_tdo ),
.ut_jtagCtrl_enable ( ut_jtagCtrl_enable ),
.ut_jtagCtrl_capture ( ut_jtagCtrl_capture ),
.ut_jtagCtrl_shift ( ut_jtagCtrl_shift ),
.ut_jtagCtrl_update ( ut_jtagCtrl_update ),
.ut_jtagCtrl_reset ( ut_jtagCtrl_reset ),
.system_gpio_0_io_read ( system_gpio_0_io_read ),
.system_gpio_0_io_write ( system_gpio_0_io_write ),
.system_gpio_0_io_writeEnable ( system_gpio_0_io_writeEnable ),
.system_watchdog_hardPanic_reset ( watchdog_reset ),
.userInterruptA ( userInterruptA ),
.userInterruptB ( userInterruptB ),
.userInterruptC ( userInterruptC ),
.userInterruptD ( userInterruptD ),
.userInterruptE ( userInterruptE ),
.userInterruptF ( userInterruptF ),
.axiA_awvalid ( gAXIS_m_awvalid[SLB*1 +: 1] ),
.axiA_awready ( gAXIS_m_awready[SLB*1 +: 1] ),
.axiA_awaddr ( gAXIS_m_awaddr[SLB*32 +: 32] ),
.axiA_awlen ( gAXIS_m_awlen[SLB*8 +: 8] ),
.axiA_awburst ( gAXIS_m_awburst[SLB*2 +: 2] ),
.axiA_awsize ( gAXIS_m_awsize[SLB*3 +: 3] ),
.axiA_awcache ( gAXIS_m_awcache[SLB*4 +: 4] ),
.axiA_awprot ( gAXIS_m_awprot[SLB*3 +: 3] ),
.axiA_wvalid ( gAXIS_m_wvalid[SLB*1 +: 1] ),
.axiA_wready ( gAXIS_m_wready[SLB*1 +: 1] ),
.axiA_wdata ( gAXIS_m_wdata[SLB*32 +: 32] ),
.axiA_wstrb ( gAXIS_m_wstrb[SLB*4 +: 4] ),
.axiA_wlast ( gAXIS_m_wlast[SLB*1 +: 1] ),
.axiA_bvalid ( gAXIS_m_bvalid[SLB*1 +: 1] ),
.axiA_bready ( gAXIS_m_bready[SLB*1 +: 1] ),
.axiA_bresp ( gAXIS_m_bresp[SLB*2 +: 2] ),
.axiA_arvalid ( gAXIS_m_arvalid[SLB*1 +: 1] ),
.axiA_arready ( gAXIS_m_arready[SLB*1 +: 1] ),
.axiA_araddr ( gAXIS_m_araddr[SLB*32 +: 32] ),
.axiA_arlen ( gAXIS_m_arlen[SLB*8 +: 8] ),
.axiA_arburst ( gAXIS_m_arburst[SLB*2 +: 2]),
.axiA_arsize ( gAXIS_m_arsize[SLB*3 +: 3] ),
.axiA_arcache ( gAXIS_m_arcache[SLB*4 +: 4] ),
.axiA_arprot ( gAXIS_m_arprot[SLB*3 +: 3] ),
.axiA_rvalid ( gAXIS_m_rvalid[SLB*1 +: 1] ),
.axiA_rready ( gAXIS_m_rready[SLB*1 +: 1] ),
.axiA_rdata ( gAXIS_m_rdata[SLB*32 +: 32] ),
.axiA_rresp ( gAXIS_m_rresp[SLB*2 +: 2] ),
.axiA_rlast ( gAXIS_m_rlast[SLB*1 +: 1] ),
.axiAInterrupt ( axiAInterrupt ),
.cfg_done ( cfg_done ),
.cfg_start ( cfg_start ),
.cfg_sel ( cfg_sel ),
.cfg_reset ( cfg_reset ),
.io_peripheralClk ( io_peripheralClk ),
.io_peripheralReset ( io_peripheralReset ),
.io_asyncReset ( io_asyncReset_soc ),
.io_gpio_sw_n ( io_gpio_sw_n ),
.pll_peripheral_locked ( pll_peripheral_locked ),
.pll_system_locked ( pll_system_locked )
);
endmodule

996
fpga/source/tseCore.v Normal file
View File

@@ -0,0 +1,996 @@
`timescale 1 ns / 1 ns
module tseCore #(
parameter ADDR_WIDTH = 10
) (
input io_peripheralClk,
input io_peripheralReset,
input io_tseClk,
input pll_locked,
output phy_sw_rst,
output mac_ext_rst,
output dma_rx_rst,
output dma_tx_rst,
input dma_tx_descriptorUpdate,
output [1:0] dma_interrupts,
output [2:0] eth_speed,
// MAC RGMII Interface
output [3:0] rgmii_txd_HI,
output [3:0] rgmii_txd_LO,
output rgmii_tx_ctl_HI,
output rgmii_tx_ctl_LO,
output rgmii_txc_HI,
output rgmii_txc_LO,
input [3:0] rgmii_rxd_HI,
input [3:0] rgmii_rxd_LO,
input rgmii_rx_ctl_HI,
input rgmii_rx_ctl_LO,
input rgmii_rxc,
// PHY MDIO Interface
input phy_mdi,
output phy_mdo,
output phy_mdo_en,
output phy_mdc,
// AXI CSR
input [31:0] s_axi_awaddr,
input s_axi_awvalid,
output s_axi_awready,
input [31:0] s_axi_wdata,
input [3:0] s_axi_wstrb,
output s_axi_wlast,
input s_axi_wvalid,
output s_axi_wready,
output [1:0] s_axi_bresp,
output s_axi_bvalid,
input s_axi_bready,
input [31:0] s_axi_araddr,
input s_axi_arvalid,
output s_axi_arready,
output [1:0] s_axi_rresp,
output [31:0] s_axi_rdata,
output s_axi_rlast,
output s_axi_rvalid,
input s_axi_rready,
// MAC Stream
input s_eth_tx_tvalid,
output s_eth_tx_tready,
input [7:0] s_eth_tx_tdata,
input [0:0] s_eth_tx_tkeep,
input [3:0] s_eth_tx_tdest,
input s_eth_tx_tlast,
output m_eth_rx_tvalid,
input m_eth_rx_tready,
output [7:0] m_eth_rx_tdata,
output [0:0] m_eth_rx_tstrb,
output m_eth_rx_tlast
);
////////////////////////////////////////////////////////////////////////////////////////////
localparam TSE_DEV = 2;
localparam MAC = 0;
localparam CMN = 1;
// Switch between MAC and CMN
wire [(TSE_DEV*32)-1:0] gTSE_m_awaddr;
wire [(TSE_DEV*8)-1:0] gTSE_m_awlen;
wire [(TSE_DEV*3)-1:0] gTSE_m_awsize;
wire [(TSE_DEV*2)-1:0] gTSE_m_awburst;
wire [(TSE_DEV*2)-1:0] gTSE_m_awlock;
wire [TSE_DEV-1:0] gTSE_m_awvalid;
wire [TSE_DEV-1:0] gTSE_m_awready;
wire [(TSE_DEV*32)-1:0] gTSE_m_wdata;
wire [(TSE_DEV*4)-1:0] gTSE_m_wstrb;
wire [TSE_DEV-1:0] gTSE_m_wvalid;
wire [TSE_DEV-1:0] gTSE_m_wlast;
wire [TSE_DEV-1:0] gTSE_m_wready;
wire [(TSE_DEV*2)-1:0] gTSE_m_bresp;
wire [TSE_DEV-1:0] gTSE_m_bvalid;
wire [TSE_DEV-1:0] gTSE_m_bready;
wire [(TSE_DEV*32)-1:0] gTSE_m_araddr;
wire [(TSE_DEV*8)-1:0] gTSE_m_arlen;
wire [(TSE_DEV*3)-1:0] gTSE_m_arsize;
wire [(TSE_DEV*2)-1:0] gTSE_m_arburst;
wire [(TSE_DEV*2)-1:0] gTSE_m_arlock;
wire [TSE_DEV-1:0] gTSE_m_arvalid;
wire [TSE_DEV-1:0] gTSE_m_arready;
wire [(TSE_DEV*32)-1:0] gTSE_m_rdata;
wire [(TSE_DEV*2)-1:0] gTSE_m_rresp;
wire [TSE_DEV-1:0] gTSE_m_rlast;
wire [TSE_DEV-1:0] gTSE_m_rvalid;
wire [TSE_DEV-1:0] gTSE_m_rready;
// clock reset
wire mac_sw_rst;
wire proto_reset;
wire mac_ext_srst;
wire rx_axis_clk;
wire tx_axis_clk;
// Stream control
wire m_eth_tx_tvalid;
wire m_eth_tx_tready;
wire [7:0] m_eth_tx_tdata;
wire [3:0] m_eth_tx_tdest;
wire m_eth_tx_tlast;
wire s_eth_rx_tvalid;
wire s_eth_rx_tready;
wire [7:0] s_eth_rx_tdata;
wire [0:0] s_eth_rx_tkeep;
wire [3:0] s_eth_rx_tdest;
wire s_eth_rx_tlast;
////////////////////////////////////////////////////////////////////////////////////////////
assign mac_ext_rst = ~pll_locked;
assign rx_axis_clk = io_tseClk;
assign tx_axis_clk = io_tseClk;
reset_ctrl #(
.NUM_RST (2),
.CYCLE (2),
.IN_RST_ACTIVE (2'b11),
.OUT_RST_ACTIVE (2'b11)
) inst_reset_ctrl (
.i_arst ({mac_sw_rst, mac_ext_rst}),
.i_clk ({2{io_tseClk}}),
.o_srst ({proto_reset, mac_ext_srst})
);
gTSE_1to2_switch u_gTSE_1to2_switch
(
.rst_n ( ~io_peripheralReset ),
.clk ( io_peripheralClk ),
.s_axi_awvalid ( s_axi_awvalid ),
.s_axi_awready ( s_axi_awready ),
.s_axi_awaddr ( {16'd0, s_axi_awaddr[15:0]} ),
.s_axi_awlock ( 2'b00 ),
.s_axi_wready ( s_axi_wready ),
.s_axi_wvalid ( s_axi_wvalid ),
.s_axi_wstrb ( s_axi_wstrb ),
.s_axi_wdata ( s_axi_wdata ),
.s_axi_wlast ( s_axi_wlast ),
.s_axi_wid ( 8'h00 ),
.s_axi_bvalid ( s_axi_bvalid ),
.s_axi_bready ( s_axi_bready ),
.s_axi_bid ( ),
.s_axi_bresp ( s_axi_bresp ),
.s_axi_arvalid ( s_axi_arvalid ),
.s_axi_arready ( s_axi_arready ),
.s_axi_araddr ( {16'd0, s_axi_araddr[15:0]} ),
.s_axi_arlock ( 2'b00 ),
.s_axi_rvalid ( s_axi_rvalid ),
.s_axi_rready ( s_axi_rready ),
.s_axi_rid ( ),
.s_axi_rdata ( s_axi_rdata ),
.s_axi_rlast ( ),
.s_axi_rresp ( s_axi_rresp ),
.m_axi_awvalid ( gTSE_m_awvalid ),
.m_axi_awready ( gTSE_m_awready ),
.m_axi_awaddr ( gTSE_m_awaddr ),
.m_axi_awlock ( ),
.m_axi_wvalid ( gTSE_m_wvalid ),
.m_axi_wready ( gTSE_m_wready ),
.m_axi_wlast ( gTSE_m_wlast ),
.m_axi_wstrb ( gTSE_m_wstrb ),
.m_axi_wdata ( gTSE_m_wdata ),
.m_axi_bvalid ( gTSE_m_bvalid ),
.m_axi_bready ( gTSE_m_bready ),
.m_axi_bresp ( gTSE_m_bresp ),
.m_axi_bid ( {TSE_DEV{8'h00}} ),
.m_axi_arvalid ( gTSE_m_arvalid ),
.m_axi_araddr ( gTSE_m_araddr ),
.m_axi_arlock ( ),
.m_axi_arready ( gTSE_m_arready ),
.m_axi_rvalid ( gTSE_m_rvalid ),
.m_axi_rready ( gTSE_m_rready ),
.m_axi_rid ( {TSE_DEV{8'h00}} ),
.m_axi_rdata ( gTSE_m_rdata ),
.m_axi_rlast ( gTSE_m_rlast ),
.m_axi_rresp ( gTSE_m_rresp )
);
assign s_axi_rlast = 1'b1;
assign gTSE_m_wlast = 2'b11;
assign gTSE_m_rlast = 2'b11;
gTSE_streamControl #(
.ADDR_WIDTH (ADDR_WIDTH)
) u_gTSE_streamControl (
.s_axi_aclk ( io_peripheralClk ),
.s_axi_aresetn ( ~io_peripheralReset ),
.s_axi_awaddr ( gTSE_m_awaddr[CMN*32 +: ADDR_WIDTH] ),
.s_axi_awvalid ( gTSE_m_awvalid[CMN*1 +: 1] ),
.s_axi_awready ( gTSE_m_awready[CMN*1 +: 1] ),
.s_axi_wdata ( gTSE_m_wdata[CMN*32 +: 32] ),
.s_axi_wvalid ( gTSE_m_wvalid[CMN*1 +: 1] ),
.s_axi_wready ( gTSE_m_wready[CMN*1 +: 1] ),
.s_axi_bvalid ( gTSE_m_bvalid[CMN*1 +: 1] ),
.s_axi_bready ( gTSE_m_bready[CMN*1 +: 1 ]),
.s_axi_bresp ( gTSE_m_bresp[CMN*2 +: 2] ),
.s_axi_araddr ( gTSE_m_araddr[CMN*32 +: ADDR_WIDTH] ),
.s_axi_arvalid ( gTSE_m_arvalid[CMN*1 +: 1] ),
.s_axi_arready ( gTSE_m_arready[CMN*1 +: 1] ),
.s_axi_rdata ( gTSE_m_rdata[CMN*32 +: 32] ),
.s_axi_rvalid ( gTSE_m_rvalid[CMN*1 +: 1] ),
.s_axi_rready ( gTSE_m_rready[CMN*1 +: 1] ),
.s_axi_rresp ( gTSE_m_rresp[CMN*2 +: 2] ),
.mac_ext_rst ( mac_ext_rst || mac_sw_rst ),
.s_eth_tx_clk ( tx_axis_clk ),
.s_eth_tx_tvalid ( s_eth_tx_tvalid ),
.s_eth_tx_tready ( s_eth_tx_tready ),
.s_eth_tx_tdata ( s_eth_tx_tdata ),
.s_eth_tx_tkeep ( s_eth_tx_tkeep ),
.s_eth_tx_tdest ( s_eth_tx_tdest ),
.s_eth_tx_tlast ( s_eth_tx_tlast ),
.m_eth_tx_tvalid ( m_eth_tx_tvalid ),
.m_eth_tx_tready ( m_eth_tx_tready ),
.m_eth_tx_tdata ( m_eth_tx_tdata ),
.m_eth_tx_tdest ( m_eth_tx_tdest ),
.m_eth_tx_tlast ( m_eth_tx_tlast ),
.mac_sw_rst ( mac_sw_rst ),
.phy_sw_rst ( phy_sw_rst ),
.dma_rx_rst ( dma_rx_rst ),
.dma_tx_rst ( dma_tx_rst ),
.error ( ),
.dma_descriptor_update (dma_tx_descriptorUpdate)
);
wire lso_eth_tx_tvalid;
wire lso_eth_tx_tready;
wire [7:0] lso_eth_tx_tdata;
wire lso_eth_tx_tlast;
MacTxLso lso0
(
.io_input_valid(m_eth_tx_tvalid),
.io_input_ready(m_eth_tx_tready),
.io_input_payload_last(m_eth_tx_tlast),
.io_input_payload_fragment_data(m_eth_tx_tdata),
.io_output_valid(lso_eth_tx_tvalid),
.io_output_ready(lso_eth_tx_tready),
.io_output_payload_last(lso_eth_tx_tlast),
.io_output_payload_fragment_data(lso_eth_tx_tdata),
.clk(tx_axis_clk),
.reset(mac_ext_srst)
);
wire rx0_eth_rx_tvalid;
wire rx0_eth_rx_tready;
wire [7:0] rx0_eth_rx_tdata;
wire rx0_eth_rx_tlast;
MacRxCheckSumChecker rx0
(
.io_input_valid(rx0_eth_rx_tvalid),
.io_input_ready(rx0_eth_rx_tready),
.io_input_payload_last(rx0_eth_rx_tlast),
.io_input_payload_fragment_error(1'b0),
.io_input_payload_fragment_data(rx0_eth_rx_tdata),
.io_output_valid(s_eth_rx_tvalid),
.io_output_ready(s_eth_rx_tready),
.io_output_payload_last(s_eth_rx_tlast),
.io_output_payload_fragment_error(),
.io_output_payload_fragment_data(s_eth_rx_tdata),
.clk(rgmii_rxc),
.reset(mac_ext_srst)
);
gTSE u_gTSE (
.mac_reset ( mac_ext_srst ),
.proto_reset ( mac_ext_srst || proto_reset ),
.tx_mac_aclk ( io_tseClk ),
.rx_mac_aclk (),
.eth_speed ( eth_speed ),
// MAC RX
.rx_axis_clk ( rgmii_rxc ),
.rx_axis_mac_tdata ( rx0_eth_rx_tdata ),
.rx_axis_mac_tvalid ( rx0_eth_rx_tvalid ),
.rx_axis_mac_tstrb ( s_eth_rx_tstrb ),
.rx_axis_mac_tlast ( rx0_eth_rx_tlast ),
.rx_axis_mac_tuser ( ),
.rx_axis_mac_tready ( rx0_eth_rx_tready ),
// MAC TX
.tx_axis_clk ( tx_axis_clk ),
.tx_axis_mac_tdata ( lso_eth_tx_tdata ),
.tx_axis_mac_tvalid ( lso_eth_tx_tvalid ),
.tx_axis_mac_tstrb ( 1'b1 ),
.tx_axis_mac_tlast ( lso_eth_tx_tlast ),
.tx_axis_mac_tuser ( 1'b0 ),
.tx_axis_mac_tready ( lso_eth_tx_tready ),
// AXI CSR
.s_axi_aclk ( io_peripheralClk ),
.s_axi_awaddr ( gTSE_m_awaddr[MAC*32 +: ADDR_WIDTH] ),
.s_axi_awvalid ( gTSE_m_awvalid[MAC*1 +:1 ] ),
.s_axi_awready ( gTSE_m_awready[MAC*1 +: 1] ),
.s_axi_wdata ( gTSE_m_wdata[MAC*32 +: 32] ),
.s_axi_wvalid ( gTSE_m_wvalid[MAC*1 +: 1] ),
.s_axi_wready ( gTSE_m_wready[MAC*1 +: 1] ),
.s_axi_bresp ( gTSE_m_bresp[MAC*2 +: 2] ),
.s_axi_bvalid ( gTSE_m_bvalid[MAC*1 +: 1] ),
.s_axi_bready ( gTSE_m_bready[MAC*1 +: 1] ),
.s_axi_araddr ( gTSE_m_araddr[MAC*32 +: ADDR_WIDTH] ),
.s_axi_arvalid ( gTSE_m_arvalid[MAC*1 +: 1] ),
.s_axi_arready ( gTSE_m_arready[MAC*1 +: 1] ),
.s_axi_rresp ( gTSE_m_rresp[MAC*2 +: 2] ),
.s_axi_rdata ( gTSE_m_rdata[MAC*32 +: 32] ),
.s_axi_rvalid ( gTSE_m_rvalid[MAC*1 +: 1] ),
.s_axi_rready ( gTSE_m_rready[MAC*1 +: 1] ),
// RGMII
.rgmii_txd_HI ( rgmii_txd_HI ),
.rgmii_txd_LO ( rgmii_txd_LO ),
.rgmii_tx_ctl_HI ( rgmii_tx_ctl_HI ),
.rgmii_tx_ctl_LO ( rgmii_tx_ctl_LO ),
.rgmii_txc_HI ( rgmii_txc_HI ),
.rgmii_txc_LO ( rgmii_txc_LO ),
.rgmii_rxd_HI ( rgmii_rxd_HI ),
.rgmii_rxd_LO ( rgmii_rxd_LO ),
.rgmii_rx_ctl_HI ( rgmii_rx_ctl_HI ),
.rgmii_rx_ctl_LO ( rgmii_rx_ctl_LO ),
.rgmii_rxc ( rgmii_rxc ),
// MDIO
.Mdo ( phy_mdo ),
.MdoEn ( phy_mdo_en ),
.Mdi ( phy_mdi ),
.Mdc ( phy_mdc )
);
assign m_eth_rx_tvalid = s_eth_rx_tvalid;
assign m_eth_rx_tdata = s_eth_rx_tdata;
assign m_eth_rx_tkeep = 1'b1;
assign m_eth_rx_tlast = s_eth_rx_tlast;
assign s_eth_rx_tready = m_eth_rx_tready;
endmodule
module gTSE_streamControl#(
parameter ADDR_WIDTH = 10,
parameter NUM_REG = 5,
parameter NUM_FRAME = 10,
parameter MAC_RX_CLK_FREQ = 100,
parameter COALESCE_US = 4000
)
(
input s_axi_aclk, //AXI Bus Clock.
input s_axi_aresetn, //AXI Reset. Active-Low.
input [ADDR_WIDTH-1:0] s_axi_awaddr, //Write Address. byte address.
input s_axi_awvalid, //Write address valid.
output reg s_axi_awready, //Write address ready.
input [31:0] s_axi_wdata, //Write data bus.
input s_axi_wvalid, //Write valid.
output reg s_axi_wready, //Write ready.
output wire [1:0] s_axi_bresp, //Write response.
output reg s_axi_bvalid, //Write response valid.
input s_axi_bready, //Response ready.
input [ADDR_WIDTH-1:0] s_axi_araddr, //Read address. byte address.
input s_axi_arvalid, //Read address valid.
output reg s_axi_arready, //Read address ready.
output wire [1:0] s_axi_rresp, //Read response.
output reg [31:0] s_axi_rdata, //Read data.
output reg s_axi_rvalid, //Read valid.
input s_axi_rready, //Read ready.
input s_eth_tx_clk,
input s_eth_tx_tvalid,
output s_eth_tx_tready,
input [7:0] s_eth_tx_tdata,
input [0:0] s_eth_tx_tkeep,
input [3:0] s_eth_tx_tdest,
input s_eth_tx_tlast,
output m_eth_tx_tvalid,
input m_eth_tx_tready,
output [7:0] m_eth_tx_tdata,
output [3:0] m_eth_tx_tdest,
output m_eth_tx_tlast,
input mac_ext_rst,
output reg mac_sw_rst,
output reg phy_sw_rst,
output reg dma_rx_rst,
output reg dma_tx_rst,
output reg error,
input dma_descriptor_update
);
// Parameter Define
localparam DATA_DEPTH = NUM_FRAME*1540;
localparam SIZE_DEPTH = NUM_FRAME*5;
localparam DATA_DEPTH_WID = $clog2(DATA_DEPTH);
localparam SIZE_DEPTH_WID = $clog2(SIZE_DEPTH);
localparam COALESCE_CNT = (COALESCE_US * MAC_RX_CLK_FREQ);
// Register Define
// Cfg Space Registers
// Other Registers
reg [ADDR_WIDTH-3:0] loc_waddr;
reg loc_waddr_vld;
reg [31:0] loc_wdata;
reg loc_wdata_vld;
reg [ADDR_WIDTH-3:0] loc_raddr;
reg loc_raddr_vld;
// Wire Define
wire loc_wrdy;
wire loc_rrdy;
wire w_eth_mac_rst;
wire [9:0] w_trans_rdcnt;
wire w_trans_rst_busy;
wire w_trans_full;
wire w_trans_empty;
wire [12:0] w_txdata_rd_datacount;
wire w_tx_full;
wire w_tx_empty;
wire w_eth_tx_tlast;
wire w_eth_tx_tkeep;
wire [3:0] w_eth_tx_tdest;
wire [7:0] w_eth_tx_tdata;
reg r_eth_tx_tlast;
reg [3:0] r_eth_tx_tdest;
reg [7:0] r_eth_tx_tdata;
reg r_eth_tx_tvalid;
wire w_rd_en;
reg [15:0] write_cnt;
wire [15:0] write_cnt_rd;
wire [15:0] write_cnt_next;
reg [15:0] read_cnt;
reg [1:0] rd_state;
reg [1:0] next_rd_state;
/*----------------------------------------------------------------------------------*\
The main code
\*----------------------------------------------------------------------------------*/
//axi4-lite interface
always @(posedge s_axi_aclk or negedge s_axi_aresetn)
begin
if(s_axi_aresetn == 1'b0)
loc_waddr <= {ADDR_WIDTH-2{1'b0}};
else if((s_axi_awvalid == 1'b1) && (s_axi_awready == 1'b1))
loc_waddr <= s_axi_awaddr[2+:ADDR_WIDTH-2];
end
always @(posedge s_axi_aclk or negedge s_axi_aresetn)
begin
if(s_axi_aresetn == 1'b0)
loc_waddr_vld <= 1'b0;
else if((s_axi_awvalid == 1'b1) && (s_axi_awready == 1'b1))
loc_waddr_vld <= 1'b1;
else if((loc_waddr_vld == 1'b1) && (loc_wdata_vld == 1'b1) && (loc_wrdy == 1'b1))
loc_waddr_vld <= 1'b0;
end
assign loc_wrdy = 1'b1;
always @(posedge s_axi_aclk or negedge s_axi_aresetn)
begin
if(s_axi_aresetn == 1'b0)
s_axi_awready <= 1'b0;
else if((s_axi_awvalid == 1'b1) && (s_axi_awready == 1'b1))
s_axi_awready <= 1'b0;
else if(loc_waddr_vld == 1'b0)
s_axi_awready <= 1'b1;
end
always @(posedge s_axi_aclk or negedge s_axi_aresetn)
begin
if(s_axi_aresetn == 1'b0)
loc_wdata <= 32'h0;
else if((s_axi_wvalid == 1'b1) && (s_axi_wready == 1'b1))
loc_wdata <= s_axi_wdata;
end
always @(posedge s_axi_aclk or negedge s_axi_aresetn)
begin
if(s_axi_aresetn == 1'b0)
loc_wdata_vld <= 1'b0;
else if((s_axi_wvalid == 1'b1) && (s_axi_wready == 1'b1))
loc_wdata_vld <= 1'b1;
else if((loc_waddr_vld == 1'b1) && (loc_wdata_vld == 1'b1) && (loc_wrdy == 1'b1))
loc_wdata_vld <= 1'b0;
end
always @(posedge s_axi_aclk or negedge s_axi_aresetn)
begin
if(s_axi_aresetn == 1'b0)
s_axi_wready <= 1'b0;
else if((s_axi_wvalid == 1'b1) && (s_axi_wready == 1'b1))
s_axi_wready <= 1'b0;
else if(loc_wdata_vld == 1'b0)
s_axi_wready <= 1'b1;
end
always @(posedge s_axi_aclk or negedge s_axi_aresetn)
begin
if(s_axi_aresetn == 1'b0)
s_axi_bvalid <= 1'b0;
else if((loc_waddr_vld == 1'b1) && (loc_wdata_vld == 1'b1) && (loc_wrdy == 1'b1))
s_axi_bvalid <= 1'b1;
else if(s_axi_bready == 1'b1)
s_axi_bvalid <= 1'b0;
end
assign s_axi_bresp = 2'h0;
always @(posedge s_axi_aclk or negedge s_axi_aresetn)
begin
if(s_axi_aresetn == 1'b0)
loc_raddr <= {ADDR_WIDTH-2{1'b0}};
else if((s_axi_arvalid == 1'b1) && (s_axi_arready == 1'b1))
loc_raddr <= s_axi_araddr[2+:ADDR_WIDTH-2];
end
always @(posedge s_axi_aclk or negedge s_axi_aresetn)
begin
if(s_axi_aresetn == 1'b0)
loc_raddr_vld <= 1'b0;
else if((s_axi_arvalid == 1'b1) && (s_axi_arready == 1'b1))
loc_raddr_vld <= 1'b1;
else if((loc_raddr_vld == 1'b1) && (loc_rrdy == 1'b1))
loc_raddr_vld <= 1'b0;
end
assign loc_rrdy = 1'b1;
always @(posedge s_axi_aclk or negedge s_axi_aresetn)
begin
if(s_axi_aresetn == 1'b0)
s_axi_arready <= 1'b0;
else if((s_axi_arvalid == 1'b1) && (s_axi_arready == 1'b1))
s_axi_arready <= 1'b0;
else if(loc_raddr_vld == 1'b0)
s_axi_arready <= 1'b1;
end
always @(posedge s_axi_aclk or negedge s_axi_aresetn)
begin
if(s_axi_aresetn == 1'b0)
s_axi_rdata <= 32'h0;
else if((loc_raddr_vld == 1'b1) && (loc_rrdy == 1'b1))
begin
case(loc_raddr)
//Base Configuration Registers Field
'h080:s_axi_rdata <= {31'd0, mac_sw_rst};
'h081:s_axi_rdata <= {31'd0, phy_sw_rst};
'h082:s_axi_rdata <= {31'd0, dma_rx_rst};
'h083:s_axi_rdata <= {31'd0, dma_tx_rst};
default:s_axi_rdata <= 32'hEEEE_1111;
endcase
end
end
always @(posedge s_axi_aclk or negedge s_axi_aresetn)
begin
if(s_axi_aresetn == 1'b0)
s_axi_rvalid <= 1'b0;
else if((loc_raddr_vld == 1'b1) && (loc_rrdy == 1'b1))
s_axi_rvalid <= 1'b1;
else if(s_axi_rready == 1'b1)
s_axi_rvalid <= 1'b0;
end
assign s_axi_rresp = 2'h0;
/*----------------------------------------------------------------------------------*\
Register Space -- Base Configuration Registers Field
\*----------------------------------------------------------------------------------*/
//loc_addr = 0x000; axi_addr = 0x000; RW;
always @(posedge s_axi_aclk or negedge s_axi_aresetn)
begin
if(s_axi_aresetn == 1'b0)
begin
mac_sw_rst <= 1'b0;
end
else if((s_axi_bvalid == 1'b1) && (loc_waddr == 'h080))
begin
mac_sw_rst <= loc_wdata[0];
end
end
//loc_addr = 0x001; axi_addr = 0x004; RW;
always @(posedge s_axi_aclk or negedge s_axi_aresetn)
begin
if(s_axi_aresetn == 1'b0)
begin
phy_sw_rst <= 1'b0;
end
else if((s_axi_bvalid == 1'b1) && (loc_waddr == 'h081))
begin
phy_sw_rst <= loc_wdata[0];
end
end
//loc_addr = 0x002; axi_addr = 0x008; RW;
always @(posedge s_axi_aclk or negedge s_axi_aresetn)
begin
if(s_axi_aresetn == 1'b0)
begin
dma_rx_rst <= 1'b0;
end
else if((s_axi_bvalid == 1'b1) && (loc_waddr == 'h082))
begin
dma_rx_rst <= loc_wdata[0];
end
end
//loc_addr = 0x003; axi_addr = 0x00C; RW;
always @(posedge s_axi_aclk or negedge s_axi_aresetn)
begin
if(s_axi_aresetn == 1'b0)
begin
dma_tx_rst <= 1'b0;
end
else if((s_axi_bvalid == 1'b1) && (loc_waddr == 'h083))
begin
dma_tx_rst <= loc_wdata[0];
end
end
/*----------------------------------------------------------------------------------*\
Register Space -- The End
\*----------------------------------------------------------------------------------*/
reset #(
.IN_RST_ACTIVE ("HIGH"),
.OUT_RST_ACTIVE ("HIGH"),
.CYCLE (2)
) inst_reset (
.i_arst (mac_ext_rst),
.i_clk (s_eth_tx_clk),
.o_srst (w_eth_mac_rst)
);
assign w_rd_en = (next_rd_state == 1);
assign write_cnt_next = (s_eth_tx_tkeep ? write_cnt + 1 : write_cnt);
assign s_eth_tx_tready = !w_tx_full;
assign m_eth_tx_tvalid = rd_state != 0;
assign m_eth_tx_tdata = w_eth_tx_tdata;
assign m_eth_tx_tdest = w_eth_tx_tdest;
assign m_eth_tx_tlast = r_eth_tx_tlast;
always @(posedge s_eth_tx_clk or posedge w_eth_mac_rst)
begin
if (w_eth_mac_rst)
begin
write_cnt <= 16'd0;
end
else begin
if (s_eth_tx_tvalid && s_eth_tx_tready)
begin
if (s_eth_tx_tlast)
begin
write_cnt <= 16'd0;
end
else if (s_eth_tx_tkeep)
begin
write_cnt <= write_cnt + 1'b1;
end
end
end
end
always @(*)
begin
case (rd_state)
2'b00:
begin
if (!w_trans_empty)
begin
next_rd_state = 2'b01;
end else
begin
next_rd_state = 2'b00;
end
end
2'b01:
begin
if (!m_eth_tx_tready)
begin
next_rd_state = 2'b10;
end else if (m_eth_tx_tlast)
begin
next_rd_state = 2'b00;
end else
begin
next_rd_state = 2'b01;
end
end
2'b10:
begin
if (m_eth_tx_tvalid && m_eth_tx_tready)
begin
if (m_eth_tx_tlast)
next_rd_state = 2'b00;
else
next_rd_state = 2'b01;
end else
begin
next_rd_state = 2'b10;
end
end
default:
begin
next_rd_state = 2'b00;
end
endcase
end
always @(posedge s_eth_tx_clk or posedge w_eth_mac_rst)
begin
if (w_eth_mac_rst)
begin
rd_state = 2'b00;
read_cnt = 16'd0;
r_eth_tx_tlast <= 1'b0;
end
else
begin
rd_state <= next_rd_state;
if (next_rd_state == 2'b00)
begin
read_cnt <= 16'd0;
r_eth_tx_tlast <= 1'b0;
end
else
begin
if (w_rd_en)
begin
read_cnt <= read_cnt + 1'b1;
if ((read_cnt + 1'b1) == write_cnt_rd)
begin
r_eth_tx_tlast <= 1'b1;
end
end
end
end
end
gTSE_core_fifo_data u_standard_tx_fifo_trans (
.a_rst_i (w_eth_mac_rst),
.wr_clk_i (s_eth_tx_clk),
.wr_en_i (s_eth_tx_tvalid && s_eth_tx_tready && s_eth_tx_tkeep),
.wdata ({s_eth_tx_tkeep,s_eth_tx_tdest, s_eth_tx_tdata}),
.rd_clk_i (s_eth_tx_clk),
.rd_en_i (w_rd_en),
.rdata ({w_eth_tx_tkeep, w_eth_tx_tdest, w_eth_tx_tdata}),
.full_o (w_tx_full),
.empty_o (w_tx_empty),
.wr_datacount_o (),
.rd_datacount_o (w_txdata_rd_datacount),
.rst_busy (w_tx_size_busy)
);
gTSE_core_fifo_ctrl u_fwft_tx_fifo_data (
.a_rst_i (w_eth_mac_rst),
.wr_clk_i (s_eth_tx_clk),
.wr_en_i (s_eth_tx_tvalid && s_eth_tx_tready && s_eth_tx_tlast),
.wdata (write_cnt_next),
.rd_clk_i (s_eth_tx_clk),
.rd_en_i (m_eth_tx_tvalid && m_eth_tx_tready && m_eth_tx_tlast),
.rdata (write_cnt_rd),
.full_o (w_trans_full),
.empty_o (w_trans_empty),
.wr_datacount_o (),
.rd_datacount_o (w_trans_rdcnt),
.rst_busy (w_trans_rst_busy)
);
always @(posedge s_eth_tx_clk or posedge w_eth_mac_rst)
begin
if (w_eth_mac_rst)
begin
error <= 1'b0;
end else
begin
if ((w_trans_full && s_eth_tx_tvalid && s_eth_tx_tready && s_eth_tx_tlast ) || w_trans_rst_busy || (w_trans_empty && w_rd_en))
error <= 1'b1;
end
end
endmodule
////////////////////////////////////////////////////////////////////////////////////////////
module reset
#(
parameter IN_RST_ACTIVE = "LOW",
parameter OUT_RST_ACTIVE = "HIGH",
parameter CYCLE = 1
)
(
input i_arst,
input i_clk,
output o_srst
);
(* async_reg = "true" *) reg [CYCLE-1:0]r_srst_1P;
genvar i;
generate
if (IN_RST_ACTIVE == "LOW")
begin
if (OUT_RST_ACTIVE == "LOW")
begin
always@(negedge i_arst or posedge i_clk)
begin
if (~i_arst)
r_srst_1P[0] <= 1'b0;
else
r_srst_1P[0] <= 1'b1;
end
for (i=0; i<CYCLE-1; i=i+1)
begin
always@(negedge i_arst or posedge i_clk)
begin
if (~i_arst)
r_srst_1P[i+1] <= 1'b0;
else
r_srst_1P[i+1] <= r_srst_1P[i];
end
end
end
else
begin
always@(negedge i_arst or posedge i_clk)
begin
if (~i_arst)
r_srst_1P[0] <= 1'b1;
else
r_srst_1P[0] <= 1'b0;
end
for (i=0; i<CYCLE-1; i=i+1)
begin
always@(negedge i_arst or posedge i_clk)
begin
if (~i_arst)
r_srst_1P[i+1] <= 1'b1;
else
r_srst_1P[i+1] <= r_srst_1P[i];
end
end
end
end
else
begin
if (OUT_RST_ACTIVE == "LOW")
begin
always@(posedge i_arst or posedge i_clk)
begin
if (i_arst)
r_srst_1P[0] <= 1'b0;
else
r_srst_1P[0] <= 1'b1;
end
for (i=0; i<CYCLE-1; i=i+1)
begin
always@(posedge i_arst or posedge i_clk)
begin
if (i_arst)
r_srst_1P[i+1] <= 1'b0;
else
r_srst_1P[i+1] <= r_srst_1P[i];
end
end
end
else
begin
always@(posedge i_arst or posedge i_clk)
begin
if (i_arst)
r_srst_1P[0] <= 1'b1;
else
r_srst_1P[0] <= 1'b0;
end
for (i=0; i<CYCLE-1; i=i+1)
begin
always@(posedge i_arst or posedge i_clk)
begin
if (i_arst)
r_srst_1P[i+1] <= 1'b1;
else
r_srst_1P[i+1] <= r_srst_1P[i];
end
end
end
end
endgenerate
assign o_srst = r_srst_1P[CYCLE-1];
endmodule
module reset_ctrl
#(
parameter NUM_RST = 1,
parameter CYCLE = 1,
parameter IN_RST_ACTIVE = 1'b1,
parameter OUT_RST_ACTIVE = 1'b1
)
(
input [NUM_RST-1:0] i_arst,
input [NUM_RST-1:0] i_clk,
output [NUM_RST-1:0] o_srst
);
genvar i;
generate
for (i=0; i<NUM_RST; i=i+1)
begin
if (IN_RST_ACTIVE & (1'b1 << i))
begin
if (OUT_RST_ACTIVE & (1'b1 << i))
begin
reset
#(
.IN_RST_ACTIVE ("HIGH"),
.OUT_RST_ACTIVE ("HIGH"),
.CYCLE (CYCLE)
)
inst_sysclk_rstn
(
.i_arst (i_arst[i]),
.i_clk (i_clk[i]),
.o_srst (o_srst[i])
);
end
else
begin
reset
#(
.IN_RST_ACTIVE ("HIGH"),
.OUT_RST_ACTIVE ("LOW"),
.CYCLE (CYCLE)
)
inst_sysclk_rstn
(
.i_arst (i_arst[i]),
.i_clk (i_clk[i]),
.o_srst (o_srst[i])
);
end
end
else
begin
if (OUT_RST_ACTIVE & (1'b1 << i))
begin
reset
#(
.IN_RST_ACTIVE ("LOW"),
.OUT_RST_ACTIVE ("HIGH"),
.CYCLE (CYCLE)
)
inst_sysclk_rstn
(
.i_arst (i_arst[i]),
.i_clk (i_clk[i]),
.o_srst (o_srst[i])
);
end
else
begin
reset
#(
.IN_RST_ACTIVE ("LOW"),
.OUT_RST_ACTIVE ("LOW"),
.CYCLE (CYCLE)
)
inst_sysclk_rstn
(
.i_arst (i_arst[i]),
.i_clk (i_clk[i]),
.o_srst (o_srst[i])
);
end
end
end
endgenerate
endmodule
////////////////////////////////////////////////////////////////////////////////////////////