发 帖  
原厂入驻New

请问这里如何延时2us

529 延时
分享
/LED
always @(posedge CLK)
begin
        CNT_LED = CNT_LED + 1'b1;
        IF(CNT_LED==28'h17d7840)begin        //2HZ输出
        LED = !LED;                                                        //LED取反        
        CNT_LED = 28'd0;                                        //清除计数
        end
        
end
always @(posedge FIRE)                //上升沿事件
begin
        
                        OK_OUT = 0;
                           for (a=9'd0;a<22;a=a+1)
                           begin
                           
                           ADDR_OUT[a]=1;
                           
                                    
                            for (i=9'd0;i<14;i=i+1)
                                        begin
                                       
                                       
                                                        DATA_OUT=!Input_Cache[Xrom[a*i+i+1]];
                                        //<<<<<<<<<<<<<<<<<<<这里要求延时2us
                                       
                                end
                           
                           
                        
                         end
                                OK_OUT = 1;
end
0
2019-4-29 02:00:49   评论 分享淘帖 邀请回答
17个回答
放下了几个月  这2天临时有空 又拿出来折腾了下 居然很快就想通并调试成功了
记录下心得
FPGA是硬件模式并行系统 ,所以我的理解是 全部触发都最好基于时钟。 为了保持第一个信号逻辑 必须有RST 逻辑。
其次 ,之前百思不得解的延时问题。  在FPGa里面没有延时 只有时序。 所以目前理解正确的方式 应该是建立一个 2us的时钟分频 然后置标志 来处理分频时间点达到目的。
因为是并行 就算时钟每次触发进入程序,只要状态机的状态没变 其实什么都没变。 所以这里只需要改变状态机即可。
时钟分频输出标记
always @(posedge CLK  )
begin
   
       
if (fire == 1)  //RST=0 重启
        begin
        CNT_2us =0;       
        H2us=1;
        L2us=0;
        c=0;
        d=1;
        end
       
        if(fire == 0 )
        begin
       
                                 CNT_2us = CNT_2us + 1'b1;
                                 CNT_1us = CNT_1us + 1'b1;
                                 
                                 
                                 if (CNT_1us == 16'h40 & c == 1)  //窄周期
                                 begin
                                 H2us=1;
                                 L2us=0;
                                 CNT_2us=0;
                                 d=1;
                                 c=0;
                                 
                                 end
                                 
                                 
                                 if(CNT_2us==16'h65 & d == 1) //宽周期
                                 begin        //2HZ输出
                                 H2us=0;
                                 L2us=1;
                                 CNT_1us=0;
                                 c=1;
                                 d=0;
                                // L2us=!L2us;                               
                                 CNT_2us = 16'd0;                                        //清除计数
                         end
                                 
         end
end
然后通过标记改变状态
2019-4-29 06:22:14 评论

举报

2019-4-29 06:34:09 评论

举报

高手能否举个例子,总想不好计数器的结构
2019-4-29 06:43:16 评论

举报

楼主肯定是刚开始学。
第一段,2Hz方波,
整体还行,但缺少复位信号,会造成第一个脉冲不可信。复位逻辑必须有。
第二段几个问题:
1、用 FIRE 电平触发事件而不是时钟,这会造成异步时序,带来潜在问题,比如逻辑冒险,很难解决的。
改正:
always    @(posedge   clk)
begin
      if    (FIRE)
            ............      else
            ............
end
2、也缺少复位逻辑。这情况在前一段只会造成头一个脉冲不可信,但在这一段会产生致命问题。
3、for循环,我只见过用在 testbench 里。因为 testbench 是软件理解软件,但是否能综合(就是用真实电路实现)就要划问号了。
    我不敢说绝对不可综合,但从来没见过这么用,我自己也从来不用。
2019-4-29 07:17:17 评论

举报

2us 延时,大概这样:
always    @( posedge clk ,  negedge rst )
begin
       if    ( !rst )
            begin
            counter2uS = 0;
            .........           (复位逻辑)            end
       else
            begin
            counter2uS =  counter2uS + 1;
            if      (counter2uS == 2uS)
                    .............
            else
                    .............
            end
end
2019-4-29 07:25:46 评论

举报

确实  刚开始学的
其中1  复位信号  RST 这个信号 是硬件的引脚信号 还是可以虚拟一个信号给他?
2 如果不用 for  这种要循环20多次的情况  怎么去解决?就是收到一个fire高电平 里面的事情干20次。难道一遍一遍列出来?
3. 计数器延时 例如 LED闪烁是可以 但是怎么在另一个 always里面调用这个延时?本来想用while的 发现在PGA里面 用while就是个傻子   
从stm32转过来 好多不能理解的:(  开发板教程只是给出例子也没解说,望大神帮忙解答下
2019-4-29 08:04:47 评论

举报

2019-4-29 08:20:32 评论

举报

今天下载了某大神的例子  发现  直接是结构错了 不知道下面理解对不对   :( 就如 刚学C没懂main一样
always    @( posedge clk ,  negedge rst )   《《===这玩意就像 单片机的  main()
begin
   if (!rst)
  begin
    ...各种变量信号 赋初值
  end
  else
  begin
    ...这里是程序  类似单片机的大循环
   例如  if (spi_clk)   //<<==问题是 当这个spi_ck 比 CLK 要宽很多 那么 这里不是被执行很多次? 每次CLK上升沿+ spiclk高电平  就执行一次
    begin
   end
   
  end
end
2019-4-29 08:39:42 评论

举报

1、是外部提供的硬件信号,和CPU复位端一样。
2、(自己替换begin 。。。。end)
begin
         if    ( !rst )
              {  a=0;   }
         else
              {
              if     (  a < 20 )
                    {
                    ...........(你要做的事)
                    a = a + 1;
                    }
              }
end
3、好像没法调用。
     最多就是用计数器的值做一下判断,比如等于1干什么,等于10干什么。
     但这和延时是两回事。
2019-4-29 08:47:23 评论

举报

红字的话很好,说明你已经深入考虑进去了。
解决的方法大概有:
1、设标志,如果在本次高电平期间已经做了一次动作,则设标志。
比如:
if     (!rst)
     {  flag = 0;    }
else
     {
     if     ((spi_clk)  && (flag == 0))
         {
          。。。。。。。。(你的事)
          flag = 1;
         }
     else if   (!spi_clk)
           {  flag = 0;  }
     }
2、记录下spi_clk 前天、昨天、今天的状态,自己检测上升沿。出现001、011,就是上升沿到了。
2019-4-29 08:53:24 评论

举报

设计硬件,关键就是“并行”,这一点和CPU有本质区别。
1、每个always就是一个CPU,独立运行自己的线程。
2、任何一个变量,只能在一个线程里改写,
     其他线程不能改写它,否则就错了,
     在其他线程可以读,比如根据它的值来做点事,为1干什么,2干什么,5干什么,之类。
2019-4-29 09:07:43 评论

举报

谢大神解答,搞技术在于折腾 发现在折腾中会了很多 呵
不过发现pga 的写法 限制比单片机的多很多 关键是没有像C那样的全局变量 一个变量只能在一个always 里面写,其他的只能读了。
感觉c是很随意的,最多运行效率差一点点  但是fpga 一个意思2个写法 占用的资源差很远............有点像汇编,要非常严谨。
再深入折腾下 。  谢谢大神:)   
2019-4-29 09:16:16 评论

举报

你延时是要对哪个信号延迟?是不是想对上一句执行完后延时?这不是c语言哦
2019-4-29 09:22:03 评论

举报

刚学一个学期,看到always的时候,吓得我连忙去翻课本,what 没学过always语句呀
意识中都是process的进程语句,看到后面,感觉always和process好像,
2019-4-29 09:36:41 评论

举报

PGA就是入门难点 理解了只有还是挺好处理事情的
例如这个帖子 可以
always    @( posedge clk ,  negedge rst ) 
begin
这里设置标志  例如  2us 到了 h2us=1   可以理解为分频也可以理解为定时器
end
然后应用
if ( FIRE==1 &&  H2us==1)
这样就可以实现精确的时序输出
2019-4-29 09:53:23 评论

举报

只有小组成员才能发言,加入小组>>

303个成员聚集在这个小组

加入小组

热门话题

创建小组步骤

关闭

站长推荐 上一条 /5 下一条

快速回复 返回顶部 返回列表