你好朋友我还不知道如何在Verilog中生成延迟进行综合并在Verilog的任何一行调用它来进行综合...为了找到这个我编写一个代码但它不起作用如果你知道如何生成延迟请帮助我并且在任何一行中调用如C的函数* ......其实朋友如果你告诉我为什么我在这里使用循环然后我的答案是 - 我想将指针移到for循环中直到和除非他们完成了我为延迟生成做的计算 ..
module state_delay;
reg Clk=1'b0;
reg [3:0]stmp=4'b0000;
integer i,a;
always
begin
#50 Clk=~Clk;
end
always @(posedge Clk)
begin
a=1'b1;
delay();
a=1'b0;
delay();
a=1'b1;
end
task delay();
begin
for(i=0;i==(stmp==4'b1111);i=i+1)
begin
@(posedge Clk)
begin
stmp=stmp+1;
end
end
if(stmp==4'b1111)
begin
stmp=4'b0000;
end
end
endtask
endmodule
其实朋友我想要 a = 1'b0;延迟(); a = 1'b1; 请帮助我已经尝试过延迟生成使用计数器,但它对我不起作用.....如果您使用计数器知道相同的话请告诉我.. ....谢谢
答案 0 :(得分:0)
// will generate a delay of pow(2,WIDTH) clock cycles
// between each change in the value of "a"
`define WIDTH 20
reg [`WIDTH:0] counter;
wire a = counter[`WIDTH];
always @(posedge Clk)
counter <= counter + 1;
根据WIDTH
的更改与a
信号的比率
Clk
选择合适的值
答案 1 :(得分:0)
这个问题是How to generate delay in verilog using Counter for Synthesis and call inside Always block?的更简洁版本。
我觉得有一段代码很麻烦:
always @(posedge Clk) begin
a = 1'b1;
delay() ;
a = 1'b0;
end
注意:坚持的一个好规则是始终在边缘触发的进程中使用<=
。
现在让我们想想延迟();任务为#10ns;
我们使用当前代码获得的是:
time 0ns a = x;
time 1ns a = 1; //Posedge of clk
time 6ns a = 1; //Waiting on delay
time 11ns a = 0; //Delay completed
使用<=
,我认为您应该看到类似的行为。然而,当涉及到合成延迟时,#1ns
无法创建,整个事情将崩溃回到:
always @(posedge Clk) begin
a <= 1'b0;
end
使用硬件描述语言,一种好的方法是考虑我们想要暗示的硬件并用该语言描述它。构造always @(posedge Clk)
用于表示触发器,即每个时钟周期输出改变一次。在这个问题中,我们a
改变了3次值,从1个时钟边缘开始,我不知道你试图暗示什么硬件。
您无法提供内联可合成延迟。要使always @(posedge clk)
块可以合成,它们应该能够在零时间内执行。您需要引入状态机以在时钟边缘之间保持状态。我想我已经在my previous answer中提供了一个很好的例子来说明如何做到这一点。如果延迟是可编程的,请参阅mcleod_ideafix's answer。