parent
679b8d6088
commit
b1847ef929
@ -0,0 +1,16 @@
|
|||||||
|
# TrellisBoard OpenOCD config
|
||||||
|
|
||||||
|
interface ftdi
|
||||||
|
# ftdi_device_desc "TrellisBoard"
|
||||||
|
ftdi_vid_pid 0x0403 0x6010
|
||||||
|
# channel 1 does not have any functionality
|
||||||
|
ftdi_channel 0
|
||||||
|
# just TCK TDI TDO TMS, no reset
|
||||||
|
ftdi_layout_init 0xfff8 0xfffb
|
||||||
|
reset_config none
|
||||||
|
|
||||||
|
# default speed
|
||||||
|
adapter_khz 5000
|
||||||
|
|
||||||
|
# ECP5 device - LFE5UM5G-85F
|
||||||
|
jtag newtap ecp5 tap -irlen 8 -expected-id 0x81113043
|
@ -0,0 +1,4 @@
|
|||||||
|
*.json
|
||||||
|
*_out.config
|
||||||
|
*.bit
|
||||||
|
*.svf
|
@ -0,0 +1,22 @@
|
|||||||
|
PROJ=demo
|
||||||
|
|
||||||
|
all: ${PROJ}.bit
|
||||||
|
|
||||||
|
%.json: *.v
|
||||||
|
yosys -p "synth_ecp5 -json $@ -top $*_top" $^
|
||||||
|
|
||||||
|
%_out.config: %.json
|
||||||
|
nextpnr-ecp5 --json $< --textcfg $@ --um5g-85k --package CABGA756 --lpf trellisboard.lpf
|
||||||
|
|
||||||
|
%.bit: %_out.config
|
||||||
|
ecppack --svf ${PROJ}.svf $< $@
|
||||||
|
|
||||||
|
${PROJ}.svf : ${PROJ}.bit
|
||||||
|
|
||||||
|
prog: ${PROJ}.svf
|
||||||
|
openocd -f ../misc/trellisboard.cfg -c "transport select jtag; init; svf $<; exit"
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.svf *.bit *.config *.json
|
||||||
|
|
||||||
|
.PHONY: prog clean
|
@ -0,0 +1,32 @@
|
|||||||
|
module demo_top(
|
||||||
|
input clk_12,
|
||||||
|
input [3:0] btn,
|
||||||
|
input [7:0] dip_sw,
|
||||||
|
output [11:0] led
|
||||||
|
);
|
||||||
|
|
||||||
|
reg [11:0] ctr_scroll = 1'b1;
|
||||||
|
reg clk_div = 0;
|
||||||
|
|
||||||
|
localparam DIV = 20;
|
||||||
|
reg [DIV-1:0] div_ctr = 0;
|
||||||
|
|
||||||
|
always @(posedge clk) begin
|
||||||
|
{clk_div, div_ctr} <= div_ctr + 1'b1;
|
||||||
|
|
||||||
|
if (clk_div) begin
|
||||||
|
if (!(|ctr_scroll))
|
||||||
|
ctr_scroll <= 1'b1;
|
||||||
|
else
|
||||||
|
ctr_scroll <= {ctr_scroll[10:0], ctr_scroll[11]};
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
led_ctrl led_ctrl_i (
|
||||||
|
.clk(clk_12),
|
||||||
|
.led_in_yr({dip_sw, btn}),
|
||||||
|
.led_in_bg(ctr_scroll),
|
||||||
|
.led_pin(led)
|
||||||
|
);
|
||||||
|
|
||||||
|
endmodule
|
@ -0,0 +1,34 @@
|
|||||||
|
// LED multiplex control
|
||||||
|
|
||||||
|
module led_ctrl (
|
||||||
|
// Fast clock (12MHz+)
|
||||||
|
input clk,
|
||||||
|
// Colour A inputs (yellow for 0-5, red for 6-11)
|
||||||
|
input [11:0] led_in_yr,
|
||||||
|
// Colour B inputs (blue for 0-5, green for 6-11)
|
||||||
|
input [11:0] led_in_bg,
|
||||||
|
// Output to LED pins
|
||||||
|
output [11:0] led_pin
|
||||||
|
);
|
||||||
|
// Gives ~23kHz at 12MHz, ~195kHz at 100MHz
|
||||||
|
localparam DIV_FACTOR = 9;
|
||||||
|
reg [DIV_FACTOR-1:0] ctr;
|
||||||
|
|
||||||
|
always @(posedge clk) ctr <= ctr + 1'b1;
|
||||||
|
|
||||||
|
genvar i;
|
||||||
|
generate
|
||||||
|
for (i = 0; i < 12; i = i + 1'b1) begin
|
||||||
|
/*
|
||||||
|
Only YR asserted : LED at constant 1'b0
|
||||||
|
Both YR & BG asserted : blend colour by connecting LED to divider MSB
|
||||||
|
Only BG asserted : LED at constant 1'b1
|
||||||
|
Neither asserted : LED off (1'bz)
|
||||||
|
*/
|
||||||
|
assign led_pin[i] = led_in_yr ?
|
||||||
|
(led_in_bg ? ctr[DIV_FACTOR - 1] : 1'b0) :
|
||||||
|
(led_in_bg ? 1'b1 : 1'bz);
|
||||||
|
end
|
||||||
|
endgenerate
|
||||||
|
|
||||||
|
endmodule
|
@ -0,0 +1,56 @@
|
|||||||
|
LOCATE COMP "clk_12" SITE "B3";
|
||||||
|
IOBUF PORT "clk_12" IO_TYPE=LVCMOS33;
|
||||||
|
|
||||||
|
LOCATE COMP "btn[0]" SITE "Y32";
|
||||||
|
LOCATE COMP "btn[1]" SITE "W31";
|
||||||
|
LOCATE COMP "btn[2]" SITE "AD30";
|
||||||
|
LOCATE COMP "btn[3]" SITE "AD29";
|
||||||
|
|
||||||
|
IOBUF PORT "btn[0]" IO_TYPE=SSTL135_I;
|
||||||
|
IOBUF PORT "btn[1]" IO_TYPE=SSTL135_I;
|
||||||
|
IOBUF PORT "btn[2]" IO_TYPE=SSTL135_I;
|
||||||
|
IOBUF PORT "btn[3]" IO_TYPE=SSTL135_I;
|
||||||
|
|
||||||
|
LOCATE COMP "dip_sw[0]" SITE "AE31";
|
||||||
|
LOCATE COMP "dip_sw[1]" SITE "AE32";
|
||||||
|
LOCATE COMP "dip_sw[2]" SITE "AD32";
|
||||||
|
LOCATE COMP "dip_sw[3]" SITE "AC32";
|
||||||
|
LOCATE COMP "dip_sw[4]" SITE "AB32";
|
||||||
|
LOCATE COMP "dip_sw[5]" SITE "AB31";
|
||||||
|
LOCATE COMP "dip_sw[6]" SITE "AC31";
|
||||||
|
LOCATE COMP "dip_sw[7]" SITE "AC30";
|
||||||
|
|
||||||
|
IOBUF PORT "dip_sw[0]" IO_TYPE=SSTL135_I;
|
||||||
|
IOBUF PORT "dip_sw[1]" IO_TYPE=SSTL135_I;
|
||||||
|
IOBUF PORT "dip_sw[2]" IO_TYPE=SSTL135_I;
|
||||||
|
IOBUF PORT "dip_sw[3]" IO_TYPE=SSTL135_I;
|
||||||
|
IOBUF PORT "dip_sw[4]" IO_TYPE=SSTL135_I;
|
||||||
|
IOBUF PORT "dip_sw[5]" IO_TYPE=SSTL135_I;
|
||||||
|
IOBUF PORT "dip_sw[6]" IO_TYPE=SSTL135_I;
|
||||||
|
IOBUF PORT "dip_sw[7]" IO_TYPE=SSTL135_I;
|
||||||
|
|
||||||
|
LOCATE COMP "led[0]" SITE "C26";
|
||||||
|
LOCATE COMP "led[1]" SITE "D26";
|
||||||
|
LOCATE COMP "led[2]" SITE "A28";
|
||||||
|
LOCATE COMP "led[3]" SITE "A29";
|
||||||
|
LOCATE COMP "led[4]" SITE "A30";
|
||||||
|
LOCATE COMP "led[5]" SITE "AK29";
|
||||||
|
LOCATE COMP "led[6]" SITE "AH32";
|
||||||
|
LOCATE COMP "led[7]" SITE "AH30";
|
||||||
|
LOCATE COMP "led[8]" SITE "AH28";
|
||||||
|
LOCATE COMP "led[9]" SITE "AG30";
|
||||||
|
LOCATE COMP "led[10]" SITE "AG29";
|
||||||
|
LOCATE COMP "led[11]" SITE "AK30";
|
||||||
|
|
||||||
|
IOBUF PORT "led[0]" IO_TYPE=LVCMOS33 PULLMODE=NONE;
|
||||||
|
IOBUF PORT "led[1]" IO_TYPE=LVCMOS33 PULLMODE=NONE;
|
||||||
|
IOBUF PORT "led[2]" IO_TYPE=LVCMOS33 PULLMODE=NONE;
|
||||||
|
IOBUF PORT "led[3]" IO_TYPE=LVCMOS33 PULLMODE=NONE;
|
||||||
|
IOBUF PORT "led[4]" IO_TYPE=LVCMOS33 PULLMODE=NONE;
|
||||||
|
IOBUF PORT "led[5]" IO_TYPE=LVCMOS33 PULLMODE=NONE;
|
||||||
|
IOBUF PORT "led[6]" IO_TYPE=LVCMOS33 PULLMODE=NONE;
|
||||||
|
IOBUF PORT "led[7]" IO_TYPE=LVCMOS33 PULLMODE=NONE;
|
||||||
|
IOBUF PORT "led[8]" IO_TYPE=LVCMOS33 PULLMODE=NONE;
|
||||||
|
IOBUF PORT "led[9]" IO_TYPE=LVCMOS33 PULLMODE=NONE;
|
||||||
|
IOBUF PORT "led[10]" IO_TYPE=LVCMOS33 PULLMODE=NONE;
|
||||||
|
IOBUF PORT "led[11]" IO_TYPE=LVCMOS33 PULLMODE=NONE;
|
Loading…
Reference in new issue