· 時鐘控制執(zhí)行順序·
上文解釋了DL程序的并行性,但在設(shè)計中需要像C/C++語言的串行控制功能,如先接收外部配置指定,然后接收數(shù)據(jù)并完成模塊內(nèi)部配置,再將配置結(jié)果反饋到外部,這需要通過時間的精確定位來獲取嚴格的先后關(guān)系。
那么怎么來實現(xiàn)呢其實很簡單,假設(shè)全部事件需要5個時鐘周期,那么利用一個周期為5的循環(huán)計數(shù)器來實現(xiàn)。在計數(shù)器為1的時候,完成事件1;在計數(shù)器為2的時候,完成事件2:……如此循環(huán)即可??偨Y(jié)起來就是按照時鐘節(jié)拍來完成串行控制。當(dāng)然,這樣的電路在FPGA資源的利用上是存在浪費的,因為在執(zhí)行事件1,用于執(zhí)行事件2,3,4,5的邏輯處于等待狀態(tài),但其卻始終占用著邏輯資源,也就是這部分電路沒有使能,但是依然存在于FPGA內(nèi)部。
· 實例分析·
請看如下代碼,建議手動輸入到ise里面,動手綜合后看看實現(xiàn)的RTL圖,看懂電路原理。
moduleclk_module(clk,reset,a1,y1,y2);
inputclk;
inputreset;
input[7:0]a1;
output[7:0]y1,y2;
reg[7:0]y1,y2;
reg[1:0]cnt;
always@(posedgeclk)begin
if(!reset)begin
cnt<=?0;??
y1<=?0;??
y2<=?0;??
end
elsebegin
if(cnt==2'b11)
cnt<=?2'b00;??
else
cnt<=?cnt?+?2'b01;??
//------------//
case(cnt)
2'b00:begin
y1<=?a1?+?2'b01;??
y2<=?y2;??
end
2'b01:begin
y1<=?y1;??
y2<=?y1?+?2'b01;??
end
default:begin
y1<=?y1;??
y2<=?y2;??
end
endcase
end
end
endmodule
上述代碼綜合后RTL圖如下,淺藍色圓圈圈住的是生成的3個加法器,就是計算cnt和y1,y2的3個加法器。黃色方框里面的是觸發(fā)器,負責(zé)將結(jié)果輸出和反饋到加法器輸入。
仿真的波形圖如下圖,可以看出,每4個時鐘周期計算一次結(jié)果,y1永遠比y2提前一個時鐘周期出結(jié)果,y1的值永遠在捕捉到cnt=0的一個上升沿更新,y2永遠在捕獲到cnt=1的上升沿更新。這也是造成y1提前一周期的原因,所有的狀態(tài)翻轉(zhuǎn)都是根據(jù)cnt的狀態(tài)變化來的,而cnt的變化是時鐘節(jié)拍決定的。大家理解好這個例程,也就明白了如何用時鐘操控電路,按照你的想法去運行,同時學(xué)會了一段式狀態(tài)機的應(yīng)用。
-
C語言
+關(guān)注
關(guān)注
180文章
7594瀏覽量
135858 -
C++
+關(guān)注
關(guān)注
21文章
2100瀏覽量
73453
原文標題:面向硬件的設(shè)計思維--時鐘是電路的實際控制者
文章出處:【微信號:HaveFunFPGA,微信公眾號:玩兒轉(zhuǎn)FPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論