1
0
mirror of https://github.com/antonblanchard/chiselwatt.git synced 2026-01-14 07:40:37 +00:00

Merge pull request #6 from antonblanchard/fusesoc

FuseSoC Support
This commit is contained in:
Anton Blanchard 2020-02-02 14:24:30 +11:00 committed by GitHub
commit 5abdf7ce5c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 177 additions and 70 deletions

View File

@ -68,8 +68,8 @@ OPENOCD_DEVICE_CONFIG=openocd/LFE5UM5G-85F.cfg
synth: chiselwatt.bit
chiselwatt.json: $(verilog_files) insns.hex pll_ecp5_evn.v toplevel.v
$(YOSYS) -p "read_verilog -sv pll_ecp5_evn.v toplevel.v Core.v MemoryBlackBox.v; synth_ecp5 -json $@ -top toplevel"
chiselwatt.json: $(verilog_files) insns.hex pll/pll_ehxplll.v toplevel.v
$(YOSYS) -p "read_verilog -sv pll/pll_ehxplll.v toplevel.v Core.v MemoryBlackBox.v; synth_ecp5 -json $@ -top toplevel"
chiselwatt_out.config: chiselwatt.json $(LPF)
$(NEXTPNR) --json $< --lpf $(LPF) --textcfg $@ $(NEXTPNR_FLAGS) --package $(PACKAGE)

45
chiselwatt.core Normal file
View File

@ -0,0 +1,45 @@
CAPI=2:
name : ::chiselwatt:0
filesets:
core:
files:
- Core.v
- MemoryBlackBox.v
- toplevel.v
- insns.hex : {copyto : insns.hex, file_type : user}
file_type : verilogSource
cmod_a7-35:
files:
- constraints/cmod_a7-35.xdc : {file_type : xdc}
- pll/pll_mmcme2.v : {file_type : verilogSource}
ecp5-evn:
files:
- constraints/ecp5-evn.lpf : {file_type : LPF}
- pll/pll_ehxplll.v : {file_type : verilogSource}
targets:
cmod_a7-35:
default_tool: vivado
filesets: [core, cmod_a7-35]
parameters :
- RESET_LOW=false
tools:
vivado: {part : xc7a35tcpg236-1}
toplevel : toplevel
ecp5-evn:
default_tool: diamond
filesets: [core, ecp5-evn]
tools:
diamond: {part: LFE5U-85F-8BG381I}
toplevel : toplevel
parameters:
RESET_LOW:
datatype : bool
description : External reset button polarity
paramtype : generic

View File

@ -0,0 +1,20 @@
## Clock signal 12 MHz
set_property -dict { PACKAGE_PIN L17 IOSTANDARD LVCMOS33 } [get_ports { clock }];
create_clock -add -name sys_clk_pin -period 83.33 -waveform {0 41.66} [get_ports {clock}];
set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { io_tx }];
set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { io_rx }];
set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVCMOS33 } [get_ports { reset }];
set_property -dict { PACKAGE_PIN A17 IOSTANDARD LVCMOS33 } [get_ports { io_terminate }];
set_property -dict { PACKAGE_PIN C16 IOSTANDARD LVCMOS33 } [get_ports { io_ledB }];
set_property -dict { PACKAGE_PIN B17 IOSTANDARD LVCMOS33 } [get_ports { io_ledC }];
set_property CONFIG_VOLTAGE 3.3 [current_design]
set_property CFGBVS VCCO [current_design]
set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]
set_property BITSTREAM.CONFIG.CONFIGRATE 33 [current_design]
set_property CONFIG_MODE SPIx4 [current_design]

12
pll/pll_bypass.v Normal file
View File

@ -0,0 +1,12 @@
module pll(
input clki,
output clko,
output lock
);
always @* begin
lock <= 1;
clko <= clki;
end
endmodule

36
pll/pll_ehxplll.v Normal file
View File

@ -0,0 +1,36 @@
module pll(
input clki,
output clko,
output lock
);
(* 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"),
.CLKOP_FPHASE(0),
.CLKOP_CPHASE(11),
.OUTDIVIDER_MUXA("DIVA"),
.CLKOP_ENABLE("ENABLED"),
.CLKOP_DIV(12),
.CLKFB_DIV(25),
.CLKI_DIV(6),
.FEEDBK_PATH("CLKOP")
) pll_i (
.CLKI(clki),
.CLKFB(clko),
.CLKOP(clko),
.LOCK(lock),
.RST(1'b0),
.STDBY(1'b0),
.PHASESEL0(1'b0),
.PHASESEL1(1'b0),
.PHASEDIR(1'b0),
.PHASESTEP(1'b0),
.PLLWAKESYNC(1'b0),
.ENCLKOP(1'b0)
);
endmodule

26
pll/pll_mmcme2.v Normal file
View File

@ -0,0 +1,26 @@
module pll(
input clki,
output clko,
output lock
);
wire clkfb;
MMCME2_BASE #(
.BANDWIDTH("OPTIMIZED"),
.CLKFBOUT_MULT_F(50.0),
.CLKIN1_PERIOD(83.33),
.CLKOUT0_DIVIDE_F(12.0),
.DIVCLK_DIVIDE(1),
.STARTUP_WAIT("FALSE")
) MMCME2_BASE_inst (
.CLKOUT0(clko),
.CLKFBOUT(clkfb),
.LOCKED(lock),
.CLKIN1(clki),
.PWRDWN(1'b0),
.RST(1'b0),
.CLKFBIN(clkfb)
);
endmodule

View File

@ -1,30 +0,0 @@
module pll_ecp5_evn(input clki, output clko, output lock);
(* 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"),
.CLKOP_FPHASE(0),
.CLKOP_CPHASE(11),
.OUTDIVIDER_MUXA("DIVA"),
.CLKOP_ENABLE("ENABLED"),
.CLKOP_DIV(12),
.CLKFB_DIV(25),
.CLKI_DIV(6),
.FEEDBK_PATH("CLKOP")
) pll_i (
.CLKI(clki),
.CLKFB(clko),
.CLKOP(clko),
.LOCK(lock),
.RST(1'b0),
.STDBY(1'b0),
.PHASESEL0(1'b0),
.PHASESEL1(1'b0),
.PHASEDIR(1'b0),
.PHASESTEP(1'b0),
.PLLWAKESYNC(1'b0),
.ENCLKOP(1'b0)
);
endmodule

View File

@ -1,47 +1,45 @@
module toplevel(
input clock,
input reset,
output io_tx,
input io_rx,
output io_terminate,
output io_ledB,
output io_ledC
module toplevel #(
parameter RESET_LOW = 1
) (
input clock,
input reset,
output io_tx,
input io_rx,
output io_terminate,
output io_ledB,
output io_ledC
);
wire clock_out;
reg reset_out;
wire lock;
wire clock_out;
reg reset_out;
wire lock;
pll_ecp5_evn pll(
.clki(clock),
.clko(clock_out),
.lock(lock)
);
pll chiselwatt_pll(
.clki(clock),
.clko(clock_out),
.lock(lock)
);
Core core(
.clock(clock_out),
.reset(reset_out),
.io_tx(io_tx),
.io_rx(io_rx),
.io_terminate(io_terminate),
.io_ledB(io_ledB),
.io_ledC(io_ledC)
);
Core core(
.clock(clock_out),
.reset(reset_out),
.io_tx(io_tx),
.io_rx(io_rx),
.io_terminate(io_terminate),
.io_ledB(io_ledB),
.io_ledC(io_ledC)
);
reg [21:0] cnt = ~0;
reg [21:0] cnt = ~0;
always@(posedge clock)
begin
if (~lock || ~reset)
begin
cnt <= ~0;
end
else if (cnt != 0)
begin
cnt <= cnt - 1;
end
always@(posedge clock) begin
if (~lock || (reset ^ RESET_LOW)) begin
cnt <= ~0;
end else if (cnt != 0) begin
cnt <= cnt - 1;
end
reset_out <= |cnt;
end
reset_out <= |cnt;
end
endmodule