七段显示器
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
因为 clk
比 clk_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
我在用 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
因为 clk
比 clk_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