如何在verilog中使用计数器生成延迟,以便在Always块内进行合成和调用?

如何在verilog中使用计数器生成延迟,以便在Always块内进行合成和调用?,verilog,fpga,xilinx,system-verilog,intel-fpga,Verilog,Fpga,Xilinx,System Verilog,Intel Fpga,我想用计数器产生延迟,实际上在这里我用计数器在每次1位传输后产生延迟,以便更好地理解外部fpga引脚上的延迟,通过SPI串行LCD与之连接。因此,我创建了一个移位寄存器,移位1位,然后给出延迟,然后是下一位延迟 这是我的柜台代码: module spidelay( input wire clk, input wire enb, output reg sclkout ); reg [23:0] stmp; always @(posedge clk) begin

我想用计数器产生延迟,实际上在这里我用计数器在每次1位传输后产生延迟,以便更好地理解外部fpga引脚上的延迟,通过SPI串行LCD与之连接。因此,我创建了一个移位寄存器,移位1位,然后给出延迟,然后是下一位延迟

这是我的柜台代码:

module spidelay(
  input  wire clk,
  input  wire enb,
  output reg  sclkout
);
  reg [23:0] stmp;

  always @(posedge clk) begin
    if ( enb == 1 ) begin
      stmp = stmp+1;
      if( stmp[23] == 1 ) begin
        sclkout = 1'b1;
        stmp    = 24'b0;
       end
    end
    else begin
      stmp    = 24'b0;
      sclkout = 1'b0;
   end
 end
endmodule
朋友们,但问题是我不知道如何启用/启动计数器内始终块我的意思是,我不知道我们如何启动/启用计数器在线路,我们要产生延迟内始终块

现在这是我的顶层模块的代码,我想从中生成特定行的延迟-->>

 module Nokia_LCD(input clk,input switch,output OUT,output reset,inout sck,output cs);  
     wire clk;//On Board Clock
     wire switch;//Switch For RESET
     integer i;
     integer z;//Used for, for loop for generating delay
     reg signed OUT;//OUT for sending Data serially to LCD
     reg reset=1'b1;//To Reset LCD
     wire sck; //We select sck as inout because it taking input from counter Instance and then gives output to LCD..
     reg cs; //Chip select pin of lcd always set to zero 
     reg signed[8:0]out;//Register for Storing value of OUT
     reg [5:0]state =6'b000000; //Initialize states to Zero
     reg [7:0]finder; //Finder finds the state that was last present in it so that by this we again go to that state sequentially 
     reg [7:0]font[1:0][5:0];//2-D Array of 8 Bit For Font 
     reg [23:0]stmp=24'b00000_00000_00000_00000_0000;
     reg enb;
     wire sclkout;

     counter count1(clk,sck);//Instance of Counter1 for SCK Clock
     spidelay count2(clk,enb,sclkout);

    always@(posedge clk)
    begin
    case (state)

      /* Lcd Initialization starts from here*/
           6'b000000 : begin
           finder=8'b00000000;
           cs=1'b0;
             out=9'b0_00010001; //Using Command SLEEPOUT (Hex 0x11) - Exits LCD sleep mode
             state=6'b010001; 
           end

           6'b000001: begin
           finder=8'b00000001;
           cs=1'b0; 
             out=9'b0_00000011; //Using Command BSTRON (Hex 0x03) - Turns on booster voltage     
             state =6'b010001; 
             end 

      /******************************************************************************************************************/
      /************************************ State for SPI Data Transfer & Delay *****************************************/
      /******************************************************************************************************************/ 
           6'b010001:begin

           //We Use finder to find the state from which it Comes...

             if(finder==8'b00000000) //for 0
                     begin:close1         
                     cs=1'b0;
            for(i=0;i<=8;i=i+1)
            begin
            out=out<<<1;
            OUT=out[8];
              enb=1'b1;  <<<<<<<-----|This is the place where I want it to enable counter and it must stop here  for counting and during this time it not move for othe count of for loop......


            if(stmp[23]==1'b1)
             begin
             disable close1;
             end
             end
             state=6'b000001;//Go to State 000001(BSTRON)
         end    




       endcase  

     end //Always end


    endmodule

必须注意的是,朋友们,我对它进行了编辑,以便将注意力集中在错误点上……因此,如果您在语法中发现错误,请忽略它,但请帮助我,并给出一些建议,通过给出enb=1'b1,在Toppest模块的always块上生成延迟……

如果确实是用SystemVerilog,然后=='0将0填充到适当的宽度。Morgan先生,实际上我说的是我的最高模块的always块,先生,对不起,之前我没有在这里添加代码,因为我试图编辑我的代码,使其更易于学习,并将其指向错误行…先生,请先生帮助,我希望程序在我给enb=1'b1,然后在for循环的下一次计数中不再移动。。。。。。延迟后,它继续进行下一次计数…foor循环…@dave sir当我给出enb=1'b1时,我希望程序必须停止在我的最高模块中,然后不再继续进行下一次for循环计数。。。。。。在延迟之后,它继续进行下一次计数…foor循环。。。。先生,之前我没有添加我的toopest模块,但我没有添加它。请帮助我弄清楚……我已经扩展了我的答案,但不太清楚您所坚持的是什么。计数器可用于通过RTL中时钟周期的整数计数创建延迟。计数器可以通过启用信号进行控制,您只需要在启用时控制启用信号。您的意思是希望“程序”在for循环中暂停,同时它关闭并执行其他操作吗?for循环位于一个everys@posedge clk中,这意味着整个过程,for循环的每个迭代,每个clk执行一次。您可能需要创建一个更高级别的FSM有限状态机来控制它并对其排序。是的,Morgan先生,我的意思是当程序读取enb=1 in for loop时必须暂停/卡住,而不能继续进行下一次计数……先生,为此,我已经完成了在此之前的所有测量方法,我已完成任务,然后生成函数,然后使用@clk count=count+1;而不是enb=1;但最后,我认为为循环启用内部计数器可能会有所帮助..我意识到这个ENB=1技巧是我最后的希望。。。先生,有一段时间我觉得我使用了错误的方法来启用模块的计数器………先生,根据您的说法,是他们的任何不同的方法来为内部特定模块的I/O提供价值……。请帮助我,先生
if ( enb == 1 ) begin
  sclkout <= 1'b0;  //Reset by default
  stmp    <= stmp+1;

  if( stmp[23] == 1 ) begin //Counter target
    sclkout <= 1'b1;
    stmp    <= 24'b0;
  end
end
else begin
  //...
if ( enb == 1 ) begin
  if( stmp[23] == 1 ) begin //Counter target
    sclkout <= 1'b1;
    stmp    <= 24'b0;
  end
  else begin
    sclkout <= 1'b0;  //Reset by default
    stmp    <= stmp+1;
  end
end
else begin
  //...
always @ (posedge clk) begin
  if ( enb == 1'b0 ) begin
   // When enable bar is low this is Active
   stmp    <= stmp + 1'b1;
   // etc ...
  end
  //else begin
  //  Do Nothing (hold state)
  //end
end