verilog - Seven Segment Display -
i'm having problems coding 7 seg display in verilog. want increment 1 digit 1 , have roll on 0 after 9. have done lots of debugging , looked @ examples can't seem find problem. code:
module counter(output sega, segb, segc, segd, sege, segf, segg); osch #("2.08") osc_int ( //"2.03" specifies operating frequency, 2.03 mhz. other clock frequencies can found in machx02's documentation .stdby(1'b0), //specifies active state .osc(clk), //outputs clock signal 'clk' net .sedstdby()); reg [21:0] cnt; wire clk_slow = cnt[21]; //clock @ 1 hz reg [3:0] bcd; //represents states of counter @(posedge clk) begin begin cnt <= cnt+1; end begin if(clk_slow) bcd <= (bcd ==4'h9 ? 4'h0 : bcd+4'b0001); //increments state 1 end end reg [6:0] seg; @(*) begin case(bcd) //gfedcba 4'b0000: seg = 7'b1000000; //0 4'b0001: seg = 7'b1111001; //1 4'b0010: seg = 7'b0100100; //2 4'b0011: seg = 7'b0110000; //3 4'b0100: seg = 7'b0011001; //4 4'b0101: seg = 7'b0010010; //5 4'b0110: seg = 7'b0000010; //6 4'b0111: seg = 7'b1111000; //7 4'b1000: seg = 7'b0000000; //8 4'b1001: seg = 7'b0011000; //9 default seg = 7'b0111111; endcase end assign {segg, segf, sege, segd, segc, segb, sega} = seg; endmodule
so when running, leds light correct digit every other time. in case, lights on 0, 2, 4, 6, 8 , repeats. in between each number, leds lit, not brightly ( dim '8'). when switched order of cases kept numbers in same spot (i.e. case b0000 number 9), leds light 9, 7, 5, 3, 1.... reason, leds arnt responding of "odd" cases (i.e. 0001, 0011...). sorting out appreciated, have spent lots of hours trying debug already.
i using diamond lattice fpga. has onboard clock (the first module in code). slow down 1 hz @ clock_slow.
your problem related lines:
always @(posedge clk) begin cnt <= cnt+1; if(clk_slow) bcd <= (bcd ==4'h9 ? 4'h0 : bcd+4'b0001); //increments state 1 end
because clk
faster clk_slow
, if condition true more 1 clock cycle ('cause clk_slow
high couple clk
cycles). that's why bcd
incremented more once. i'd recommend divide 2 instructions 2 separate always
blocks:
always @(posedge clk) begin cnt <= cnt + 1; end @(posedge clk_slow) begin bcd <= (bcd ==4'h9 ? 4'h0 : bcd+4'b0001); //increments state 1 end
Comments
Post a Comment