WXing 发表于 2009-12-16 20:05:15

一个简单的FPGA分频

这样的分频程序很多吧,边沿触发,实现16分频。
/**************************************************/
module clk_generator(reset_n,clk_in,clk_out);
input reset_n,clk_in;
output clk_out;
/**************************************************/
reg clk_out;
reg i;
/**************************************************/
always @(negedge clk_in or negedge reset_n) begin
if(!reset_n) i=4'b0000;
else begin
      i=i+1'b1;
      clk_out=i;
      end
end
endmodule
/**************************************************/
下面这个呢?
/**************************************************/
module clk_generator(clk_in,clk_out);
input clk_in;
output clk_out;
/**************************************************/
reg clk_out;
reg i;
/**************************************************/
always @(clk_in) begin
      i=i+1'b1;
      clk_out=i;
end
endmodule
/**************************************************/
只是改为了电平触发,会出现下面的警告:
Warning: Verilog HDL Always Construct warning at LED.v(60): variable "i" is read inside the Always Construct but isn't in the Always Construct's Event Control.
提示i不在敏感变量里面。仿真结果也不对。
不知道这样为什么不行,请大虾指点下?感激不尽!

ngzhang 发表于 2009-12-16 20:25:10

坚持同步时序逻辑设计,不要用电平触发

fenglouto 发表于 2009-12-16 21:29:47

你改下看怎么样?
always @(clk_in or i) begin

不过不推荐这么做。

gliet_su 发表于 2009-12-16 22:15:39

always @(negedge clk_in or negedge reset_n) begin
if(!reset_n) i=4'b0000;
else begin
      i<=i+1'b1;
   
      end
end
assignclk_out=i;

endmodule

WXing 发表于 2009-12-18 11:44:14

改成always @(clk_in or i) 不行,原理上也不对啊。
用边沿触发可以得到正确的分频,用电平触发就不可以了,还是没搞清楚为什么...........。

fenglouto 发表于 2009-12-18 13:58:51

always @(clk_in)这样写综合成组合逻辑
always @(posedge clk_in)被综合成时序逻辑

组合逻辑是只要输入变了输出就会变,时序逻辑和时钟有关系。

你把 i=i+1 这种表达形式拆开成与或非的表达形式看看就明白为什么

而且你这么写与综合器和器件都有很大关系,用cyclone都被综合掉,用cycloneii还有三个lut,我手上没板子,你自己可以试下。

raohao101 发表于 2011-10-25 16:56:21

mark 分频
页: [1]
查看完整版本: 一个简单的FPGA分频