请帮助识别此时钟分频器代码中的错误

时间:2014-02-19 18:42:47

标签: verilog

50mhz的时钟分频器(verilog代码)。我试图在fpga上烧这个,但它不能正常工作。我正在使用导师图形模型。请帮助识别我的错误。

module clk_div(
clk,
rst,
count);

parameter count_width=27;
parameter count_max=25000000;

output [count_width-1:0] count;
reg [count_width-1:0] count;
input clk,rst;

initial
count=0;

always@(posedge clk)
  if (rst)
  begin
      count<=0;
  end
  else if (count<count_max-1)
  begin
      count<=count+1;
  end
  else if (count==count_max)
  begin
      count <=~count;
  end
  else if (count>count_max)
  begin
      count<=0;
  end
endmodule

1 个答案:

答案 0 :(得分:0)

三件事。首先,您的begin块需要endalways。第二,当计数达到最大值时,你为什么要count <= ~count?你不应该把它设置回0吗?第三,您不能为内部count寄存器指定与count输出相同的名称。您需要将其中一个称为其他内容。实际上,为什么要输出count?如果这是一个时钟分频器,你想输出另一个时钟,对吧?以下应该有效。

module clk_div(
    clk,
    rst,
    outclk);

parameter count_width=27;
parameter count_max=25000000;

reg [count_width-1:0] count;
input clk,rst;
output outclk;
reg intern_clk;
assign outclk = intern_clk;


initial begin
    count=0;
    intern_clk=1'b0;
end

always @(posedge clk) begin
    if (rst)
        count <= 0;
    else if (count == count_max) begin
        count <= 0;
        intern_clk <= !intern_clk;
    end else
        count <= count + 1'b1;
end

endmodule

但似乎你正试图将时钟分频为1 Hz。那是非常多的。我建议您使用PLL而不是自己制作时钟分频器。既然你提到50 MHz时钟,我猜你在使用Altera FPGA?如果是这样,打开MegaWizard插件管理器并创建一个PLL。