作者pikachu2005 (Pikachu)
看板Electronics
標題[問題] verilog 計時器要如何停止
時間Fri Dec 31 18:09:04 2010
請問各位,我在寫ㄧ個計數器的程式~
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
1F:推 appendixisu:1.可以寫多個ALWAYS 12/31 22:44
2F:→ appendixisu:2.你的CLK1跟CLK2 頻率差多少?? 12/31 22:45
3F:→ appendixisu:3.假設CLK1跟2頻率一樣 OUT1也會少OUT2 "1"原因在於ee 12/31 22:46
4F:→ appendixisu:建議你第一個ALWAYS 也定義一下ee=0的時候的動作方式 12/31 22:48
5F:→ pikachu2005:CLK2大概是25Mhz,CLK1比較慢~大約是KHz等級~ 01/01 02:26
6F:→ pikachu2005:拍謝打錯~CLK1也是Mhz等級~大約是1MHz~10MHz~ 01/01 02:29
7F:→ bakerly:基本上你這樣寫亂跑是正常...你把兩個不同CLK產生的訊號隨 01/01 19:21
8F:→ bakerly:意拉來拉去...這樣的電路就算會動也會三不五時給你錯一下 01/01 19:23
9F:→ kingofgar:if (!rst) out1<=0; else out1<=(out1<5)?out1+1:out1 01/02 07:01
10F:→ kingofgar:if (!rst) out2<=0; else out2<=(out1<5)?out2+1:out2 01/02 07:02
11F:→ kingofgar:請問你是想要這樣的架構嗎?... 01/02 07:02
12F:→ pikachu2005:To bakerly大,請問我的程式要怎麼改會比較好? 01/02 17:32
13F:→ pikachu2005:To Kin大,因為CLK1跟2,頻率是一直送進去的~所以程式 01/02 17:34
14F:→ pikachu2005:不知道要怎麼改~讓CLK1的值計數到5次時~把CLK2的值丟 01/02 17:35
15F:→ pikachu2005:給out3,我在改看看~謝謝~ 01/02 17:36
16F:推 ycy:兩個clk不同步,在cross domain的訊號最好用1 bit就好 01/02 18:22
17F:→ pikachu2005:To Kin大,按照你的架構做出來了~^^謝謝大家的建議~ 01/02 19:23
18F:→ kingofgar:同yc大,最好把out1轉成gray code,再加上synchronizer 01/04 08:41
19F:→ kingofgar:還有你漏掉很多else..所以會亂跑也是有可能的 01/04 08:51
20F:→ uxijgil:問題可能會出在 clk2 posedge時 out5 穩不穩定不知道 01/05 01:56
21F:→ uxijgil:你的code是寫成把兩訊號當synchronous 但實際上他們並不 01/05 01:57
25F:→ sneak: //muxiv.com 01/04 22:15