[問題] verilog 計時器要如何停止

看板Electronics作者 (Pikachu)時間13年前 (2010/12/31 18:09), 編輯推噓2(2024)
留言26則, 7人參與, 5年前最新討論串1/2 (看更多)
請問各位,我在寫ㄧ個計數器的程式~ input:clk1 clk2 reset output:out3 動作是 有兩個方波pulse輸入,分別是clk1跟clk2 當偵測reset為負緣時,就把計時的值清除為0 reset放開時,計時器同時開始對f1與f2計數~ 當f1值計數到5次時,就把f2值丟給out3輸出並停止計數(out3就不會在變) 當下一次按下reset時~整個電路在重新計時~ 我寫的程式如下: /////////////////////////////////////////////////////////////////// module counter1(reset,clk1,clk2,out3); input reset,clk1,clk2; output [8:0] out3; reg [8:0] out1; reg [8:0] out2; reg [8:0] out3; reg ee; //---------------------------------------// always@(posedge clk1 or negedge reset) begin if (!reset) out1=0; else if(ee==1) out1=out1+1; end //---------------------------------------// always@(posedge clk2 or negedge reset) begin if (!reset) out2=0; else if (out1<5) begin out2=out2+1; ee=1; end else begin ee=0; out3=out2; end end //---------------------------------------// endmodule /////////////////////////////////////////////////////////////////// 但是燒錄到FPGA裡面,用LED接出來看,結果還是錯誤(輸出的值亂跳)~@@ 因為我之前沒上過verilog,自己看書學,為了解決這問題,借了幾本verilog的書~ 試了很久還是失敗,請問我這程式這樣寫是不是有些用法錯誤? 另外請問,verilog裡面可以放多個always@()這個東西嗎?因為我看到範例程式 好像都只寫ㄧ個always@()? 謝謝~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 120.114.64.82

12/31 22:44, , 1F
1.可以寫多個ALWAYS
12/31 22:44, 1F

12/31 22:45, , 2F
2.你的CLK1跟CLK2 頻率差多少??
12/31 22:45, 2F

12/31 22:46, , 3F
3.假設CLK1跟2頻率一樣 OUT1也會少OUT2 "1"原因在於ee
12/31 22:46, 3F

12/31 22:48, , 4F
建議你第一個ALWAYS 也定義一下ee=0的時候的動作方式
12/31 22:48, 4F

01/01 02:26, , 5F
CLK2大概是25Mhz,CLK1比較慢~大約是KHz等級~
01/01 02:26, 5F

01/01 02:29, , 6F
拍謝打錯~CLK1也是Mhz等級~大約是1MHz~10MHz~
01/01 02:29, 6F

01/01 19:21, , 7F
基本上你這樣寫亂跑是正常...你把兩個不同CLK產生的訊號隨
01/01 19:21, 7F

01/01 19:23, , 8F
意拉來拉去...這樣的電路就算會動也會三不五時給你錯一下
01/01 19:23, 8F

01/02 07:01, , 9F
if (!rst) out1<=0; else out1<=(out1<5)?out1+1:out1
01/02 07:01, 9F

01/02 07:02, , 10F
if (!rst) out2<=0; else out2<=(out1<5)?out2+1:out2
01/02 07:02, 10F

01/02 07:02, , 11F
請問你是想要這樣的架構嗎?...
01/02 07:02, 11F

01/02 17:32, , 12F
To bakerly大,請問我的程式要怎麼改會比較好?
01/02 17:32, 12F

01/02 17:34, , 13F
To Kin大,因為CLK1跟2,頻率是一直送進去的~所以程式
01/02 17:34, 13F

01/02 17:35, , 14F
不知道要怎麼改~讓CLK1的值計數到5次時~把CLK2的值丟
01/02 17:35, 14F

01/02 17:36, , 15F
給out3,我在改看看~謝謝~
01/02 17:36, 15F

01/02 18:22, , 16F
兩個clk不同步,在cross domain的訊號最好用1 bit就好
01/02 18:22, 16F

01/02 19:23, , 17F
To Kin大,按照你的架構做出來了~^^謝謝大家的建議~
01/02 19:23, 17F

01/04 08:41, , 18F
同yc大,最好把out1轉成gray code,再加上synchronizer
01/04 08:41, 18F

01/04 08:51, , 19F
還有你漏掉很多else..所以會亂跑也是有可能的
01/04 08:51, 19F

01/05 01:56, , 20F
問題可能會出在 clk2 posedge時 out5 穩不穩定不知道
01/05 01:56, 20F

01/05 01:57, , 21F
你的code是寫成把兩訊號當synchronous 但實際上他們並不
01/05 01:57, 21F

08/13 19:07, , 22F
同yc大,最好把out https://noxiv.com
08/13 19:07, 22F

09/17 23:01, , 23F
//noxiv.com https://daxiv.com
09/17 23:01, 23F

11/11 16:04, , 24F
拍謝打錯~CLK1也是 https://muxiv.com
11/11 16:04, 24F

01/04 22:15, 5年前 , 25F
//muxiv.com
01/04 22:15, 25F

01/04 22:15, 5年前 , 26F
01/04 22:15, 26F
文章代碼(AID): #1D7Ql4ka (Electronics)
文章代碼(AID): #1D7Ql4ka (Electronics)