數字電路設計思想之硬件思維


數字電路設計思想之硬件思維

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM