使用具有频率分频时钟的Verilog计数0-9用于FPGA

时间:2018-03-27 04:44:43

标签: verilog

我试图使用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

1 个答案:

答案 0 :(得分:0)

提示和技巧:

  • 立即点亮一个LED,测试您的按钮代码。
  • 使用小分频值在模拟中测试分频器。
  • 不使用按钮运行计数器,然后合并它们。

请注意,上述内容仅适用于FPGA。如果您设计ASIC,则无法做到这一点。它必须工作从工厂出来的第一个齿。

正式地说,您应该将按钮与时钟同步并对它们进行去抖动。您可能不会注意到此代码的任何反弹效果,但如果您想要.e.g。每按一次,你会注意到一个计数器增加一个计数器。