I want to show digits in the range from 0.0 to 99.5, step 0.5, on a 7 segment display. I have 3 seven segment displays available, they are connected in a MUX, so I have 7 pins for segments and 3 select pins for choosing the digits. In the attached Verilog code I made a display of specific digits, the problem is that I don't know how to make a loop, which will set select pins for specific digits. Can someone please help me achieve this easily? The current code show zeros only. I have noticed that the select pins sets up and the select register shifts, but the digit doesn't change. It always show the last digit in the order I wish to show.
module LED_7seg(
input clk,
output segA, segB, segC, segD, segE, segF, segG, segDP,
output dig0, dig1, dig2
);
// cnt is used as a prescaler - fbrd / prescaler
reg [23:0] cnt;
always @(posedge clk) cnt <= cnt+24'h1;
wire cntovf = &cnt;
// BCD is a counter that counts from 0 to 9
reg [3 : 0] BCD;
wire [15 : 0] BCD16;
// set of number
assign BCD16 = 'h350;
reg [2 : 0] Digit;
always @(posedge clk)
begin
if(Digit == 3'h4) begin
Digit <= 3'h1;
end else begin
Digit <= Digit + 3'h2;
end
case(Digit)
3'h1: BCD = BCD16[3 : 0];
3'h2: BCD = BCD16[7 : 4];
3'h4: BCD = BCD16[11 : 8];
default: BCD = BCD16[3 : 0];
endcase
end
reg [7:0] SevenSeg;
always @(*)
case(BCD)
4'h0: SevenSeg = 8'b11111100;
4'h1: SevenSeg = 8'b01100000;
4'h2: SevenSeg = 8'b11011010;
4'h3: SevenSeg = 8'b11110010;
4'h4: SevenSeg = 8'b01100110;
4'h5: SevenSeg = 8'b10110110;
4'h6: SevenSeg = 8'b10111110;
4'h7: SevenSeg = 8'b11100000;
4'h8: SevenSeg = 8'b11111110;
4'h9: SevenSeg = 8'b11110110;
default: SevenSeg = 8'b00000000;
endcase
assign {dig0, dig1, dig2} = Digit;
assign {segA, segB, segC, segD, segE, segF, segG, segDP} = ~SevenSeg;
endmodule