【问题标题】:7 segment MUX Not showing the wanted digit.- Verilog7 段 MUX 不显示想要的数字。- Verilog
【发布时间】:2017-03-02 20:10:07
【问题描述】:

我想在 7 段显示器上显示 0.0 到 99.5 范围内的数字,步长 0.5。 我有 3 个可用的七段显示器,它们连接在一个 MUX 中,所以我有 7 个用于段的引脚和 3 个 选择用于选择数字的引脚。 在随附的 Verilog 代码中,我显示了特定数字,问题是我不知道如何制作 一个循环,它将为特定数字设置选择引脚。 有人可以帮助我轻松实现这一目标吗? 当前代码仅显示零。 我注意到选择引脚设置和选择寄存器移位,但数字没有改变。 它总是按我希望显示的顺序显示最后一位数字。

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

【问题讨论】:

  • 查看Digit的模式:0,2,4,1,3,5,1,3,5,1,3,5,... 想要的模式是1, 2,4,1,2,4,1,2,4,... 怎样才能实现?提示:无需添加,只需一行代码即可完成。

标签: verilog fpga mux


【解决方案1】:

我对选择数字的模式有疑问,数字之间的切换太快了。这是一个corecct代码:

   /* 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 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多