作者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/m.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