OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 146|回复: 13

新手求救 这里如何延时2us

[复制链接]

  离线 

100

主题

662

帖子

0

精华

高级会员

Rank: 4

积分
868
金钱
868
注册时间
2011-10-9
在线时间
71 小时
发表于 2017-11-6 14:49:12 | 显示全部楼层 |阅读模式
1金钱
/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

回复

使用道具 举报

  离线 

48

主题

5977

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
9605
金钱
9605
注册时间
2014-4-1
在线时间
857 小时
发表于 2017-11-6 16:45:15 | 显示全部楼层
回复

使用道具 举报

  离线 

100

主题

662

帖子

0

精华

高级会员

Rank: 4

积分
868
金钱
868
注册时间
2011-10-9
在线时间
71 小时
 楼主| 发表于 2017-11-6 21:30:21 来自手机 | 显示全部楼层
高手能否举个例子,总想不好计数器的结构
回复

使用道具 举报

  离线 

482

主题

8万

帖子

30

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
117267
金钱
117267
注册时间
2010-12-1
在线时间
901 小时
发表于 2017-11-7 00:42:55 | 显示全部楼层
帮顶
回复

使用道具 举报

  离线 

48

主题

5977

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
9605
金钱
9605
注册时间
2014-4-1
在线时间
857 小时
发表于 2017-11-7 09:12:55 | 显示全部楼层
本帖最后由 xuande 于 2017-11-7 09:32 编辑

楼主肯定是刚开始学。

第一段,2Hz方波,
整体还行,但缺少复位信号,会造成第一个脉冲不可信。复位逻辑必须有。

第二段几个问题:
1、用 FIRE 电平触发事件而不是时钟,这会造成异步时序,带来潜在问题,比如逻辑冒险,很难解决的。
改正:
always    @(posedge   clk)
begin
      if    (FIRE)
            ............      else
            ............
end

2、也缺少复位逻辑。这情况在前一段只会造成头一个脉冲不可信,但在这一段会产生致命问题。
3、for循环,我只见过用在 testbench 里。因为 testbench 是软件理解软件,但是否能综合(就是用真实电路实现)就要划问号了。
    我不敢说绝对不可综合,但从来没见过这么用,我自己也从来不用。


回复

使用道具 举报

  离线 

48

主题

5977

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
9605
金钱
9605
注册时间
2014-4-1
在线时间
857 小时
发表于 2017-11-7 09:24:03 | 显示全部楼层
2us 延时,大概这样:
always    @( posedge clk ,  negedge rst )
begin
       if    ( !rst )
            begin
            counter2uS = 0;
            .........           (复位逻辑)            end
       else
            begin
            counter2uS =  counter2uS + 1;
            if      (counter2uS == 2uS)
                    .............
            else
                    .............
            end
end





回复

使用道具 举报

  离线 

100

主题

662

帖子

0

精华

高级会员

Rank: 4

积分
868
金钱
868
注册时间
2011-10-9
在线时间
71 小时
 楼主| 发表于 2017-11-7 11:44:30 | 显示全部楼层
本帖最后由 simms01 于 2017-11-7 11:50 编辑
回复错了 ,见楼下
回复

使用道具 举报

  离线 

100

主题

662

帖子

0

精华

高级会员

Rank: 4

积分
868
金钱
868
注册时间
2011-10-9
在线时间
71 小时
 楼主| 发表于 2017-11-7 11:49:46 | 显示全部楼层
本帖最后由 simms01 于 2017-11-7 11:52 编辑
xuande 发表于 2017-11-7 09:12
楼主肯定是刚开始学。

第一段,2Hz方波,

确实  刚开始学的

其中1  复位信号  RST 这个信号 是硬件的引脚信号 还是可以虚拟一个信号给他?

2 如果不用 for  这种要循环20多次的情况  怎么去解决?就是收到一个fire高电平 里面的事情干20次。难道一遍一遍列出来?

3. 计数器延时 例如 LED闪烁是可以 但是怎么在另一个 always里面调用这个延时?本来想用while的 发现在PGA里面 用while就是个傻子   

从stm32转过来 好多不能理解的:(  开发板教程只是给出例子也没解说,望大神帮忙解答下
回复

使用道具 举报

  离线 

48

主题

5977

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
9605
金钱
9605
注册时间
2014-4-1
在线时间
857 小时
发表于 2017-11-7 11:52:33 | 显示全部楼层
simms01 发表于 2017-11-7 11:49
确实  刚开始学的

其中1  复位信号  RST 这个信号 是硬件的引脚信号 还是可以虚拟一个信号给他?


下午有时间再答你。

回复

使用道具 举报

  离线 

100

主题

662

帖子

0

精华

高级会员

Rank: 4

积分
868
金钱
868
注册时间
2011-10-9
在线时间
71 小时
 楼主| 发表于 2017-11-7 12:37:20 | 显示全部楼层
本帖最后由 simms01 于 2017-11-7 12:44 编辑
xuande 发表于 2017-11-7 11:52
下午有时间再答你。

今天下载了某大神的例子  发现  直接是结构错了 不知道下面理解对不对   :( 就如 刚学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
回复

使用道具 举报

  离线 

48

主题

5977

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
9605
金钱
9605
注册时间
2014-4-1
在线时间
857 小时
发表于 2017-11-7 14:01:48 | 显示全部楼层
本帖最后由 xuande 于 2017-11-7 14:02 编辑
simms01 发表于 2017-11-7 11:49
确实  刚开始学的

其中1  复位信号  RST 这个信号 是硬件的引脚信号 还是可以虚拟一个信号给他?




1、是外部提供的硬件信号,和CPU复位端一样。

2、(自己替换begin 。。。。end)
begin
         if    ( !rst )
              {  a=0;   }
         else
              {
              if     (  a < 20 )
                    {
                    ...........(你要做的事)
                    a = a + 1;
                    }
              }
end


3、好像没法调用。
     最多就是用计数器的值做一下判断,比如等于1干什么,等于10干什么。
     但这和延时是两回事。




回复

使用道具 举报

  离线 

48

主题

5977

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
9605
金钱
9605
注册时间
2014-4-1
在线时间
857 小时
发表于 2017-11-7 14:15:02 | 显示全部楼层
本帖最后由 xuande 于 2017-11-7 14:22 编辑
simms01 发表于 2017-11-7 12:37
今天下载了某大神的例子  发现  直接是结构错了 不知道下面理解对不对   :( 就如 刚学C没懂main ...

红字的话很好,说明你已经深入考虑进去了。

解决的方法大概有:
1、设标志,如果在本次高电平期间已经做了一次动作,则设标志。
比如:
if     (!rst)
     {  flag = 0;    }
else
     {
     if     ((spi_clk)  && (flag == 0))
         {
          。。。。。。。。(你的事)
          flag = 1;
         }
     else if   (!spi_clk)
           {  flag = 0;  }
     }

2、记录下spi_clk 前天、昨天、今天的状态,自己检测上升沿。出现001、011,就是上升沿到了。




回复

使用道具 举报

  离线 

48

主题

5977

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
9605
金钱
9605
注册时间
2014-4-1
在线时间
857 小时
发表于 2017-11-7 14:26:30 | 显示全部楼层
本帖最后由 xuande 于 2017-11-7 14:27 编辑
simms01 发表于 2017-11-7 12:37
今天下载了某大神的例子  发现  直接是结构错了 不知道下面理解对不对   :( 就如 刚学C没懂main ...


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



回复

使用道具 举报

  离线 

100

主题

662

帖子

0

精华

高级会员

Rank: 4

积分
868
金钱
868
注册时间
2011-10-9
在线时间
71 小时
 楼主| 发表于 2017-11-7 17:30:10 | 显示全部楼层
xuande 发表于 2017-11-7 14:26
设计硬件,关键就是“并行”,这一点和CPU有本质区别。
1、每个always就是一个CPU,独立运行自己的线 ...

谢大神解答,搞技术在于折腾 发现在折腾中会了很多 呵

不过发现pga 的写法 限制比单片机的多很多 关键是没有像C那样的全局变量 一个变量只能在一个always 里面写,其他的只能读了。

感觉c是很随意的,最多运行效率差一点点  但是fpga 一个意思2个写法 占用的资源差很远............有点像汇编,要非常严谨。

再深入折腾下 。  谢谢大神:)   
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2017-11-22 19:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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