取某個(gè)信號(hào)的上升沿或下降沿信號(hào)
取一個(gè)信號(hào)的上升沿或下降沿信號(hào),可以通過(guò)將信號(hào)delay后,然后將原信號(hào)和delay信號(hào),通過(guò)不同的與非操作,獲取上升沿信號(hào)或下降沿信號(hào): 階段一: reg delay; // delay信號(hào) always @ ( posedge clk or negedge rstn ) if( !rstn ) delay <= 0; else delay <= orig;? ?// orig是原信號(hào) wire pos_signal = orig && ( ~delay ); // 原信號(hào)上升沿位置處產(chǎn)生的pulse信號(hào) wire neg_signal = ( ~orig ) && delay; // 原信號(hào)下降沿位置處產(chǎn)生的pulse信號(hào) 階段二: 上述操作會(huì)存在亞穩(wěn)態(tài)問(wèn)題,并且得到的上升沿信號(hào)pos_signal和下降沿信號(hào)neg_signal無(wú)法被原采樣時(shí)鐘clk采樣。正確做法是,先將原信號(hào)用采樣時(shí)鐘delay 2次(打兩拍),得到和采樣時(shí)鐘同時(shí)鐘域的信號(hào)delay2,然后再按上述方法獲取上升沿和下降沿信號(hào),這時(shí)得到的上升沿或下降沿就可以被原采樣時(shí)鐘采樣。 例句如下: reg ori_signal;// 需取上升沿或下降沿的原信號(hào) reg delay1; reg delay2; always @ ( posedge clk or negedge rstn ) if( !rstn ) delay1 <= 0; else delay1 <= ori_signal;? ? always @ ( posedge clk or negedge rstn ) if( !rstn ) delay2 <= 0; else delay2 <= delay1;? // delay2 已與clk同域 reg delay3; always @ ( posedge clk or negedge rstn ) if( !rstn ) delay3 <= 0; else delay3 <= delay2;? ? wire pos_signal = delay2 && ( ~delay3 ); // 原信號(hào)上升沿位置處產(chǎn)生的pulse信號(hào) wire neg_signal = ( ~delay2 ) && delay3; // 原信號(hào)下降沿位置處產(chǎn)生的pulse信號(hào) 上升沿電路如下: ? ? ? ?注意:前兩個(gè)觸發(fā)器的運(yùn)用就是起同步作用,將某個(gè)信號(hào)同步到采樣時(shí)鐘域,以后要重點(diǎn)注意使用。 階段三: 用階段二的語(yǔ)句會(huì)比較繁瑣,可以用下述語(yǔ)句簡(jiǎn)化: reg[2:0] delay; always @ ( posedge clk or negedge rstn ) if( !rstn ) delay <= 0; else delay <= { delay[1:0], ori_signal} ; // ori_signal是原信號(hào) wire pos_signal = delay[1] && ( ~delay[2] ); // 原信號(hào)上升沿位置處產(chǎn)生的pulse信號(hào) wire neg_signal = ( ~delay[1] ) && delay[2]; // 原信號(hào)下降沿位置處產(chǎn)生的pulse信號(hào)
Verilog中clk為什么要用posedge,而不用negedge
posedge是上升沿,電平從低到高跳變
negedge是下降沿,電平從高到低跳變
對(duì)于典型的counter邏輯
always @(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
counter <= 24'd0;//十進(jìn)制0
else if(counter < led_time) begin
flag_counter = 1'b0;
counter <= counter + 1'b1;
end
else begin
counter <= 24'd0;
flag_counter = 1'b1;
end
end
clk為什么要用posedge,而不用negedge呢?
一般情況下,系統(tǒng)中統(tǒng)一用posedge,避免用negedge,降低設(shè)計(jì)的復(fù)雜度,可以減少出錯(cuò)。
在ModelSim仿真中,時(shí)鐘是很?chē)?yán)格的,但是在真實(shí)的晶振所產(chǎn)生的clock卻是不嚴(yán)格的,比如高電平和低電平的時(shí)間跨度不一樣,甚至非周期性的微小波動(dòng)。如果只使用posedge,則整個(gè)系統(tǒng)的節(jié)拍都按照clock上升沿對(duì)齊,如果用到了negedge,則系統(tǒng)的節(jié)拍沒(méi)有統(tǒng)一到一個(gè)點(diǎn)上。上升沿到上升沿肯定是一個(gè)時(shí)鐘周期,但是上升沿到下降沿卻很可能不是半個(gè)周期。這都會(huì)出現(xiàn)問(wèn)題。
FPGA特有的東西:Global CLK。FPGA內(nèi)部有專(zhuān)門(mén)的CLK“線(xiàn)”,和一般的邏輯門(mén)的走法不一樣,目的是為了保證整個(gè)FPGA片內(nèi)的時(shí)鐘一致,這個(gè)東西就叫GlobalCLK
審核編輯 :李倩
-
Verilog
+關(guān)注
關(guān)注
28文章
1351瀏覽量
110139 -
觸發(fā)器
+關(guān)注
關(guān)注
14文章
2000瀏覽量
61197 -
上升沿
+關(guān)注
關(guān)注
0文章
3瀏覽量
1787
原文標(biāo)題:Verilog學(xué)習(xí)筆記
文章出處:【微信號(hào):gh_9d70b445f494,微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論