如何用Verilog设计单个时钟周期的延时?就是说50MHz的外部时钟,希望在赋值的时候实现20ns的延时。。。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用Verilog设计单个时钟周期的延时?就是说50MHz的外部时钟,希望在赋值的时候实现20ns的延时。。。相关的知识,希望对你有一定的参考价值。

程序如下:
module clk(start,clk_in,clk_out); //clk_in为输入时钟,Start为开始信号
input start,clk_in;
output clk_out;
reg clk_out;

always @(posedge clk_in)
begin
if(!start) clk_out<=0;
else (这里实现20ns延时) clk_out<=~clk_out;
//clk_out是clk_in的二分频输出,但是希望能延时20ns
end
endmodule

要可综合的延时,就是说不要#20这种定义的;自己尝试用计数器编过,但是仿真出来不对,求高手指教~

50Mhz,时钟周期20ns,延迟一拍即可。
module clk(start,clk_in,clk_out); //clk_in为输入时钟,Start为开始信号
input start,clk_in;
output clk_out;
reg clk_out;
reg clk_out_r;

always @(posedge clk_in)
begin
if(!start)
begin
clk_out <= 0;
clk_out_r <= 0;
end
else
begin
clk_out_r <= ~clk_out_r;
clk_out <= clk_out_r;
end
end
endmodule
参考技术A 用D触发器打一下拍就是了,像这样
always @(clk_in)
clk_out_r <= clk_out;//D触发器的输入输出延时一个时钟周期追问

嗯嗯,已经实现了,谢谢~~

参考技术B 我只用过AHDL,应该是类似的。
加一个外部时钟驱动的计数器,计数开始后到1了再驱动你的clk模块即可。追问

自己试过用计数器的办法,但是没能实现,在实现延时的同时clk_Out变成了四分频的信号。刚刚用楼下所说的方法实现了,谢谢~

verilog中除法运算在modelsim仿真中只要一个时钟周期就能完成,实际上也是这样吗?

比如说always@(posedge clk)
begin
e<=(a*a+b*b)/(c*d)
end
这种写法不仅能综合,而且在用modelsim仿真中只需要一个周期就能出结果,对吗?modelsim到底能不能正确的反应一个所需的时钟数。
有知道的吗?求指点

首先,我不认为这样的代码可以综合出电路,因为FPGA CPLD都是没有除法器的,但是个别芯片具有乘法器,所以我建议您在这种情况下,先看你的待用芯片具不具有乘法器,有多少乘法器资源可以使用;modelsim仿真的是verilog的写法和要实现的逻辑功能,所以符合verilog语法功能的乘法除法都可以被仿真出来,具体几个周期出来由您的写法决定,上述代码确实是一个周期实现的,因为它的触发条件就是clk的上升沿,在第二个上升沿来之后 e已经被赋值了,刚好一个clk周期;上述周期决定于您的clk频率是多少,仿真时需要给定仿真时间精度和每个timescale参数便于查看仿真时序;在实际电路中,情况就复杂的多了,比如,你要实现1个clk实现10万次的乘法运算并且累加一次同时移位一次;这样的话我可以告诉你肯定没有哪个芯片有这么多资源让你“一次”完成这么多功能;但是可以把CLK变快10万倍,这样同样的时间里,因为执行速度快,所以分10万次完成上述功能是没有问题的;这是“面积与速度“的原则,不知道你看懂了么 参考技术A 比较怀疑,这种写法能综合。

乘法,和除法,如果不使用厂家提供的ipcore的话,要自己搭建。

我的经历,要自己搭建,一般需要多个时钟周期,需要的周期数,依赖于参与运算的数据位宽。
参考技术B 关注这个问题

以上是关于如何用Verilog设计单个时钟周期的延时?就是说50MHz的外部时钟,希望在赋值的时候实现20ns的延时。。。的主要内容,如果未能解决你的问题,请参考以下文章

Verilog如何检测一个时钟周期肿的翻转?

如何用Verilog设计一个异步清0、同步时钟使能和异步数据加载型8位二进制家法计数器?

verilog 中的上升沿 下升沿 延时怎样规定

verilog的bufg作用

verilog分频模块设计

verilog仿真的时钟问题