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是高电平(但不是上升沿),计数值也会被清零。
问如何防止这一现象发生? 用同步复位
always @(posedge CLK)
begin
if(RST)
Counter=8'd0;
else if(CLK)
Counter=Counter+8'd1;
end aammoo 发表于 2012-6-28 23:40 static/image/common/back.gif
用同步复位
always @(posedge CLK)
begin
同步复位期间,CLK的脉冲会被忽略。因此我想设计成边沿复位的计数器。 本帖最后由 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 不存在这种电路。 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 岭上开花 发表于 2012-6-29 00:02 static/image/common/back.gif
rst_tmp
刚写错了{:sad:} ,应该把边沿检测放到单独的always块里,在4楼改了一下 岭上开花 发表于 2012-6-29 00:02 static/image/common/back.gif
rst_tmp
这是个时刻的问题,延时影响不大,在触发器触发的那一刻,输入的是什么输出就是什么。 本帖最后由 岭上开花 于 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位的计数器)
岭上开花 发表于 2012-6-29 00:13 static/image/common/back.gif
这是我刚刚试出来的写法,用了相对值暂存技术:
这个写的好,思路清晰,而且不容易出错。 学习一下
楼主的逻辑会出问题的, 典型的多时钟域问题.大把的逻辑毛刺.RST必须为电平触发, CLK为时钟. 这是由硬件电路决定的. 请问楼主怎么解决?? 这种电路是不可能解决的吗?
12l楼说的没错,9楼的方案会出现错误数据,不稳定。
页:
[1]