nn-usb-fpga/lm32/logic/sakc/system.v

413 lines
10 KiB
Verilog

//---------------------------------------------------------------------------
// LatticeMico32 System On A Chip
//
// Top Level Design for the Xilinx Spartan 3-200 Starter Kit
//---------------------------------------------------------------------------
module system
#(
parameter bootram_file = "../firmware/cain_loader/image.ram",
// parameter bootram_file = "../firmware/boot0-serial/image.ram",
parameter clk_freq = 50000000,
parameter uart_baud_rate = 57600
) (
input clk,
// Debug
output led,
input rst,
// UART
input uart_rxd,
output uart_txd,
// CPU Interface
input [12:0] addr,
input [7:0] sram_data,
input nwe,
input noe,
input ncs
);
//------------------------------------------------------------------
// Whishbone Wires
//------------------------------------------------------------------
wire gnd = 1'b0;
wire [3:0] gnd4 = 4'h0;
wire [31:0] gnd32 = 32'h00000000;
wire [31:0] lm32i_adr,
lm32d_adr,
uart0_adr,
timer0_adr,
gpio0_adr,
bram0_adr,
sram0_adr;
wire [31:0] lm32i_dat_r,
lm32i_dat_w,
lm32d_dat_r,
lm32d_dat_w,
uart0_dat_r,
uart0_dat_w,
timer0_dat_r,
timer0_dat_w,
gpio0_dat_r,
gpio0_dat_w,
bram0_dat_r,
bram0_dat_w,
sram0_dat_w,
sram0_dat_r;
wire [3:0] lm32i_sel,
lm32d_sel,
uart0_sel,
timer0_sel,
gpio0_sel,
bram0_sel,
sram0_sel;
wire lm32i_we,
lm32d_we,
uart0_we,
timer0_we,
gpio0_we,
bram0_we,
sram0_we;
wire lm32i_cyc,
lm32d_cyc,
uart0_cyc,
timer0_cyc,
gpio0_cyc,
bram0_cyc,
sram0_cyc;
wire lm32i_stb,
lm32d_stb,
uart0_stb,
timer0_stb,
gpio0_stb,
bram0_stb,
sram0_stb;
wire lm32i_ack,
lm32d_ack,
uart0_ack,
timer0_ack,
gpio0_ack,
bram0_ack,
sram0_ack;
wire lm32i_rty,
lm32d_rty;
wire lm32i_err,
lm32d_err;
wire lm32i_lock,
lm32d_lock;
wire [2:0] lm32i_cti,
lm32d_cti;
wire [1:0] lm32i_bte,
lm32d_bte;
//---------------------------------------------------------------------------
// Interrupts
//---------------------------------------------------------------------------
wire [31:0] intr_n;
wire uart0_intr = 0;
wire [1:0] timer0_intr;
wire gpio0_intr;
assign intr_n = { 28'hFFFFFFF, ~timer0_intr[1], ~gpio0_intr, ~timer0_intr[0], ~uart0_intr };
//---------------------------------------------------------------------------
// Wishbone Interconnect
//---------------------------------------------------------------------------
wb_conbus_top #(
.s0_addr_w ( 3 ),
.s0_addr ( 3'h4 ), // sram0
.s1_addr_w ( 3 ),
.s1_addr ( 3'h5 ),
.s27_addr_w( 15 ),
.s2_addr ( 15'h0000 ), // bram0
.s3_addr ( 15'h7000 ), // uart0
.s4_addr ( 15'h7001 ), // timer0
.s5_addr ( 15'h7002 ), // gpio0
.s6_addr ( 15'h7003 ),
.s7_addr ( 15'h7004 )
) conmax0 (
.clk_i( clk ),
.rst_i( ~rst ),
// Master0
.m0_dat_i( lm32i_dat_w ),
.m0_dat_o( lm32i_dat_r ),
.m0_adr_i( lm32i_adr ),
.m0_we_i ( lm32i_we ),
.m0_sel_i( lm32i_sel ),
.m0_cyc_i( lm32i_cyc ),
.m0_stb_i( lm32i_stb ),
.m0_ack_o( lm32i_ack ),
.m0_rty_o( lm32i_rty ),
.m0_err_o( lm32i_err ),
// Master1
.m1_dat_i( lm32d_dat_w ),
.m1_dat_o( lm32d_dat_r ),
.m1_adr_i( lm32d_adr ),
.m1_we_i ( lm32d_we ),
.m1_sel_i( lm32d_sel ),
.m1_cyc_i( lm32d_cyc ),
.m1_stb_i( lm32d_stb ),
.m1_ack_o( lm32d_ack ),
.m1_rty_o( lm32d_rty ),
.m1_err_o( lm32d_err ),
// Master2
.m2_dat_i( gnd32 ),
.m2_adr_i( gnd32 ),
.m2_sel_i( gnd4 ),
.m2_cyc_i( gnd ),
.m2_stb_i( gnd ),
// Master3
.m3_dat_i( gnd32 ),
.m3_adr_i( gnd32 ),
.m3_sel_i( gnd4 ),
.m3_cyc_i( gnd ),
.m3_stb_i( gnd ),
// Master4
.m4_dat_i( gnd32 ),
.m4_adr_i( gnd32 ),
.m4_sel_i( gnd4 ),
.m4_cyc_i( gnd ),
.m4_stb_i( gnd ),
// Master5
.m5_dat_i( gnd32 ),
.m5_adr_i( gnd32 ),
.m5_sel_i( gnd4 ),
.m5_cyc_i( gnd ),
.m5_stb_i( gnd ),
// Master6
.m6_dat_i( gnd32 ),
.m6_adr_i( gnd32 ),
.m6_sel_i( gnd4 ),
.m6_cyc_i( gnd ),
.m6_stb_i( gnd ),
// Master7
.m7_dat_i( gnd32 ),
.m7_adr_i( gnd32 ),
.m7_sel_i( gnd4 ),
.m7_cyc_i( gnd ),
.m7_stb_i( gnd ),
// Slave0
.s0_dat_i( sram0_dat_r ),
.s0_dat_o( sram0_dat_w ),
.s0_adr_o( sram0_adr ),
.s0_sel_o( sram0_sel ),
.s0_we_o( sram0_we ),
.s0_cyc_o( sram0_cyc ),
.s0_stb_o( sram0_stb ),
.s0_ack_i( sram0_ack ),
.s0_err_i( gnd ),
.s0_rty_i( gnd ),
// Slave1
.s1_dat_i( gnd32 ),
.s1_ack_i( gnd ),
.s1_err_i( gnd ),
.s1_rty_i( gnd ),
// Slave2
.s2_dat_i( bram0_dat_r ),
.s2_dat_o( bram0_dat_w ),
.s2_adr_o( bram0_adr ),
.s2_sel_o( bram0_sel ),
.s2_we_o( bram0_we ),
.s2_cyc_o( bram0_cyc ),
.s2_stb_o( bram0_stb ),
.s2_ack_i( bram0_ack ),
.s2_err_i( gnd ),
.s2_rty_i( gnd ),
// Slave3
.s3_dat_i( uart0_dat_r ),
.s3_dat_o( uart0_dat_w ),
.s3_adr_o( uart0_adr ),
.s3_sel_o( uart0_sel ),
.s3_we_o( uart0_we ),
.s3_cyc_o( uart0_cyc ),
.s3_stb_o( uart0_stb ),
.s3_ack_i( uart0_ack ),
.s3_err_i( gnd ),
.s3_rty_i( gnd ),
// Slave4
.s4_dat_i( timer0_dat_r ),
.s4_dat_o( timer0_dat_w ),
.s4_adr_o( timer0_adr ),
.s4_sel_o( timer0_sel ),
.s4_we_o( timer0_we ),
.s4_cyc_o( timer0_cyc ),
.s4_stb_o( timer0_stb ),
.s4_ack_i( timer0_ack ),
.s4_err_i( gnd ),
.s4_rty_i( gnd ),
// Slave5
.s5_dat_i( gpio0_dat_r ),
.s5_dat_o( gpio0_dat_w ),
.s5_adr_o( gpio0_adr ),
.s5_sel_o( gpio0_sel ),
.s5_we_o( gpio0_we ),
.s5_cyc_o( gpio0_cyc ),
.s5_stb_o( gpio0_stb ),
.s5_ack_i( gpio0_ack ),
.s5_err_i( gnd ),
.s5_rty_i( gnd ),
// Slave6
.s6_dat_i( gnd32 ),
.s6_ack_i( gnd ),
.s6_err_i( gnd ),
.s6_rty_i( gnd ),
// Slave7
.s7_dat_i( gnd32 ),
.s7_ack_i( gnd ),
.s7_err_i( gnd ),
.s7_rty_i( gnd )
);
//---------------------------------------------------------------------------
// LM32 CPU
//---------------------------------------------------------------------------
lm32_cpu lm0 (
.clk_i( clk ),
.rst_i( ~rst ),
.interrupt_n( intr_n ),
//
.I_ADR_O( lm32i_adr ),
.I_DAT_I( lm32i_dat_r ),
.I_DAT_O( lm32i_dat_w ),
.I_SEL_O( lm32i_sel ),
.I_CYC_O( lm32i_cyc ),
.I_STB_O( lm32i_stb ),
.I_ACK_I( lm32i_ack ),
.I_WE_O ( lm32i_we ),
.I_CTI_O( lm32i_cti ),
.I_LOCK_O( lm32i_lock ),
.I_BTE_O( lm32i_bte ),
.I_ERR_I( lm32i_err ),
.I_RTY_I( lm32i_rty ),
//
.D_ADR_O( lm32d_adr ),
.D_DAT_I( lm32d_dat_r ),
.D_DAT_O( lm32d_dat_w ),
.D_SEL_O( lm32d_sel ),
.D_CYC_O( lm32d_cyc ),
.D_STB_O( lm32d_stb ),
.D_ACK_I( lm32d_ack ),
.D_WE_O ( lm32d_we ),
.D_CTI_O( lm32d_cti ),
.D_LOCK_O( lm32d_lock ),
.D_BTE_O( lm32d_bte ),
.D_ERR_I( lm32d_err ),
.D_RTY_I( lm32d_rty )
);
//---------------------------------------------------------------------------
// Block RAM
//---------------------------------------------------------------------------
wb_bram #(
.adr_width( 12 ),
.mem_file_name( bootram_file )
) bram0 (
.clk_i( clk ),
.rst_i( ~rst ),
//
.wb_adr_i( bram0_adr ),
.wb_dat_o( bram0_dat_r ),
.wb_dat_i( bram0_dat_w ),
.wb_sel_i( bram0_sel ),
.wb_stb_i( bram0_stb ),
.wb_cyc_i( bram0_cyc ),
.wb_ack_o( bram0_ack ),
.wb_we_i( bram0_we )
);
//---------------------------------------------------------------------------
// uart0
//---------------------------------------------------------------------------
wire uart0_rxd;
wire uart0_txd;
wb_uart #(
.clk_freq( clk_freq ),
.baud( uart_baud_rate )
) uart0 (
.clk( clk ),
.reset( ~rst ),
//
.wb_adr_i( uart0_adr ),
.wb_dat_i( uart0_dat_w ),
.wb_dat_o( uart0_dat_r ),
.wb_stb_i( uart0_stb ),
.wb_cyc_i( uart0_cyc ),
.wb_we_i( uart0_we ),
.wb_sel_i( uart0_sel ),
.wb_ack_o( uart0_ack ),
// .intr( uart0_intr ),
.uart_rxd( uart0_rxd ),
.uart_txd( uart0_txd )
);
//---------------------------------------------------------------------------
// timer0
//---------------------------------------------------------------------------
wb_timer #(
.clk_freq( clk_freq )
) timer0 (
.clk( clk ),
.reset( ~rst ),
//
.wb_adr_i( timer0_adr ),
.wb_dat_i( timer0_dat_w ),
.wb_dat_o( timer0_dat_r ),
.wb_stb_i( timer0_stb ),
.wb_cyc_i( timer0_cyc ),
.wb_we_i( timer0_we ),
.wb_sel_i( timer0_sel ),
.wb_ack_o( timer0_ack ),
.intr( timer0_intr )
);
//---------------------------------------------------------------------------
// General Purpose IO
//---------------------------------------------------------------------------
/*
wire [31:0] gpio0_in;
wire [31:0] gpio0_out;
wire [31:0] gpio0_oe;
wb_gpio gpio0 (
.clk( clk ),
.reset( rst ),
//
.wb_adr_i( gpio0_adr ),
.wb_dat_i( gpio0_dat_w ),
.wb_dat_o( gpio0_dat_r ),
.wb_stb_i( gpio0_stb ),
.wb_cyc_i( gpio0_cyc ),
.wb_we_i( gpio0_we ),
.wb_sel_i( gpio0_sel ),
.wb_ack_o( gpio0_ack ),
.intr( gpio0_intr ),
// GPIO
.gpio_in( gpio0_in ),
.gpio_out( gpio0_out ),
.gpio_oe( gpio0_oe )
);
*/
//----------------------------------------------------------------------------
// Mux UART wires according to sw[0]
//----------------------------------------------------------------------------
assign uart_txd = uart0_txd;
assign uart0_rxd = uart_rxd;
assign led = ~uart_txd;
endmodule