接下来的这三类题目均是关于应用类的设计,以生活中的产品为题,考察我们的硬件语言描述应用到产品的能力。
题目1:顶层设计由子电路 A 和 B 各两个实例化组成,如下所示:
分析:其中IA1和IA2的表示的逻辑表达式由前面的练习可知为:z = (x^y) & x;IB1和IB2所表示的逻辑表达式为:z = (!x & !y) | (x&y)。
代码如下:
module top_module (input x, input y, output z);
wire in1,in2,in3,in4;
wire in5,in6;
assign in1 = (x^y)&x;
assign in2 = (!x & !y) | (x&y);
assign in3 = (x^y)&x;
assign in4 = (!x & !y) | (x&y);
assign in5 = in1 | in2;
assign in6 = in3 & in4;
assign z = in5^in6;
endmodule
仿真结果如下:
题目2:假设您正在设计一个电路来控制手机的振铃器和振动电机。每当电话需要从来电 (input ring) 响铃时,您的线路必须打开铃声 (output ringer = 1) 或电机 (output motor = 1),但不能同时打开两者。如果手机处于振动模式 (input vibrate_mode = 1),请打开电机。否则,请打开铃声。
设计提示:在设计电路时,人们通常必须“向后”考虑问题,从输出开始,然后向后工作到输入。这通常与人们如何看待(顺序,命令式)编程问题相反,在编程问题上,人们会首先查看输入,然后决定操作(或输出)。对于顺序程序,人们经常会认为“如果(输入是___)那么(输出应该是___)”。另一方面,硬件设计人员经常认为“(输出应该是___)当(输入是___)”。
上面的问题描述是以适合软件编程的命令式形式编写的(如果响铃然后这样做),因此您必须将其转换为适合硬件实现的更声明性的形式(assign ringer = ___
)。能够在两种风格之间思考和转换是硬件设计所需的最重要的技能之一。
分析:通过上述题目可知:当电路响铃时,很明显是与非门;当电路震动时,很明显是与门。
代码如下:
module top_module (
input ring,
input vibrate_mode,
output ringer, // Make sound
output motor // Vibrate
);
assign ringer = ring & !vibrate_mode; //响铃
assign motor = ring & vibrate_mode;//震动
endmodule
题目3:加热/冷却恒温器控制加热器(冬季)和空调(夏季)。实施一个电路,该电路将根据需要打开和关闭加热器、空调和鼓风机风扇。
恒温器可以处于以下两种模式之一:加热 (mode = 1
) 和冷却 (mode = 0
)。在加热模式下,当加热器太冷时打开(too_cold = 1
),但不要使用空调。在冷却模式下,当空调过热时打开(too_hot = 1
),但不要打开加热器。当加热器或空调打开时,还要打开风扇以循环空气。此外,用户还可以要求风扇打开(fan_on = 1
),即使加热器和空调关闭。
尝试仅使用assign
语句,看看是否可以将问题描述转换为逻辑门的集合。
分析:加热器模式下(output=heater),三输入很明显是与非门;在空调模式下(output = aircon),三输入很明显也是与非门,只是非门的位置有所不同;在风扇模式下(output = fan),三输入很明显是先与非后或的关系。
代码如下:
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&!aircon;
assign aircon = !mode&too_hot&!heater;
assign fan = ((mode&too_cold) | (!mode&too_hot)) |fan_on;
endmodule
输出结果如下:
题目4:计算输入向量中“1”的数量。为 3 位输入向量构建总体计数电路。
代码如下(采用for循环)
module top_module(
input [2:0] in,
output [1:0] out );
integer i;
always@(in)
begin
out = 2'b00;
for(i=0;i<3;i=i+1)
if(in[i] == 1)
out = out+2'b01;
else
out = out;
end
endmodule