1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
module top (
input clk,
input rst_i,
output [`LEDS_NR-1:0] led
);
wire rst = rst_i ^ `INV_BTN;
wire rst_s;
wire tick_hz;
localparam HZ_PRESC = 12_000_000,
HZ_SIZE = $clog2(HZ_PRESC);
reg [HZ_SIZE-1:0] hertz_cpt;
wire [HZ_SIZE-1:0] hertz_cpt_d = hertz_cpt - 1'b1;
always @(posedge clk) begin
/* 1Hz clk */
if (tick_hz) begin
hertz_cpt <= HZ_PRESC;
end else begin
hertz_cpt <= hertz_cpt_d;
end
end
reg [`LEDS_NR-1:0] ctr_q;
wire [`LEDS_NR-1:0] ctr_d;
// Sequential code (flip-flop)
always @(posedge clk or posedge rst_s) begin
if (rst_s) begin
ctr_q <= 'd1;
end else if (tick_hz) begin
ctr_q <= ctr_d;
end
end
// Combinational code (boolean logic)
assign ctr_d = {ctr_q[0], ctr_q[`LEDS_NR-1:1]};
assign led = ctr_q;
assign tick_hz = (hertz_cpt == 0);
assign rst_s = !rst;
endmodule
|