我试图使用1Hz时钟在FPGA(Cyclone V板)上显示从0到9的数值。问题是输入时钟是50Mhz(FPGA原生),我不确定是否正确执行分频器。或者,也许我的常常块存在问题。
KEY0将作为复位,只要按下KEY0,我希望计数器不断显示0。
KEY1将成为我的自由运动'模式。只要按下此键,我就想让电路板从0到9开始计数,然后从0开始连续。
如果两者都没有按下,我猜它应该停止计数并冻结,或者恢复为0.
我写的代码执行分频2N。因此,您将看到我使用N = 25,000,000来实现1Hz时钟。
我的问题:当我将代码上传到FPGA时,我只看到我的十六进制显示屏上显示的值0,没有按钮执行任何操作。我正在寻找可能修复我的代码的提示,技巧或解决方案,并使我能够在我的FPGA上看到0-9计数功能。
module displayingTime #(parameter WIDTH = 26, parameter N = 25000000) (input clk, resetKEY0, freerunKEY1, output clk_out, output reg carry, output reg [6:0] HEX_0, output reg[7:0] count);
reg Maxval = 8'b00001001;
reg [WIDTH-1:0] r_reg;
wire [WIDTH-1:0] r_nxt;
reg clk_track;
assign r_nxt = r_reg + 1;
assign clk_out = clk_track;
integer i;
always @ (posedge clk or posedge resetKEY0) begin
if ( resetKEY0 ) begin
r_reg <= 0;
clk_track <= 1'b0;
end else if ( r_nxt == N ) begin
r_reg <= 0;
clk_track <= ~clk_track;
end else
r_reg <= r_nxt;
end
always @ (posedge clk_out or posedge resetKEY0) begin
if ( resetKEY0 ) begin
count <= 0;
carry <= 0;
end else if ( freerunKEY1 )
if ( count < Maxval ) begin
count <= count + 8'd1;
carry <= 0;
end else begin
count <= 0;
carry <= 1;
end
end
always @ (*) begin
case (count)
// count is 0, hex_0 displays 0
8'd0 : HEX_0 = 7'b1000000;
// count is 1, hex_0 displays 1
8'd1 : HEX_0 = 7'b1111001;
// count is 2, hex_0 displays 2
8'd2 : HEX_0 = 7'b0100100;
// count is 3, hex_0 displays 3
8'd3 : HEX_0 = 7'b0110000;
// count is 4, hex_0 displays 4
8'd4 : HEX_0 = 7'b0011001;
// count is 5, hex_0 displays 5
8'd5 : HEX_0 = 7'b0010010;
// count is 6, hex_0 displays 6
8'd6 : HEX_0 = 7'b0000010;
// count is 7, hex_0 displays 7
8'd7 : HEX_0 = 7'b1111000;
// count is 8, hex_0 displays 8
8'd8 : HEX_0 = 7'b0000000;
// count is 9, hex_0 displays 9
8'd9 : HEX_0 = 7'b0011000;
default : HEX_0 = 7'b1000000;
endcase
end
endmodule
答案 0 :(得分:0)
提示和技巧:
请注意,上述内容仅适用于FPGA。如果您设计ASIC,则无法做到这一点。它必须工作从工厂出来的第一个齿。
正式地说,您应该将按钮与时钟同步并对它们进行去抖动。您可能不会注意到此代码的任何反弹效果,但如果您想要.e.g。每按一次,你会注意到一个计数器增加一个计数器。