gateware

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

commit 6e25c2cdf5dd79b68bb872156e2fa4f025a46173
parent 3ae42169ec9e1f04bbbeda3249ea1e11bcb25d10
Author: Brian Swetland <swetland@frotz.net>
Date:   Sat, 11 Jan 2020 03:41:00 -0800

ecp5: build rules and test project for ecp5-evn board

Diffstat:
Mbuild/init.mk | 2++
Abuild/nextpnr-ecp5.mk | 69+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ahdl/ecp5_evn_hdmi111.lpf | 40++++++++++++++++++++++++++++++++++++++++
Ahdl/ecp5_evn_hdmi111.sv | 43+++++++++++++++++++++++++++++++++++++++++++
Ahdl/lattice/ecp5_pll_12_25.v | 52++++++++++++++++++++++++++++++++++++++++++++++++++++
Aproject/vga40x30-ecp5-evn-hdmi111.def | 10++++++++++
6 files changed, 216 insertions(+), 0 deletions(-)

diff --git a/build/init.mk b/build/init.mk @@ -5,8 +5,10 @@ VERILATOR := verilator NEXTPNR_ICE40 := nextpnr-ice40 +NEXTPNR_ECP5 := nextpnr-ecp5 YOSYS := yosys ICEPACK := icepack +ECPPACK := ecppack ALL_BUILDS := ALL_TARGETS := diff --git a/build/nextpnr-ecp5.mk b/build/nextpnr-ecp5.mk @@ -0,0 +1,69 @@ +## Copyright 2020 Brian Swetland <swetland@frotz.net> +## +## Licensed under the Apache License, Version 2.0 +## http://www.apache.org/licenses/LICENSE-2.0 + +PROJECT_OBJDIR := out/-nextpnr-/$(PROJECT_NAME) + +PROJECT_CONFIG := $(PROJECT_OBJDIR)/$(PROJECT_NAME)_out.config +PROJECT_LINT := $(PROJECT_OBJDIR)/$(PROJECT_NAME).lint +PROJECT_JSON := $(PROJECT_OBJDIR)/$(PROJECT_NAME).json +PROJECT_YS := $(PROJECT_OBJDIR)/$(PROJECT_NAME).ys +PROJECT_BIT := out/$(PROJECT_NAME).bit +PROJECT_SVF := out/$(PROJECT_NAME).svf + +PROJECT_VLG_SRCS := $(filter %.v %.sv,$(PROJECT_SRCS)) +PROJECT_LPF_SRCS := $(filter %.lpf,$(PROJECT_SRCS)) + +$(PROJECT_YS): _SRCS := $(PROJECT_VLG_SRCS) +$(PROJECT_YS): _JSON := $(PROJECT_JSON) +$(PROJECT_YS): $(PROJECT_SRCS) $(PROJECT_DEF) build/nextpnr-ecp5.mk + @mkdir -p $(dir $@) + @echo GENERATING: $@ + @echo verilog_defines -DHEX_PATHS -DYOSYS > $@ + @for src in $(_SRCS); do echo read_verilog -sv $$src; done >> $@ + @echo synth_ecp5 -top top -json $(_JSON) >> $@ + +$(PROJECT_LINT): _SRCS := $(PROJECT_VLG_SRCS) +$(PROJECT_LINT): $(PROJECT_SRCS) + @mkdir -p $(dir $@) + @echo LINTING: $@ + @$(VERILATOR) --top-module top --lint-only $(_SRCS) + @touch $@ + +$(PROJECT_JSON): _LOG := $(PROJECT_OBJDIR)/$(PROJECT_NAME).yosys.log +$(PROJECT_JSON): $(PROJECT_YS) $(PROJECT_LINT) + @mkdir -p $(dir $@) + @echo SYNTHESIZING: $@ + @$(YOSYS) -s $< 2>&1 | tee $(_LOG) + +$(PROJECT_CONFIG): _OPTS := $(PROJECT_NEXTPNR_OPTS) +$(PROJECT_CONFIG): _LPF := $(foreach lpf,$(PROJECT_LPF_SRCS),--lpf $(lpf)) +$(PROJECT_CONFIG): _LOG := $(PROJECT_OBJDIR)/$(PROJECT_NAME).nextpnr.log +$(PROJECT_CONFIG): _JSON := $(PROJECT_JSON) +$(PROJECT_CONFIG): $(PROJECT_JSON) $(PROJECT_LPF_SRCS) + @mkdir -p $(dir $@) + @echo PLACING-AND-ROUTING: $@ + $(NEXTPNR_ECP5) --json $(_JSON) --textcfg $@ $(_OPTS) $(_LPF) 2>&1 | tee $(_LOG) + +$(PROJECT_BIT): _CONFIG := $(PROJECT_CONFIG) +$(PROJECT_BIT): _BIT := $(PROJECT_BIT) +$(PROJECT_BIT): $(PROJECT_CONFIG) + @mkdir -p $(dir $@) + @echo GENERATING: $@ + @$(ECPPACK) $(_CONFIG) $(_BIT) + +$(PROJECT_SVF): _CONFIG := $(PROJECT_CONFIG) +$(PROJECT_SVF): _SVF := $(PROJECT_SVF) +$(PROJECT_SVF): $(PROJECT_CONFIG) + @mkdir -p $(dir $@) + @echo GENERATING: $@ + @$(ECPPACK) --svf $(_SVF) $(_CONFIG) + +$(PROJECT_NAME): $(PROJECT_BIT) + +ALL_TARGETS += $(PROJECT_NAME) +ALL_BUILDS += $(PROJECT_NAME) + +TARGET_$(PROJECT_NAME)_DESC := build ecp5 bitfile: $(PROJECT_BIT) + diff --git a/hdl/ecp5_evn_hdmi111.lpf b/hdl/ecp5_evn_hdmi111.lpf @@ -0,0 +1,40 @@ +LOCATE COMP "clk" SITE "A10"; +IOBUF PORT "clk" IO_TYPE=LVCMOS33; + +LOCATE COMP "btn" SITE "P4"; +IOBUF PORT "btn" IO_TYPE=LVCMOS33; + +LOCATE COMP "led[0]" SITE "A13"; +LOCATE COMP "led[1]" SITE "A12"; +LOCATE COMP "led[2]" SITE "B19"; +LOCATE COMP "led[3]" SITE "A18"; +LOCATE COMP "led[4]" SITE "B18"; +LOCATE COMP "led[5]" SITE "C17"; +LOCATE COMP "led[6]" SITE "A17"; +LOCATE COMP "led[7]" SITE "B17"; + +IOBUF PORT "led[0]" IO_TYPE=LVCMOS25; +IOBUF PORT "led[1]" IO_TYPE=LVCMOS25; +IOBUF PORT "led[2]" IO_TYPE=LVCMOS25; +IOBUF PORT "led[3]" IO_TYPE=LVCMOS25; +IOBUF PORT "led[4]" IO_TYPE=LVCMOS25; +IOBUF PORT "led[5]" IO_TYPE=LVCMOS25; +IOBUF PORT "led[6]" IO_TYPE=LVCMOS25; +IOBUF PORT "led[7]" IO_TYPE=LVCMOS25; + +LOCATE COMP "hdmi_g" SITE "C6"; +LOCATE COMP "hdmi_ck" SITE "C7"; +LOCATE COMP "hdmi_hs" SITE "E8"; +LOCATE COMP "hdmi_r" SITE "C8"; +LOCATE COMP "hdmi_b" SITE "B8"; +LOCATE COMP "hdmi_de" SITE "A7"; +LOCATE COMP "hdmi_vs" SITE "A8"; + +IOBUF PORT "hdmi_g" IO_TYPE=LVCMOS33; +IOBUF PORT "hdmi_ck" IO_TYPE=LVCMOS33; +IOBUF PORT "hdmi_hs" IO_TYPE=LVCMOS33; +IOBUF PORT "hdmi_r" IO_TYPE=LVCMOS33; +IOBUF PORT "hdmi_b" IO_TYPE=LVCMOS33; +IOBUF PORT "hdmi_de" IO_TYPE=LVCMOS33; +IOBUF PORT "hdmi_vs" IO_TYPE=LVCMOS33; + diff --git a/hdl/ecp5_evn_hdmi111.sv b/hdl/ecp5_evn_hdmi111.sv @@ -0,0 +1,43 @@ +module top( + input clk, + input btn, + output [7:0] led, + output hdmi_r, + output hdmi_g, + output hdmi_b, + output hdmi_hs, + output hdmi_vs, + output hdmi_de, + output hdmi_ck +); + + assign led = { 4'b1010, btn, btn, btn, btn }; + +wire clk25m; + +pll_12_25 pll( + .clk12m_in(clk), + .clk25m_out(clk25m), + .locked() +); + +assign hdmi_ck = clk25m; + +vga40x30x2 #( + .BPP(1), + .RGB(0) + )hdmi( + .clk25m(clk25m), + .red(hdmi_r), + .grn(hdmi_g), + .blu(hdmi_b), + .hs(hdmi_hs), + .vs(hdmi_vs), + .fr(), + .active(hdmi_de), + .vram_clk(clk25m), + .vram_waddr(0), + .vram_wdata(0), + .vram_we(0) + ); +endmodule diff --git a/hdl/lattice/ecp5_pll_12_25.v b/hdl/lattice/ecp5_pll_12_25.v @@ -0,0 +1,52 @@ +// $ ecppll -f pll.v -i 12.0 -o 25.0 --clkin_name clk12m_in --clkout0_name clk25m_out +// +// diamond 3.7 accepts this PLL +// diamond 3.8-3.9 is untested +// diamond 3.10 or higher is likely to abort with error about unable to use feedback signal +// cause of this could be from wrong CPHASE/FPHASE parameters +module pll_12_25 +( + input clk12m_in, // 12 MHz, 0 deg + output clk25m_out, // 24 MHz, 0 deg + output locked +); + +`ifndef verilator +(* FREQUENCY_PIN_CLKI="12" *) +(* FREQUENCY_PIN_CLKOP="24" *) +(* ICP_CURRENT="12" *) (* LPF_RESISTOR="8" *) (* MFG_ENABLE_FILTEROPAMP="1" *) (* MFG_GMCREF_SEL="2" *) +EHXPLLL #( + .PLLRST_ENA("DISABLED"), + .INTFB_WAKE("DISABLED"), + .STDBY_ENABLE("DISABLED"), + .DPHASE_SOURCE("DISABLED"), + .OUTDIVIDER_MUXA("DIVA"), + .OUTDIVIDER_MUXB("DIVB"), + .OUTDIVIDER_MUXC("DIVC"), + .OUTDIVIDER_MUXD("DIVD"), + .CLKI_DIV(1), + .CLKOP_ENABLE("ENABLED"), + .CLKOP_DIV(25), + .CLKOP_CPHASE(12), + .CLKOP_FPHASE(0), + .FEEDBK_PATH("CLKOP"), + .CLKFB_DIV(2) + ) pll_i ( + .RST(1'b0), + .STDBY(1'b0), + .CLKI(clk12i), + .CLKOP(clk25o), + .CLKFB(clk25o), + .CLKINTFB(), + .PHASESEL0(1'b0), + .PHASESEL1(1'b0), + .PHASEDIR(1'b1), + .PHASESTEP(1'b1), + .PHASELOADREG(1'b1), + .PLLWAKESYNC(1'b0), + .ENCLKOP(1'b0), + .LOCK(locked) + ); +`endif + +endmodule diff --git a/project/vga40x30-ecp5-evn-hdmi111.def b/project/vga40x30-ecp5-evn-hdmi111.def @@ -0,0 +1,10 @@ + +PROJECT_TYPE := nextpnr-ecp5 + +PROJECT_SRCS := hdl/ecp5_evn_hdmi111.sv hdl/ecp5_evn_hdmi111.lpf +PROJECT_SRCS += hdl/lattice/ecp5_pll_12_25.v +#PROJECT_SRCS += hdl/spi_debug_ifc.v +#PROJECT_SRCS += hdl/uart_debug_ifc.sv hdl/uart_rx.sv hdl/crc8_serial.sv +PROJECT_SRCS += hdl/vga/vga40x30x2.sv hdl/vga/vga.sv hdl/vga/videoram.sv hdl/vga/chardata.sv + +PROJECT_NEXTPNR_OPTS := --um5g-85k --package CABGA381