搜索
bottom↓
回复: 14

Verilog有没有可能设计出边沿复位的计数器?

[复制链接]

出0入0汤圆

发表于 2012-6-28 23:36:57 | 显示全部楼层 |阅读模式
本帖最后由 岭上开花 于 2012-6-28 23:38 编辑

大致就是:
输出Counter 8位二进制计数值
输入CLK信号,上升沿计数值+1
输入RST信号,上升沿计数值清零。

现在问题就是,如果进程写成
always @(posedge CLK or posedge RST)
begin
    if(RST)
        Counter=8'd0;
    else if(CLK)
        Counter=Counter+8'd1;
end
那么当CLK上升沿时,如果RST是高电平(但不是上升沿),计数值也会被清零。
问如何防止这一现象发生?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入90汤圆

发表于 2012-6-28 23:40:15 | 显示全部楼层
用同步复位
always @(posedge CLK)
begin
     if(RST)
         Counter=8'd0;
     else if(CLK)
         Counter=Counter+8'd1;
end

出0入0汤圆

 楼主| 发表于 2012-6-28 23:44:05 | 显示全部楼层
aammoo 发表于 2012-6-28 23:40
用同步复位
always @(posedge CLK)
begin

同步复位期间,CLK的脉冲会被忽略。因此我想设计成边沿复位的计数器。

出0入90汤圆

发表于 2012-6-28 23:49:31 | 显示全部楼层
本帖最后由 aammoo 于 2012-6-29 00:02 编辑

刚理解错了
reg rst_tmp;

always @(posedge CLK )
rst_tmp<=RST;

always @(posedge CLK )
begin
      if((!rst_tmp)&RST)
          Counter<=8'd0;
      else if(CLK)
          Counter<=Counter+8'd1;
end

出0入0汤圆

发表于 2012-6-28 23:53:47 | 显示全部楼层
不存在这种电路。

出0入0汤圆

 楼主| 发表于 2012-6-29 00:02:45 | 显示全部楼层
aammoo 发表于 2012-6-28 23:49
刚理解错了
reg rst_tmp;
always @(posedge CLK or posedge RST)

      rst_tmp<=RST;
      if((!rst_tmp)&RST)

这种写法比较取巧,但是总感觉比较怪异,完全就是看rst_tmp的延时吧。
但是延时是不确定的,如果需要设计一个较精确的频率计,这种复位方法总感觉不是一件好事情。

而且会报错:
Error (10200): Verilog HDL Conditional Statement error at TimingTest.v(11): cannot match operand(s) in the condition to the corresponding edges in the enclosing event control of the always construct

出0入90汤圆

发表于 2012-6-29 00:04:45 | 显示全部楼层
岭上开花 发表于 2012-6-29 00:02
rst_tmp


刚写错了 ,应该把边沿检测放到单独的always块里,在4楼改了一下

出0入90汤圆

发表于 2012-6-29 00:08:59 | 显示全部楼层
岭上开花 发表于 2012-6-29 00:02
rst_tmp

这是个时刻的问题,延时影响不大,在触发器触发的那一刻,输入的是什么输出就是什么。

出0入0汤圆

 楼主| 发表于 2012-6-29 00:13:25 | 显示全部楼层
本帖最后由 岭上开花 于 2012-6-29 00:21 编辑

这是我刚刚试出来的写法,用了相对值暂存技术:


module TimingTest(CLK,RST,Counter);

input CLK,RST;
output [4:0] Counter;

reg [4:0] Counter1,Counter2;
reg Rst_Tmp;

always @(posedge CLK)
begin
        Counter1<=Counter1+5'd1;
end

always @(posedge RST)
begin
        Counter2<=Counter1;
end

assign Counter=Counter1-Counter2;
endmodule

仿真结果(为了方便仿真,只写了5位的计数器)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-6-29 09:01:11 | 显示全部楼层
岭上开花 发表于 2012-6-29 00:13
这是我刚刚试出来的写法,用了相对值暂存技术:

这个写的好,思路清晰,而且不容易出错。

出0入0汤圆

发表于 2012-7-3 23:03:47 | 显示全部楼层
学习一下

出0入4汤圆

发表于 2012-7-4 10:59:52 | 显示全部楼层
楼主的逻辑会出问题的, 典型的多时钟域问题.  大把的逻辑毛刺.  RST必须为电平触发, CLK为时钟. 这是由硬件电路决定的.

出0入0汤圆

发表于 2014-3-10 23:20:30 | 显示全部楼层
请问楼主怎么解决??

出0入0汤圆

发表于 2014-3-10 23:22:44 | 显示全部楼层
这种电路是不可能解决的吗?

出0入0汤圆

发表于 2014-3-10 23:42:29 | 显示全部楼层
12l楼说的没错,9楼的方案会出现错误数据,不稳定。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 03:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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