0

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
blackgreen
  • 34,072
  • 23
  • 111
  • 129
drVrh
  • 37
  • 6
  • Look at the pattern for `Digit` : 0,2,4,1,3,5,1,3,5,1,3,5,... The desired pattern is 1,2,4,1,2,4,1,2,4,... How can that be achieved? Hint: no addition needed and can be done in one line of code. – Greg Mar 02 '17 at 20:30

1 Answers1

0

I have problem with pattern for select digits, and switch between digits is too fast. This is a corecct code:

   /* Author: Grega Mocnik
    Description: 7 segment driver for 3 digits display.
    Date: 3.3.2017
    Version: V1
    *****************************************************
*/
module LED_7seg(
    input clk,
    output segA, segB, segC, segD, segE, segF, segG, segDP,
    output dig0, dig1, dig2
);
// Prescaler of board frequency
// For normall view on 7 segment displey must be switch frequency betwen
// segments more than 100 Hz. - At 100Hz, a display cycle would last 10ms
// (and each display would be lit 3.33ms per cycle).
// cnt is used as a prescaler  -
// equation: frekvneca_zeljena = (fboard) / (2 * (1 + Presclaer))
reg [18:0] cnt;
always @(posedge clk) cnt <= cnt+19'h1;
wire cntovf = &cnt;

// Declare of BCD register, for select segment and digit's
reg [3 : 0] BCD;
wire [15 : 0] BCD16;

// Set of number - for number set this register first two numbers
// is before point. example: 'h351 = 35.1
assign BCD16 = 'h846;

// Declare of SevenSeg register - select segment
reg [7:0] SevenSeg;
// Declare of Digit register - select digit
reg [2 : 0] Digit;

// Switch between digits
// Switch pattern is 1 2 4 1 2 4 ...
// because, 1 in binary 001 and 2 in binary 010 and 4 in binary 100 ...
// have common anode and then select digit with 1 and select segment with 0.
always @(posedge clk)
begin
     if(cntovf) begin
       Digit <= Digit * 3'h2;
       if(Digit > 3'h4)  begin Digit <= 3'h1;end
       if(Digit == 3'h0) begin Digit <= 3'h1;end
     end
end
// Select each number from BCD16 reg.
// All number to 10 we can show with 4 bit's in binry world.
// Now we can see for example number 351 binary pattern 0011 0101 0001 -
// - first 4 bit's for first digit in number
// - second 4 bit's for second digit in number
// - third 4 bit's for third digit in number
always @(*)
       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

assign {dig0, dig1, dig2} = Digit;

// Explain pattern is write for common cathode.
// The last bit is for dot segment.
always @(*)
case(BCD)
    4'h0: SevenSeg = 8'b11111101;
    4'h1: SevenSeg = 8'b01100001;
    4'h2: SevenSeg = 8'b11011011;
    4'h3: SevenSeg = 8'b11110011;
    4'h4: SevenSeg = 8'b01100111;
    4'h5: SevenSeg = 8'b10110111;
    4'h6: SevenSeg = 8'b10111111;
    4'h7: SevenSeg = 8'b11100001;
    4'h8: SevenSeg = 8'b11111111;
    4'h9: SevenSeg = 8'b11110111;
    //default: SevenSeg = 8'b00000000;
endcase

// Assign output segment, - output is invert because we have common anonde display
// segment binary pattern is write for common cathode display
assign {segA, segB, segC, segD, segE, segF, segG, segDP} = ~SevenSeg;

endmodule 
drVrh
  • 37
  • 6