一个简单的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不在敏感变量里面。仿真结果也不对。
不知道这样为什么不行,请大虾指点下?感激不尽! 坚持同步时序逻辑设计,不要用电平触发 你改下看怎么样?
always @(clk_in or i) begin
不过不推荐这么做。 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 改成always @(clk_in or i) 不行,原理上也不对啊。
用边沿触发可以得到正确的分频,用电平触发就不可以了,还是没搞清楚为什么...........。 always @(clk_in)这样写综合成组合逻辑
always @(posedge clk_in)被综合成时序逻辑
组合逻辑是只要输入变了输出就会变,时序逻辑和时钟有关系。
你把 i=i+1 这种表达形式拆开成与或非的表达形式看看就明白为什么
而且你这么写与综合器和器件都有很大关系,用cyclone都被综合掉,用cycloneii还有三个lut,我手上没板子,你自己可以试下。 mark 分频
页:
[1]