數字電路設計思想之硬件思維
1 硬件思維與軟件思維的差異
Verilog HDL(HDL:Hardware DescripTIon Language)作為一種硬件描述語言,其本質為描述了實際的硬件電路。因此雖然語法上與c有一定的相似度,但在實際設計上有截然不同的思維方式,即硬件思維和軟件思維的差異。因此verilog不追求代碼簡潔,只追求以最合理的方案把代碼轉化為實際的硬件電路,實現需求的同時達到面積與速度較好。需要注意的是,能夠綜合的代碼最后轉化為的是實際的電路,因此我們在設計代碼的過程中就應對電路的構造,信號在其中的傳輸有着清晰的認知。
2 硬件思維實例
在設計電路的過程中,硬件工程師常常反向思考問題,即從輸出開始,再反向思考輸入。這與軟件編程(順序式、命令式)的方式剛好相反。對於軟件程序,人們通常會認為“如果輸入是什么,那么輸出應該是什么”。而硬件設計師經常認為“當輸出是什么,輸出應該是什么”。對於硬件工程師來說,能夠在兩種風格之間進行思考和轉換是最重要的技能之一。在這里,給出如下例子,展示硬件思維和軟件思維下的電路設計之間的差異及優劣,幫助理解為什么需要用硬件思維設計電路。
例:在空調中,一個升溫/降溫溫度控制器控制着熱風機(在冬天)和冷風機(在夏天)。現需要實現一個電路來控制熱風機、冷風機及風扇。溫控器有兩種模式:加熱模式(mode= 1)和冷卻模式(mode= 0)。在加熱模式下,當溫度過低(too_cold = 1)時,打開熱風機,但是不打開冷風機。在制冷模式下,如果溫度過高(too_hot = 1),則打開冷風機,但不要打開熱風機。當熱風機或冷風機打開時,打開風扇使空氣循環(fan =1)。此外,用戶還可以要求單獨打開風扇(fan_on = 1),即使冷風機和熱風機均關閉。
2.1 正向思維下的電路
在正向的思維方式中,我們需要考慮的是(mode, too_cold, too_hot,fan_on)的狀態來調控輸出,其實現如下:
在這種思維方式下,我們關注的是輸入,那么隨着輸入個數的增加,case的數量將會指數型增長,代碼會變得冗余且易讀性差。而實際上,我們需要關注的只是輸出的值是否正確
module top_module (
input too_cold,
input too_hot,
input mode,
input fan_on,
output heater,
output aircon,
output fan
);
always@(*)begin
if(fan_on == 1'b1)
begin
fan = 1'b1;
if(mode == 1)begin
if(too_cold == 1'b1)begin
heater = 1'b1;
aircon = 1'b0;
end
else begin
heater = 1'b0;
aircon = 1'b0;
end
end
else begin
if(too_hot == 1'b1)begin
heater = 1'b0;
aircon = 1'b1;
end
else begin
heater = 1'b0;
aircon = 1'b0;
end
end
end
else
begin
if(mode == 1)begin
if(too_cold == 1'b1)begin
heater = 1'b1;
aircon = 1'b0;
fan = 1'b1;
end
else begin
heater = 1'b0;
aircon = 1'b0;
fan = 1'b0;
end
end
else begin
if(too_hot == 1'b1)begin
heater = 1'b0;
aircon = 1'b1;
fan = 1'b1;
end
else begin
heater = 1'b0;
aircon = 1'b0;
fan = 1'b0;
end
end
end
end
endmodule
2.2 逆向思維下的電路
在逆向的思維方式中,我們只需要考慮輸出(fan, heater, aircon)的狀態即可,其實現如下:
在這種思維方式下,我們聚焦輸出,僅構造輸出部分需求的電路即可,極大的減少了邏輯資源的使用,同時也規避了大量的條件判斷帶來的優先級問題。而二者的輸出結果完全一致,這就是逆向思維的好處。
module top_module (
input too_cold,
input too_hot,
input mode,
input fan_on,
output heater,
output aircon,
output fan
);
assign heater = mode && too_cold;
assign aircon = ~mode && too_hot;
assign fan = fan_on || heater || aircon;
endmodule
2.3 輸出結果
圖1 降溫模式時序圖
圖2 升溫模式時序圖
---
原創教程,轉載請注明出處吃豆熊:數字電路設計思想之硬件思維
參考資料:HDLBits