七段显示器

Seven Segment Display

我在用 verilog 编写七段显示代码时遇到了一些问题。我想将 1 位数字增加 1,并让它在 9 之后滚动到 0。我做了很多调试并查看了示例,但我似乎找不到问题所在。我的代码:

module counter(output sega, segb, segc, segd, sege, segf, segg);

OSCH #("2.08") osc_int (                    //"2.03" specifies the operating frequency, 2.03 MHz. Other clock frequencies can be found in the MachX02's documentation
        .STDBY(1'b0),                           //Specifies active state
        .OSC(clk),                              //Outputs clock signal to 'clk' net
        .SEDSTDBY());

reg [21:0] cnt;
wire clk_slow = cnt[21];  //clock at 1 Hz

reg [3:0] BCD;   //represents the states of the counter
always @(posedge clk) 
begin
    begin
        cnt <= cnt+1;  
    end

    begin
        if(clk_slow) BCD <= (BCD ==4'h9 ? 4'h0 : BCD+4'b0001);   //increments state by 1
    end
end

reg [6:0] seg;  
always @(*)
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

所以当它 运行 时,我的 LED 每隔一段时间就会点亮正确的数字。在这种情况下,它会在 0、2、4、6、8 点亮并重复。在每个数字之间,LED 灯亮起,但没有那么亮(暗淡的“8”)。当我切换箱子的顺序但将数字保持在同一位置时(即箱子 b0000 现在是数字 9),LED 灯亮起 9、7、5、3、1 .... 出于某种原因,我的 LED 灯无法响应任何 "odd" 个案例(即 0001、0011...)。非常感谢任何解决此问题的帮助,因为我已经花了很多时间尝试调试。

我正在使用 Diamond Lattice FPGA。它有一个板载时钟(我代码中的第一个模块)。我在 clock_slow.

将它减慢到 1 赫兹

您的问题与这些行有关:

always @(posedge clk) 
begin
    cnt <= cnt+1; 
    if(clk_slow) BCD <= (BCD ==4'h9 ? 4'h0 : BCD+4'b0001);   //increments state by 1
end

因为 clkclk_slow 快,if 条件将在一个以上的时钟周期内为真('因为 clk_slow 在几个 clk 周期内为高).这就是 BCD 会不止一次递增的原因。我建议您将这两条指令分成两个单独的 always 块:

always @(posedge clk) begin
  cnt <= cnt + 1;
end

always @(posedge clk_slow) begin
  BCD <= (BCD ==4'h9 ? 4'h0 : BCD+4'b0001);   //increments state by 1
end