如何在Verilog Synthesis中将for integer生成中的整数值与for循环中的二进制进行比较?

时间:2014-01-01 04:59:44

标签: verilog fpga xilinx system-verilog

你好朋友我还不知道如何在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; 请帮助我已经尝试过延迟生成使用计数器,但它对我不起作用.....如果您使用计数器知道相同的话请告诉我.. ....谢谢

2 个答案:

答案 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