gateware

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit 667cf5d1b948c4eae5fb951af4530a337d2e8388
parent d71be0492153b0183f7a86d7a9b5817f95c60157
Author: Brian Swetland <swetland@frotz.net>
Date:   Wed, 30 Dec 2015 20:07:21 -0800

updated top file, constrains and pll config for ICE40Ultra dev board

Diffstat:
Ahdl/ice40.pcf | 18++++++++++++++++++
Ahdl/ice40.sdc | 5+++++
Mhdl/ice40.v | 123+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------
Ahdl/lattice/pll_12_25.v | 40++++++++++++++++++++++++++++++++++++++++
4 files changed, 158 insertions(+), 28 deletions(-)

diff --git a/hdl/ice40.pcf b/hdl/ice40.pcf @@ -0,0 +1,18 @@ +set_io clk12m C2 -io_std SB_LVCMOS -pullup no + +set_io vga_b[0] D6 -io_std SB_LVCMOS -pullup no +set_io vga_b[1] D5 -io_std SB_LVCMOS -pullup no +set_io vga_g[0] E3 -io_std SB_LVCMOS -pullup no +set_io vga_g[1] F3 -io_std SB_LVCMOS -pullup no +set_io vga_hsync E5 -io_std SB_LVCMOS -pullup no +set_io vga_r[0] F6 -io_std SB_LVCMOS -pullup no +set_io vga_r[1] F5 -io_std SB_LVCMOS -pullup no +set_io vga_vsync E6 -io_std SB_LVCMOS -pullup no + +set_io spi_miso F2 -io_std SB_LVCMOS -pullup no +set_io spi_mosi D1 -io_std SB_LVCMOS -pullup no +set_io spi_clk E1 -io_std SB_LVCMOS -pullup no +set_io spi_cs F1 -io_std SB_LVCMOS -pullup no + +set_io out1 B1 -io_std SB_LVCMOS -pullup no +set_io out2 B2 -io_std SB_LVCMOS -pullup no diff --git a/hdl/ice40.sdc b/hdl/ice40.sdc @@ -0,0 +1,5 @@ + +create_clock -period 83.333 -name {clk12m} [get_ports {clk12m}] + +create_clock -period 166.666 -name {x_clk} [get_ports {x_clk}] + diff --git a/hdl/ice40.v b/hdl/ice40.v @@ -4,60 +4,126 @@ `timescale 1ns / 1ps module top( - input clk, - output [15:0]trace + input clk12m, + output [1:0]vga_r, + output [1:0]vga_g, + output [1:0]vga_b, + output vga_hsync, + output vga_vsync, + input spi_mosi, + output spi_miso, + input spi_clk, + input spi_cs, + output out1, + output out2 ); -wire [15:0]waddr /* synthesis syn_keep=1 */; -wire [15:0]wdata /* synthesis syn_keep=1 */; -wire we /* synthesis syn_keep=1 */; -wire [15:0]raddr /* synthesis syn_keep=1 */; -wire [15:0]rdata /* synthesis syn_keep=1 */; -wire re /* synthesis syn_keep=1 */; +wire clk25m; + +wire [15:0]cpu_waddr /* synthesis syn_keep=1 */; +wire [15:0]cpu_wdata /* synthesis syn_keep=1 */; +wire cpu_we /* synthesis syn_keep=1 */; +wire [15:0]cpu_raddr /* synthesis syn_keep=1 */; +wire [15:0]cpu_rdata /* synthesis syn_keep=1 */; +wire cpu_re /* synthesis syn_keep=1 */; + +reg cpu_reset = 1'b0; cpu #( .RWIDTH(16), .SWIDTH(4) )cpu0( - .clk(clk), - .mem_waddr_o(waddr), - .mem_wdata_o(wdata), - .mem_wr_o(we), - .mem_raddr_o(raddr), - .mem_rdata_i(rdata), - .mem_rd_o(re) + .clk(clk25m), + .mem_waddr_o(cpu_waddr), + .mem_wdata_o(cpu_wdata), + .mem_wr_o(cpu_we), + .mem_raddr_o(cpu_raddr), + .mem_rdata_i(cpu_rdata), + .mem_rd_o(cpu_re), + .reset(cpu_reset) ) /* synthesis syn_keep=1 */; -assign trace = waddr; +wire [15:0]dbg_waddr; +wire [15:0]dbg_wdata; +wire dbg_we; + +spi_debug_ifc sdi( + .spi_clk(spi_clk), + .spi_cs_i(spi_cs), + .spi_data_i(spi_mosi), + .spi_data_o(spi_miso), + .sys_clk(clk25m), + .sys_wr_o(dbg_we), + .sys_waddr_o(dbg_waddr), + .sys_wdata_o(dbg_wdata) + ); + +// debug interface has priority over cpu writes +wire we = dbg_we | cpu_we; +wire [15:0]waddr = dbg_we ? dbg_waddr : cpu_waddr; +wire [15:0]wdata = dbg_we ? dbg_wdata : cpu_wdata; + +wire cs_sram = (waddr[15:12] == 4'h0); +wire cs_vram = (waddr[15:12] == 4'h8); +wire cs_ctrl = (waddr[15:12] == 4'hF); -wire cs0r = ~raddr[8]; +always @(posedge clk25m) begin + if (cs_ctrl & we) begin + cpu_reset <= wdata[0]; + end +end + +assign out1 = cpu_reset; +assign out2 = cpu_raddr[0]; + +wire cs0r = ~cpu_raddr[8]; +wire cs1r = cpu_raddr[8]; wire cs0w = ~waddr[8]; -wire cs1r = raddr[8]; wire cs1w = waddr[8]; wire [15:0]rdata0; wire [15:0]rdata1; -assign rdata = cs0r ? rdata0 : rdata1; +assign cpu_rdata = cs0r ? rdata0 : rdata1; sram ram0( - .clk(clk), - .raddr(raddr), + .clk(clk25m), + .raddr(cpu_raddr), .rdata(rdata0), - .re(re & cs0r), + .re(cpu_re & cs0r & cs_sram), .waddr(waddr), .wdata(wdata), - .we(we & cs0w) + .we(we & cs0w & cs_sram) ); sram ram1( - .clk(clk), - .raddr(raddr), + .clk(clk25m), + .raddr(cpu_raddr), .rdata(rdata1), - .re(re & cs0r), + .re(re & cs0r & cs_sram), .waddr(waddr), .wdata(wdata), - .we(we & cs0w) + .we(we & cs0w & cs_sram) + ); + +pll_12_25 pll0( + .REFERENCECLK(clk12m), + .PLLOUTGLOBAL(clk25m), + .PLLOUTCORE(), + .LOCK(), + .RESET(1'b1) + ); + +vga40x30x2 vga( + .clk25m(clk25m), + .red(vga_r), + .grn(vga_g), + .blu(vga_b), + .hs(vga_hsync), + .vs(vga_vsync), + .vram_waddr(waddr[10:0]), + .vram_wdata(wdata[7:0]), + .vram_we(we & cs_vram) ); endmodule @@ -82,7 +148,8 @@ SB_RAM256x16 sram_inst( .WDATA(wdata), .WCLK(clk), .WCLKE(1'b1), - .WE(we) + .WE(we), + .MASK() ); endmodule diff --git a/hdl/lattice/pll_12_25.v b/hdl/lattice/pll_12_25.v @@ -0,0 +1,40 @@ +module pll_12_25(REFERENCECLK, + PLLOUTCORE, + PLLOUTGLOBAL, + RESET, + LOCK); + +input REFERENCECLK; +input RESET; /* To initialize the simulation properly, the RESET signal (Active Low) must be asserted at the beginning of the simulation */ +output PLLOUTCORE; +output PLLOUTGLOBAL; +output LOCK; + +SB_PLL40_CORE pll_12_25_inst(.REFERENCECLK(REFERENCECLK), + .PLLOUTCORE(PLLOUTCORE), + .PLLOUTGLOBAL(PLLOUTGLOBAL), + .EXTFEEDBACK(), + .DYNAMICDELAY(), + .RESETB(RESET), + .BYPASS(1'b0), + .LATCHINPUTVALUE(), + .LOCK(LOCK), + .SDI(), + .SDO(), + .SCLK()); + +//\\ Fin=12, Fout=25; +defparam pll_12_25_inst.DIVR = 4'b0001; +defparam pll_12_25_inst.DIVF = 7'b1000010; +defparam pll_12_25_inst.DIVQ = 3'b100; +defparam pll_12_25_inst.FILTER_RANGE = 3'b001; +defparam pll_12_25_inst.FEEDBACK_PATH = "SIMPLE"; +defparam pll_12_25_inst.DELAY_ADJUSTMENT_MODE_FEEDBACK = "FIXED"; +defparam pll_12_25_inst.FDA_FEEDBACK = 4'b0000; +defparam pll_12_25_inst.DELAY_ADJUSTMENT_MODE_RELATIVE = "FIXED"; +defparam pll_12_25_inst.FDA_RELATIVE = 4'b0000; +defparam pll_12_25_inst.SHIFTREG_DIV_MODE = 2'b00; +defparam pll_12_25_inst.PLLOUT_SELECT = "GENCLK"; +defparam pll_12_25_inst.ENABLE_ICEGATE = 1'b0; + +endmodule