`include "system_conf.v" `include "lm32/lm32_cpu.v" `include "lm32/lm32_top.v" `include "lm32/lm32_adder.v" `include "lm32/lm32_instruction_unit.v" `include "lm32/lm32_decoder.v" `include "lm32/lm32_logic_op.v" `include "lm32/lm32_load_store_unit.v" `include "lm32/lm32_interrupt.v" `ifdef LM32_MC_ARITHMETIC_ENABLED `include "lm32/lm32_mc_arithmetic.v" `endif `ifdef CFG_PL_BARREL_SHIFT_ENABLED `include "lm32/lm32_shifter.v" `endif /* `ifdef CFG_PL_MULTIPLY_ENABLED `include "../components/lm32_top/rtl/verilog/lm32_multiplier.v" `endif */ `include "ebr/scratchpad.v" `include "ebr/bootrom.v" `include "uart/uart_core.v" module ems16_top ( output sys_LED1, output sys_LED2, input console_RX, output console_TX, output tp1, output tp2, output [19:0] isa_A ); // Run internal RC reference through PLL and use inverted lock status // for a make-shift power-on reset. Shift the tapped 24.18 reference // up 2x to a 48.36 MHz functional clock used for GPIO and other // async operations. wire rc_CLK; defparam OSCH_inst.NOM_FREQ = "24.18"; OSCH OSCH_inst (.OSC(rc_CLK), .SEDSTDBY(), .STDBY(1'b0)); wire sys_CLK; wire sys_CLK_LOCK; pll_reset pll_reset ( .CLKI(rc_CLK), .CLKOP(), .LOCK(sys_CLK_LOCK) ); wire sys_RESET; assign sys_RESET = !sys_CLK_LOCK; assign sys_CLK = rc_CLK; // Lattice Mico32 processor as an EMS action co-processor wire [31:0] coprocI_ADR; wire [31:0] coprocI_DAT_O; wire [31:0] coprocI_DAT_I; wire [3:0] coprocI_SEL; wire coprocI_WE; wire coprocI_ACK; wire coprocI_ERR; wire coprocI_RTY; wire [2:0] coprocI_CTI; wire [1:0] coprocI_BTE; wire coprocI_LOCK; wire coprocI_CYC; wire coprocI_STB; wire [31:0] coprocD_ADR; wire [31:0] coprocD_DAT_O; wire [31:0] coprocD_DAT_I; wire [3:0] coprocD_SEL; wire coprocD_WE; wire coprocD_ACK; wire coprocD_ERR; wire coprocD_RTY; wire [2:0] coprocD_CTI; wire [1:0] coprocD_BTE; wire coprocD_LOCK; wire coprocD_CYC; wire coprocD_STB; wire [31:0] coproc_IRQn; lm32_top coproc ( .clk_i (sys_CLK), .rst_i (sys_RESET), // Instruction fetch bus .I_ADR_O (coprocI_ADR), .I_DAT_O (coprocI_DAT_O), .I_DAT_I (coprocI_DAT_I), .I_SEL_O (coprocI_SEL), .I_WE_O (coprocI_WE), .I_ACK_I (coprocI_ACK), .I_ERR_I (coprocI_ERR), .I_RTY_I (coprocI_RTY), .I_CTI_O (coprocI_CTI), .I_BTE_O (coprocI_BTE), .I_LOCK_O (coprocI_LOCK), .I_CYC_O (coprocI_CYC), .I_STB_O (coprocI_STB), // Data bus .D_ADR_O (coprocD_ADR), .D_DAT_O (coprocD_DAT_O), .D_DAT_I (coprocD_DAT_I), .D_SEL_O (coprocD_SEL), .D_WE_O (coprocD_WE), .D_ACK_I (coprocD_ACK), .D_ERR_I (coprocD_ERR), .D_RTY_I (coprocD_RTY), .D_CTI_O (coprocD_CTI), .D_BTE_O (coprocD_BTE), .D_LOCK_O (coprocD_LOCK), .D_CYC_O (coprocD_CYC), .D_STB_O (coprocD_STB), // Unused .DEBUG_ADR_I (), .DEBUG_DAT_I (), .DEBUG_DAT_O (), .DEBUG_SEL_I (), .DEBUG_WE_I (), .DEBUG_ACK_O (), .DEBUG_ERR_O (), .DEBUG_RTY_O (), .DEBUG_CTI_I (), .DEBUG_BTE_I (), .DEBUG_LOCK_I (), .DEBUG_CYC_I (1'b0), .DEBUG_STB_I (1'b0), // 32 Interrupt request lines .interrupt_n(coproc_IRQn) ); // Instruction bus peripherals wire [31:0] bootrom_DAT; wire bootrom_ACK; wire bootrom_ERR; wire bootrom_RTY; bootrom_ebr bootrom ( .Reset (sys_RESET), .WrClock (sys_CLK), .RdClock (sys_CLK), .WrClockEn (1'b0), .RdClockEn (coprocI_CYC & coprocI_STB), .RdAddress (coprocI_ADR[13:2]), .WrAddress (12'b000000000000), .Data (), .WE (1'b0), .Q (bootrom_DAT) ); /* bootrom bootrom ( .CLK_I (sys_CLK), .RST_I (sys_RESET), .EBR_ADR_I (coprocI_ADR[31:2]), .EBR_DAT_I (coprocI_DAT_O), .EBR_DAT_O (bootrom_DAT), .EBR_SEL_I (coprocI_SEL), .EBR_WE_I (coprocI_WE), .EBR_ACK_O (bootrom_ACK), .EBR_ERR_O (bootrom_ERR), .EBR_RTY_O (bootrom_RTY), .EBR_CTI_I (coprocI_CTI), .EBR_BTE_I (coprocI_BTE), .EBR_LOCK_I (coprocI_LOCK), .EBR_CYC_I (coprocI_CYC), .EBR_STB_I (coprocI_STB) ); */ assign coprocI_DAT_I = bootrom_DAT; assign coprocI_ERR = 1'b0;//coprocI_CYC & bootrom_ERR; assign coprocI_ACK = 1'b1;//bootrom_ACK; assign coprocI_RTY = 1'b0;//bootrom_RTY; assign tp1 = coprocI_CYC & coprocI_STB; assign tp2 = coprocI_ADR[2]; assign isa_A = coprocI_ADR[19:0]; /* // Data bus peripherals wire [31:0] scratchpad_DAT; wire scratchpad_ACK; wire scratchpad_ERR; wire scratchpad_RTY; wire scratchpad_EN; assign scratchpad_EN = (coprocD_ADR[31:12] == 20'b00000000_00000000_0000); scratchpad scratchpad ( .CLK_I (sys_CLK), .RST_I (sys_RESET), .EBR_ADR_I (coprocD_ADR), .EBR_DAT_I (coprocD_DAT_O), .EBR_DAT_O (scratchpad_DAT), .EBR_SEL_I (coprocD_SEL), .EBR_WE_I (coprocD_WE), .EBR_ACK_O (scratchpad_ACK), .EBR_ERR_O (scratchpad_ERR), .EBR_RTY_O (scratchpad_RTY), .EBR_CTI_I (coprocD_CTI), .EBR_BTE_I (coprocD_BTE), .EBR_LOCK_I (coprocD_LOCK), .EBR_CYC_I (coprocD_CYC & scratchpad_EN), .EBR_STB_I (coprocD_STB & scratchpad_EN) ); */ wire [7:0] console_DAT; wire console_ACK; wire console_ERR; wire console_RTY; wire console_EN; wire console_IRQ; assign console_EN = (coprocD_ADR[31:4] == 28'b10000000_00000000_00000000_0000); uart_core #( .UART_WB_DAT_WIDTH(8), .UART_WB_ADR_WIDTH(4), .CLK_IN_MHZ(48.36), .BAUD_RATE(115200), .STDOUT_SIM(0), .STDOUT_SIMFAST(0), .LCR_DATA_BITS(8), .LCR_STOP_BITS(1), .LCR_PARITY_ENABLE(0), .LCR_PARITY_ODD(0), .LCR_PARITY_STICK(0), .LCR_SET_BREAK(0), .FIFO(0) ) console ( .CLK (sys_CLK), .RESET (sys_RESET), .UART_ADR_I (coprocD_ADR[3:0]), .UART_DAT_I (coprocD_DAT_O[31:24]), .UART_DAT_O (console_DAT), .UART_SEL_I (coprocD_SEL[3]), .UART_WE_I (coprocD_WE), .UART_ACK_O (console_ACK), .UART_ERR_O (console_ERR), .UART_RTY_O (console_RTY), .UART_CTI_I (coprocD_CTI), .UART_BTE_I (coprocD_BTE), .UART_LOCK_I (coprocD_LOCK), .UART_CYC_I (coprocD_CYC),// & console_EN), .UART_STB_I (coprocD_STB),// & console_EN), .SIN (console_RX), .SOUT (console_TX), .INTR (console_IRQ) ); // Data bus peripheral routing assign coprocD_DAT_I = {4{console_DAT}}; /* scratchpad_EN ? scratchpad_DAT : console_EN ? {4{console_DAT}} : 0; */ /* assign coprocD_ERR = coprocD_CYC & !( (scratchpad_EN & !scratchpad_ERR) | (console_EN & !console_ERR) | 0); */ assign coprocD_ERR = coprocD_CYC & console_ERR; assign coprocD_ACK = console_ACK; /* scratchpad_EN ? scratchpad_ACK : console_EN ? console_ACK : 0; */ assign coprocD_RTY = console_RTY; /* scratchpad_EN ? scratchpad_RTY : console_EN ? console_RTY : 0; */ assign sys_LED1 = 1'b1; assign sys_LED2 = 1'b0; // Co-processor IRQ assignments assign coproc_IRQn[0] = !console_IRQ; assign coproc_IRQn[1] = 1; assign coproc_IRQn[2] = 1; assign coproc_IRQn[3] = 1; assign coproc_IRQn[4] = 1; assign coproc_IRQn[5] = 1; assign coproc_IRQn[6] = 1; assign coproc_IRQn[7] = 1; assign coproc_IRQn[8] = 1; assign coproc_IRQn[9] = 1; assign coproc_IRQn[10] = 1; assign coproc_IRQn[11] = 1; assign coproc_IRQn[12] = 1; assign coproc_IRQn[13] = 1; assign coproc_IRQn[14] = 1; assign coproc_IRQn[15] = 1; assign coproc_IRQn[16] = 1; assign coproc_IRQn[17] = 1; assign coproc_IRQn[18] = 1; assign coproc_IRQn[19] = 1; assign coproc_IRQn[20] = 1; assign coproc_IRQn[21] = 1; assign coproc_IRQn[22] = 1; assign coproc_IRQn[23] = 1; assign coproc_IRQn[24] = 1; assign coproc_IRQn[25] = 1; assign coproc_IRQn[26] = 1; assign coproc_IRQn[27] = 1; assign coproc_IRQn[28] = 1; assign coproc_IRQn[29] = 1; assign coproc_IRQn[30] = 1; assign coproc_IRQn[31] = 1; endmodule