數位電路設計思想之硬體思維

吃豆熊發表於2021-11-01

數位電路設計思想之硬體思維

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 輸出結果

圖片alt

圖1 降溫模式時序圖

圖片alt

圖2 升溫模式時序圖

---

原創教程,轉載請註明出處吃豆熊:數位電路設計思想之硬體思維

參考資料:HDLBits

相關文章