岭上开花 发表于 2012-6-28 23:36:57

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

本帖最后由 岭上开花 于 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是高电平(但不是上升沿),计数值也会被清零。
问如何防止这一现象发生?

aammoo 发表于 2012-6-28 23:40:15

用同步复位
always @(posedge CLK)
begin
   if(RST)
         Counter=8'd0;
   else if(CLK)
         Counter=Counter+8'd1;
end

岭上开花 发表于 2012-6-28 23:44:05

aammoo 发表于 2012-6-28 23:40 static/image/common/back.gif
用同步复位
always @(posedge CLK)
begin


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

aammoo 发表于 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

health 发表于 2012-6-28 23:53:47

不存在这种电路。

岭上开花 发表于 2012-6-29 00:02:45

aammoo 发表于 2012-6-28 23:49 static/image/common/back.gif
刚理解错了
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

aammoo 发表于 2012-6-29 00:04:45

岭上开花 发表于 2012-6-29 00:02 static/image/common/back.gif
rst_tmp

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

aammoo 发表于 2012-6-29 00:08:59

岭上开花 发表于 2012-6-29 00:02 static/image/common/back.gif
rst_tmp

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

岭上开花 发表于 2012-6-29 00:13:25

本帖最后由 岭上开花 于 2012-6-29 00:21 编辑

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


module TimingTest(CLK,RST,Counter);

input CLK,RST;
output Counter;

reg 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位的计数器)

ahuang227 发表于 2012-6-29 09:01:11

岭上开花 发表于 2012-6-29 00:13 static/image/common/back.gif
这是我刚刚试出来的写法,用了相对值暂存技术:




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

wtwhappy 发表于 2012-7-3 23:03:47

学习一下

qinxg 发表于 2012-7-4 10:59:52

楼主的逻辑会出问题的, 典型的多时钟域问题.大把的逻辑毛刺.RST必须为电平触发, CLK为时钟. 这是由硬件电路决定的.

STM32LOU 发表于 2014-3-10 23:20:30

请问楼主怎么解决??

STM32LOU 发表于 2014-3-10 23:22:44

这种电路是不可能解决的吗?

grantlu 发表于 2014-3-10 23:42:29

12l楼说的没错,9楼的方案会出现错误数据,不稳定。
页: [1]
查看完整版本: Verilog有没有可能设计出边沿复位的计数器?