if else & case語句分析
if..else語句特點:具有優先順序。if不滿足時,才執行else語句。
case 語句特點:沒有優先順序。
if..else
語句fpga
**實現:
module test(
input[1:0] sel_c,
input[1:0] data_c,
output reg data_out_c
);always@(*) //組合邏輯 用「=」不用「<=」
begin
if(sel_c[1])
data_out_c = data_c[1];
else if(sel_c[0])
data_out_c = data_c[0];
else
data_out_c = 0;
endendmodule
軟體編譯,檢視rtl檢視,quartusii: tools-netlist viewers-rtl viewer,如圖1所示:
圖1 rtl檢視
顯然,當資料選擇器1選通訊號sel_c[1]=1時,data_c[1]被輸出到data_out_c;當資料選擇器1 sel_c[1]=0 且資料選擇器2 sel_c[0]=1時,data_c[0]才能被輸出到data_out_c。可見,資料選擇器1的優先順序高於資料選擇器2。
上面**是2級巢狀(if..else if..),若是****現多級巢狀,很顯然,優先順序最高的響應速度最快,優先順序最低的響應最慢。電路(fpga**生成)的執行速度,受限於最低優先順序,所以不建議使用多級巢狀(會降低fpga的fmax),一般不要超過4級巢狀。可以考慮使用case語句,case語句是平行結構,沒有優先順序。
圖2 map檢視
發現,實際map對映後,**的優先順序被quartusii優化掉了,對映成沒有優先順序的硬體電路(與非門生成的組合邏輯)。rtl檢視是quartusii軟體綜合時生成的,綜合生成的是網表,顯示的圖形是呼叫標準單元的結果;而map是實際對映到fpga內部的電路,即最終的電路實現形式;但並不表示所有的if..else if..的多級巢狀都被軟體優化。
舉例:
module test(
input[2:0] sel_b,
input[2:0] data_b,
output reg data_out_b
);always@(*)//組合邏輯
begin
if(sel_b[2])
data_out_b = data_b[2];
else if(sel_b[1])
data_out_b = data_b[1];
else if(sel_b[0])
data_out_b = data_b[0];
else
data_out_b = 0;
endendmodule
注意:always塊中賦值的訊號,必須定義為 reg型,但並不等同於硬體電路會產生乙個暫存器。純組合邏輯電路中的reg訊號,等同於wire連線。
map檢視結果如圖3所示:
圖3 3級巢狀map圖
可見,3級巢狀下,map後的電路也是有優先順序的。
case
語句fpga
**實現:
always@(*)
begin
case(sel_b[2:0])
3'b1xx:
data_out_b = data_b[2];
3'b01x:
data_out_b = data_b[1];
3'b001:
data_out_b = data_b[0];
default:data_out_b = 0;
endcase
endmap檢視結果如圖4所示:
圖4 case語句map圖
可見,case語句實現的電路沒有優先順序,不影響電路的執行速度。
結論:
(1)邏輯上需要優先順序的,還是要用if..else if..語句;不需要的可以用case語句;
(2)**設計上還是慎用if..else if..的多級巢狀,多級巢狀會影響器件執行的速度。
日本語業務単語
最近日本語 一生懸命勉強 教 願 品目 延滯金 大體 無料 鏈結會計 目的 利子 実行 代替品 質問 用途 収入 必要 番號 送付 說明 科目 擔當者 変更 組織 固定 前払 金 事前 記述 含 資產 出力 既存 正常 位置 購買 該當 資料 対応 紹介 実際 帳票 請求書 予定 関係 移動 稅法 ...
提示語 要善用「提示語」
作為一名律師受託為當事人撰寫合同文字或其他法律文書是經常性工作。有關合同文字和法律文書的範本格式隨手可查,一般是不會出現差錯的。但是合同文字和法律文書的內容,卻是一百個人有一百種寫法,沒有統一的內容可轉殖。因為每個當事人委託律師代書法律文書的內容和期望達到的目的各不相同,特別是法律文書所涉及的事項是...
一級擬音語擬態語
一級擬音語擬態語 嫌 不 無奈 提心吊膽 堂 堂堂的 飄 落 撲簌簌 落下 捏一把汗 提心吊膽 1癟,不臌,2餓,空 3點頭哈腰 腹 1耷拉著2滑溜 3 時間 拖拖拉拉 又肥又大,肥大,人 肥胖,肌肉鬆弛 1肥大,2達達達地 吹喇叭 1蹣跚,搖晃 2猶豫不定 3糊里糊塗,信步而行,溜達 1 懸空的東...