module johnson_counter_top (
input wire [3:3] btn,
input wire mclk,
input wire [4:0] sw,
output wire [7:0] ld);
wire clk_out;
clkdiv #(
.COUNTER_WIDTH(24),
.INDEX_WIDTH(5)) u0 (
.reset(btn[3:3]),
.clk(mclk),
.index(sw),
.clk_out(clk_out)
);
johnson_counter #(.N(8)) u1 (
.clk(clk_out),
.reset(btn[3:3]),
.q(ld)
);
endmodule
module clkdiv #(
parameter COUNTER_WIDTH = 24,
parameter INDEX_WIDTH = 5)(
output wire clk_out,
input wire clk,
input wire reset,
input wire [INDEX_WIDTH-1:0] index);
reg [COUNTER_WIDTH-1:0] counter;
// binary counter
always @(posedge clk or posedge reset) begin
if (reset == 1) begin
counter <= 0;
end else begin
counter <= counter + 1;
end
end
assign clk_out = counter[index];
endmodule
module johnson_counter #(
parameter N = 4)(
output reg [N-1:0] q,
input wire clk,
input wire reset);
always @(posedge clk or posedge reset) begin
if (reset == 1'b1) begin
q[N-1:0] <= {N{1'b0}};
end else begin
q[N-1] <= ~q[0];
q[N-2:0] <= q[N-1:1];
end
end
endmodule