作者Leadgen (新竹~)
看板Electronics
标题Re: [问题] verilog reset问题
时间Sun Jun 1 11:47:23 2014
How about this?
======
reg reset_d,reset_2d;
wire reset_r;
always @(posedge i_clk or negedge i_rts) begin
if (!i_rts) cnt <= 0 ;
else if (!reset_r) cnt <= 0 ;
else cnt <= cnt + 1'b1 ;
end
always @(posedge i_clk or negedge i_rts) begin
if(!i_rts) {reset_2d,reset_d}<=2'b0;
else {reset_2d,reset_d}<={reset_d,reset};
end
assign reset_r = !reset_2d & reset_d;
======
※ 引述《light0617 (期待寒假)》之铭言:
: 各位大大好
: 我最近在写码表上一个reset的功能
: 遇到了一个问题
: 下面是部分CODE
: input reset;//按钮reset 每按一次重设
: input i_clk;
: input i_rts;//原本的东西
: reg r_reset=1'b0;
: reg cnt=1'b0;
: <版本一>
: always @(reset)
: begin
: cnt<=0;
: else
: always @(posedge i_clk , negedge i_rts)
: begin
: if(i_rts==0 ) cnt<=0;
: else cnt<=cnt+1b'1;
: end
: 我在ModelSim compile没问题 但在Quartus 说cnt不能设定2次
: 後来改了一下
: <版本二>
: always @(reset)
: begin
: if(cnt==0) r_reset<=1'b0;
: else r_reset<=1'b1;
: else
: always @(posedge i_clk , negedge i_rts)
: begin
: if(i_rts==0 || r_reset==1'b1) cnt<=0;
: else cnt<=cnt+1b'1;
: end
: 我在ModelSim compile没问题 但在Quartus 说
: Error: Can't elaborate top-level user hierarchy
: 应该是不能让r_reset和cnt放在两个always上??
: 所以
: 请教各位大大要如何实做reset按钮呢><
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 182.234.8.253
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/Electronics/M.1401594445.A.4A4.html
1F:推 dasala:reset好像没宣告,敲两T是怕metastable吗?但是i_rst,还是 06/01 15:44
2F:→ dasala:会有问题 06/01 15:44
3F:推 dasala:sorry,原本宣告在原po的发文里 06/01 15:48
4F:→ dasala:同步reset_r,应该是H触发吧 06/01 16:24
5F:推 light0617:谢谢大大 回应>< 06/01 20:07
6F:→ Leadgen:敲两下是为了metastable和为了造rising edge。 06/02 07:47
7F:→ Leadgen:非同步的reset要使用本来就有其风险,就让原po自己想像吧. 06/02 07:47
8F:→ Leadgen:若是想要reset进来,按住就一直reset,就不用造rising了. 06/02 07:49
9F:→ Leadgen:i_rst的这种写法,你有合成过,就知道会长什麽样子。 06/02 07:49
10F:→ Leadgen:else if (!reset_r) cnt <= 0 ; //这行!要拿掉才是对的。 06/03 08:29
11F:推 appendixisu:我的话会把RESET BUF3层 拿2.3层来用避免timing issue 06/03 11:44
12F:→ Leadgen:也可以,敲三次。 06/04 07:58