数字电路设计思想之硬件思维

数字电路设计思想之硬件思维

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

posted @ 2021-11-01 13:44  吃豆熊  阅读(427)  评论(0编辑  收藏  举报