verilog时钟问题
1.时钟IP核分频也有精度,当输入时钟和输出时钟频率不是整数倍的时候,可能会有误差。如:用时钟IP核,输入时钟是50MHz,输出时钟是25.6MHz,输出频率的周期会有0.001ns的误差,但是误差极小,不影响使用
2.仿真精度最大到0.001ns
3.时钟IP核可以分出MHz的信号,小频率的用计数器分,当不是整数倍的时候会有误差
4.ROM IP核给的时钟是系统时钟,IP核把这个当作基准时钟,换其他时钟也可以
5.一个工程里的always块尽量用同一个时钟来驱动,一个系统里基本保持一个统一的系统时钟 这样不会跨时钟域,否则可能出现时序问题。其他地方可以用使能时钟触发
6.不能使用同一个时钟的上升沿和下降沿同时驱动always块,如:always@(posedge sys_clk or negedge)
7.禁止用计数器分频后的信号做其它模块的时钟,而要用改成时钟使能的方式,否则这种时钟满天飞的方式对设计的可靠性极为不利,也大大增加了静态时序分析的复杂性
verilog时钟使能
- 举例
给出一个从ROM中读取数据的例子,ROM地址按bit_clk加一。bit_clk为计数器产生的时钟。addra使用时钟使能的方式加一,addra1直接把bit_clk当作时钟进行加一。仿真发现,当直接使用bit_clk作为时钟时,无法在全局复位信号下对addra进行赋初值。
这是因为,在全局复位信号rst的作用下,bit_clk触发器被清零。因此,在全局复位信号有效的期间,bit_clk没有脉冲输出,所以也就无法触发addra1触发器进行清零。
`timescale 1ns / 1psmodule bit(input rst ,input rc_clk ,output bit
);
reg [6:0] cnt;
always@(posedge rc_clk)beginif(rst) cnt<=7'b0;else if(cnt==7'd126) cnt<=7'b0;else cnt<=cnt+1'b1;
end always@(posedge rc_clk)beginif(rst) bit_clk<=0;else if(cnt==0) bit_clk<=1'b1;else if(cnt==7'd1) bit_clk<=1'b0;else bit_clk<=bit_clk;
end bit_rom u_bit_rom(.clka(bit_clk), // input wire clka.ena(1'b1), // input wire ena.addra(addra), // input wire [7 : 0] addra.douta(bit) // output wire [0 : 0] douta
); reg [7:0] addra;
always@(posedge rc_clk)beginif(rst)addra<=8'b0;else if(bit_clk)addra<=addra+1'b1;else addra<=addra;
end reg [7:0] addra1;
always@(posedge bit_clk)beginif(rst)addra1<=0;elseaddra1<=addra1+1'b1;
end endmodule
- 仿真结果

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
