Skip to content

Commit 7cd5b90

Browse files
committed
Finish counter
1 parent d46a243 commit 7cd5b90

File tree

2 files changed

+82
-34
lines changed

2 files changed

+82
-34
lines changed

Diff for: .gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.DS_Store

Diff for: src/counter/counter.v

+81-34
Original file line numberDiff line numberDiff line change
@@ -28,51 +28,98 @@ module counter(
2828
(decimal point unconnected)
2929
*/
3030
localparam COUNT_MAX = 99;
31+
wire count_clk;
32+
wire ledmux_clk;
3133

32-
reg [7:0] count;
33-
wire [3:0] msd; // most significant digit
34-
wire [3:0] lsd;
34+
clock_divider clkdiv_counter_u (
35+
.clk_i(CLK),
36+
.divisor_i(5'd20),
37+
.clk_o(count_clk)
38+
);
3539

36-
always @(*) begin
37-
40+
clock_divider clkdiv_ledmux_u (
41+
.clk_i(CLK),
42+
.divisor_i(5'd14),
43+
.clk_o(ledmux_clk)
44+
);
45+
46+
reg [3:0] msd; // most significant digit
47+
reg [3:0] lsd;
48+
wire [6:0] msd_ss;
49+
wire [6:0] lsd_ss;
50+
51+
always @(posedge count_clk) begin
52+
if (msd == 4'd9) begin
53+
msd <= 4'b0;
54+
end
55+
if (lsd === 4'd9) begin
56+
lsd <= 4'b0;
57+
msd <= msd + 1;
58+
end else begin
59+
lsd <= lsd + 1;
60+
end
3861
end
3962

40-
wire ss_ctrl;
63+
wire ss_ctrl = ledmux_clk;
4164
wire [6:0] ss_bits;
4265
wire [7:0] seven_segment = {ss_ctrl, ss_bits}; // control and data bus
4366
assign { P1A10, P1A9, P1A8, P1A7, P1A4, P1A3, P1A2, P1A1 } = seven_segment; // assign to PMOD
4467

45-
seven_seg_decoder ss_decode_u(
46-
.din()
68+
seven_seg_decoder msd_decoder_u (
69+
.din(msd),
70+
.dout(msd_ss),
4771
);
4872

49-
module seven_seg_decoder (
50-
input [3:0] din,
51-
output [6:0] dout
73+
seven_seg_decoder lsd_decoder_u (
74+
.din(lsd),
75+
.dout(lsd_ss),
5276
);
53-
reg digit;
54-
always @(*) begin
55-
digit = 7'b 1000000; // no latches
56-
case (din)
57-
4'h0: digit = 7'b 0111111;
58-
4'h1: digit = 7'b 0000110;
59-
4'h2: digit = 7'b 1011011;
60-
4'h3: digit = 7'b 1011011;
61-
4'h4: digit = 7'b 1100110;
62-
4'h5: digit = 7'b 1101101;
63-
4'h6: digit = 7'b 1111101;
64-
4'h7: digit = 7'b 0000111;
65-
4'h8: digit = 7'b 1011011;
66-
4'h9: digit = 7'b 1101111;
67-
4'hA: digit = 7'b 1110111;
68-
4'hB: digit = 7'b 1111100;
69-
4'hC: digit = 7'b 0111001;
70-
4'hD: digit = 7'b 1011110;
71-
4'hE: digit = 7'b 1111001;
72-
4'hF: digit = 7'b 1110001;
73-
endcase
77+
78+
endmodule
79+
80+
module clock_divider (
81+
input clk_i,
82+
input [4:0] divisor_i,
83+
output clk_o,
84+
);
85+
reg state;
86+
wire mask = {32{1'b1}} << divisor_i;
87+
wire pulse = &(counter | mask);
88+
reg [31:0] counter;
89+
always @(posedge clk) begin
90+
counter <= counter + 1;
91+
if (pulse) begin
92+
state <= !state;
7493
end
75-
assign dout = digit;
76-
endmodule
94+
end
95+
assign clk_o = state;
96+
endmodule
7797

98+
module seven_seg_decoder (
99+
input [3:0] din,
100+
output [6:0] dout
101+
);
102+
reg digit;
103+
always @(*) begin
104+
digit = 7'b 1000000; // no latches
105+
case (din)
106+
4'h0: digit = 7'b 0111111;
107+
4'h1: digit = 7'b 0000110;
108+
4'h2: digit = 7'b 1011011;
109+
4'h3: digit = 7'b 1011011;
110+
4'h4: digit = 7'b 1100110;
111+
4'h5: digit = 7'b 1101101;
112+
4'h6: digit = 7'b 1111101;
113+
4'h7: digit = 7'b 0000111;
114+
4'h8: digit = 7'b 1011011;
115+
4'h9: digit = 7'b 1101111;
116+
4'hA: digit = 7'b 1110111;
117+
4'hB: digit = 7'b 1111100;
118+
4'hC: digit = 7'b 0111001;
119+
4'hD: digit = 7'b 1011110;
120+
4'hE: digit = 7'b 1111001;
121+
4'hF: digit = 7'b 1110001;
122+
endcase
123+
end
124+
assign dout = digit;
78125
endmodule

0 commit comments

Comments
 (0)