打印

求教:verilog编程实际开发中遇到的两个问题

[复制链接]
2072|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
rlzfx|  楼主 | 2009-9-12 22:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1 运行环境是cpld,外部时钟27M。因为有些信号不需要这么高的时钟,所以内部做了一个毫秒发生器,用毫秒发生器的输出做时钟,响应一些事件。这种做法,我在两个项目中都用过
  出现的现象是:在第一个项目中,编译时没有发生报警,在第二个项目中发生报警,说某些信号建立时间不够。
  怀疑:第一个项目中用毫秒发生器同步的逻辑较少,而且比较简单,第二个项目逻辑比较复杂,可能是因为比较复杂,所以时间不够

  我的问题:在cpld中编写毫秒发生器,然后用这个发生器做时钟,这中方法是否正规,能不能这样用?

2  在看一些fpga例程的时候,曾经看到过这样的编写方式
    always @(state)beging     (第一种写法)
    end
   但是我在看书时,也看到过,说在fpga中用verilog编程时,always事件只能用posedge,或者negedge,如
    always @(posedge state)begin   (第二种写法)
    end
   不能做电平事件,否则综合无法通过,我用电平编译时有时会出报警

   我的问题是,综合时,是支持第一种写法,还是支持第二种写法?

相关帖子

沙发
Fourier00| | 2009-9-12 23:01 | 只看该作者
第一个问题:用分频的时钟一般不推荐用,尤其是组合逻辑输出做时钟,组合逻辑可能有毛刺会出现问题
时钟一般是由专用的管脚或者由锁相环输出。
第二个问题:第一种写法是相当于是组合逻辑电路,而第二种是时序逻辑电路,不过没有复位
第二种是相当于是用state做了一个时钟,这样你的系统中无缘无故多出了一个时钟,而且这个时钟可能是组合逻辑产生,那样是很危险的,做设计一般用同步电路,所有的时序都在同一个时钟沿动作,

使用特权

评论回复
板凳
rlzfx|  楼主 | 2009-9-13 21:12 | 只看该作者
谢谢,又多懂了点,

使用特权

评论回复
地板
sheshichu| | 2009-9-24 10:28 | 只看该作者
学习了

使用特权

评论回复
5
一只小蜗牛| | 2009-9-25 13:28 | 只看该作者
关于第一个问题,做CPLD或FPGA时建议用同步设计,弃用异步设计,即使你的时钟是寄存器输出的没有毛刺的也不建议用。同步设计并不是让你在每一个时钟都在做事,但做的事肯定都在同一个时钟沿上。你的毫秒计数器输出的时钟就不要用了,你可以用毫秒计数器标出有效时钟的相位。
assign clk_en = divider_cnt == 32'h0;
always@(posedge clk or negedge rstn)
begin
      if (~rstn)
    abc <=1'b0;
  else if (clk_en)
    abc <= xxx ;
end
这是同步设计的基本思路,这会让你的电路很稳定,容易控制。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

9

帖子

0

粉丝