@@ -28,51 +28,98 @@ module counter(
28
28
(decimal point unconnected)
29
29
*/
30
30
localparam COUNT_MAX = 99 ;
31
+ wire count_clk;
32
+ wire ledmux_clk;
31
33
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
+ );
35
39
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
38
61
end
39
62
40
- wire ss_ctrl;
63
+ wire ss_ctrl = ledmux_clk ;
41
64
wire [6 :0 ] ss_bits;
42
65
wire [7 :0 ] seven_segment = {ss_ctrl, ss_bits}; // control and data bus
43
66
assign { P1A10, P1A9, P1A8, P1A7, P1A4, P1A3, P1A2, P1A1 } = seven_segment; // assign to PMOD
44
67
45
- seven_seg_decoder ss_decode_u (
46
- .din()
68
+ seven_seg_decoder msd_decoder_u (
69
+ .din(msd),
70
+ .dout(msd_ss),
47
71
);
48
72
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),
52
76
);
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;
74
93
end
75
- assign dout = digit;
76
- endmodule
94
+ end
95
+ assign clk_o = state;
96
+ endmodule
77
97
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;
78
125
endmodule
0 commit comments