step2
This commit is contained in:
parent
617a2ff2c2
commit
65c58a2664
|
@ -0,0 +1,2 @@
|
||||||
|
yosys -p "synth_ice40 -top SOC -json step2.json" step2.v clockworks.v
|
||||||
|
|
|
@ -0,0 +1,117 @@
|
||||||
|
/*
|
||||||
|
* Clockworks includes
|
||||||
|
* - gearbox to divide clock frequency, used
|
||||||
|
* to let you observe how the design behaves
|
||||||
|
* one cycle at a time.
|
||||||
|
* - reset mechanism that resets the design
|
||||||
|
* during the first microseconds because
|
||||||
|
* reading in Ice40 BRAM during the first
|
||||||
|
* few microseconds returns garbage!
|
||||||
|
*
|
||||||
|
* Parameters
|
||||||
|
* SLOW number of bits of gearbox. Clock divider
|
||||||
|
* is (1 << SLOW)
|
||||||
|
*
|
||||||
|
* Macros
|
||||||
|
* NEGATIVE_RESET if board's RESET pin goes low on reset
|
||||||
|
* ICE_STICK if board is an IceStick.
|
||||||
|
*/
|
||||||
|
|
||||||
|
`ifdef ECP5_EVN
|
||||||
|
`define NEGATIVE_RESET
|
||||||
|
`endif
|
||||||
|
|
||||||
|
`ifdef ARTY
|
||||||
|
`define NEGATIVE_RESET
|
||||||
|
`endif
|
||||||
|
|
||||||
|
module Clockworks
|
||||||
|
(
|
||||||
|
input CLK, // clock pin of the board
|
||||||
|
input RESET, // reset pin of the board
|
||||||
|
output clk, // (optionally divided) clock for the design.
|
||||||
|
// divided if SLOW is different from zero.
|
||||||
|
output resetn // (optionally timed) negative reset for the design
|
||||||
|
);
|
||||||
|
parameter SLOW=0;
|
||||||
|
|
||||||
|
generate
|
||||||
|
|
||||||
|
/****************************************************
|
||||||
|
|
||||||
|
Slow speed mode.
|
||||||
|
- Create a clock divider to let observe what happens.
|
||||||
|
- Nothing special to do for reset
|
||||||
|
|
||||||
|
****************************************************/
|
||||||
|
if(SLOW != 0) begin
|
||||||
|
// Factor is 1 << slow_bit.
|
||||||
|
// Since simulation is approx. 16 times slower than
|
||||||
|
// actual device we use different factor for bosh.
|
||||||
|
`ifdef BENCH
|
||||||
|
localparam slow_bit=SLOW-4;
|
||||||
|
`else
|
||||||
|
localparam slow_bit=SLOW;
|
||||||
|
`endif
|
||||||
|
reg [slow_bit:0] slow_CLK = 0;
|
||||||
|
always @(posedge CLK) begin
|
||||||
|
slow_CLK <= slow_CLK + 1;
|
||||||
|
end
|
||||||
|
assign clk = slow_CLK[slow_bit];
|
||||||
|
|
||||||
|
`ifdef NEGATIVE_RESET
|
||||||
|
assign resetn = RESET;
|
||||||
|
`else
|
||||||
|
assign resetn = !RESET;
|
||||||
|
`endif
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************
|
||||||
|
|
||||||
|
High speed mode.
|
||||||
|
- Nothing special to do for the clock
|
||||||
|
- A timer that resets the design during the first
|
||||||
|
few microseconds, because reading in Ice40 BRAM
|
||||||
|
during the first few microseconds returns garbage!
|
||||||
|
|
||||||
|
****************************************************/
|
||||||
|
|
||||||
|
end else begin
|
||||||
|
|
||||||
|
// Assign clock directly without PLL
|
||||||
|
assign clk = CLK;
|
||||||
|
|
||||||
|
// Preserve resources on Ice40HX1K (IceStick) with
|
||||||
|
// carefully tuned counter (12 bits suffice).
|
||||||
|
// For other FPGAs, use larger counter.
|
||||||
|
`ifdef ICE_STICK
|
||||||
|
reg [11:0] reset_cnt = 0;
|
||||||
|
`else
|
||||||
|
reg [15:0] reset_cnt = 0;
|
||||||
|
`endif
|
||||||
|
assign resetn = &reset_cnt;
|
||||||
|
|
||||||
|
`ifdef NEGATIVE_RESET
|
||||||
|
always @(posedge clk,negedge RESET) begin
|
||||||
|
if(!RESET) begin
|
||||||
|
reset_cnt <= 0;
|
||||||
|
end else begin
|
||||||
|
reset_cnt <= reset_cnt + !resetn;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
`else
|
||||||
|
always @(posedge clk,posedge RESET) begin
|
||||||
|
if(RESET) begin
|
||||||
|
reset_cnt <= 0;
|
||||||
|
end else begin
|
||||||
|
/* verilator lint_off WIDTH */
|
||||||
|
reset_cnt <= reset_cnt + !resetn;
|
||||||
|
/* verilator lint_on WIDTH */
|
||||||
|
end
|
||||||
|
end
|
||||||
|
`endif
|
||||||
|
end
|
||||||
|
endgenerate
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
set_io CLK 35 # wejście zegarowe
|
||||||
|
set_io RESET 37 # przycisk reset
|
||||||
|
set_io RXD 44 # UART RX
|
||||||
|
set_io TXD 43 # UART TX
|
||||||
|
set_io LEDS[0] 11 # diody LED
|
||||||
|
set_io LEDS[1] 13
|
||||||
|
set_io LEDS[2] 14
|
||||||
|
set_io LEDS[3] 15
|
||||||
|
set_io LEDS[4] 16
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
`include "clockworks.v"
|
||||||
|
|
||||||
|
module SOC (
|
||||||
|
input CLK, // system clock
|
||||||
|
input RESET, // reset button
|
||||||
|
output [4:0] LEDS, // system LEDs
|
||||||
|
input RXD, // UART receive
|
||||||
|
output TXD // UART transmit
|
||||||
|
);
|
||||||
|
|
||||||
|
wire clk; // internal clock
|
||||||
|
wire resetn; // internal reset signal, goes low on reset
|
||||||
|
|
||||||
|
// A blinker that counts on 5 bits, wired to the 5 LEDs
|
||||||
|
reg [4:0] count = 0;
|
||||||
|
always @(posedge clk) begin
|
||||||
|
count <= !resetn ? 0 : count + 1;
|
||||||
|
end
|
||||||
|
|
||||||
|
// Clock gearbox (to let you see what happens)
|
||||||
|
// and reset circuitry (to workaround an
|
||||||
|
// initialization problem with Ice40)
|
||||||
|
Clockworks #(
|
||||||
|
.SLOW(21) // Divide clock frequency by 2^21
|
||||||
|
)CW(
|
||||||
|
.CLK(CLK),
|
||||||
|
.RESET(RESET),
|
||||||
|
.clk(clk),
|
||||||
|
.resetn(resetn)
|
||||||
|
);
|
||||||
|
|
||||||
|
assign LEDS = count;
|
||||||
|
assign TXD = 1'b0; // not used for now
|
||||||
|
endmodule
|
Loading…
Reference in New Issue