数字电路设计思想之硬件思维
数字电路设计思想之硬件思维
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