作者:鬼蕾12_950_709 | 来源:互联网 | 2023-09-14 15:17
3.1.1~3.1.11略 3.1.12CombinecircuitsAandB moduletop_module(inputx,inputy,outputz);wireoz1,o
3.1.1~3.1.11
略
3.1.12 Combine circuits A and B
module top_module (input x, input y, output z);
wire oz1,oz2,oz3,oz4;
A IA1 (x,y,oz1);
B IB1 (x,y,oz2);
A IA2 (x,y,oz3);
B IB2 (x,y,oz4);
assign z=(oz1|oz2)^(oz3&oz4);
endmodule
module A(
input x,
input y,
output z);
assign z=(x^y)&x;
endmodule
module B(
input x,
input y,
output z);
assign z=~(x^y);
endmodule
3.1.13 Ring or vibrate
每当电话需要在来电时振铃(input ring),您的电路必须把响铃(output ringer = 1)或者振动(output motor = 1)打开,但不能同时打开两者。如果手机处于震动模式(input vibrate_mode = 1),打开震动,否则打开响铃。
module top_module (
input ring,
input vibrate_mode,
output ringer, // Make sound
output motor // Vibrate
);
assign ringer = ~vibrate_mode & ring ;
assign motor = vibrate_mode & ring;
endmodule
3.1.14 Thermostat
module top_module (
input too_cold,
input too_hot,
input mode,
input fan_on,
output heater,
output aircon,
output fan
);
assign heater=too_cold&mode;
assign aircon=too_hot&(~mode);
assign fan=fan_on|heater|aircon;
endmodule
3.1.15 3-bit population count
module top_module (
input [2:0] in,
output [1:0] out
);
// 这是3个输入的函数,一种方法是使用8项真值表
// in[2:0] out[1:0]
// 000 00
// 001 01
// 010 01
// 011 10
// 100 01
// 101 10
// 110 10
// 111 11
assign out[0] = (~in[2] & ~in[1] & in[0]) | (~in[2] & in[1] & ~in[0]) | (in[2] & ~in[1] & ~in[0]) | (in[2] & in[1] & in[0]);
assign out[1] = (in[1] & in[0]) | (in[2] & in[0]) | (in[2] & in[1]);
// 第二种方法:
// assign out = in[0]+in[1]+in[2];
// 第三种方法是在程序块(组合always块)中使用行为级描述,来直接实现真值表
/*
always @(*) begin
case (in)
3'd0: out = 2'd0;
3'd1: out = 2'd1;
3'd2: out = 2'd1;
3'd3: out = 2'd2;
3'd4: out = 2'd1;
3'd5: out = 2'd2;
3'd6: out = 2'd2;
3'd7: out = 2'd3;
endcase
end
*/
endmodule
3.1.16 Gates and vectors
你有一个4位输入向量in[3:0],我们想知道每位与其邻位之间的关系:
out_both:此输出向量的每一位都应指示相应的输入位及其左侧的邻居(较高索引)是否为“1”。例如,out_both[2] 应该表明 in[2] 和 in[3] 是否都为 1。由于 in[3] 左边没有邻居,所以答案很明显,所以我们不需要知道 out_both[3 ]。
out_any:该输出向量的每一位都应指示是否有任何相应的输入位及其右侧的邻居为“1”。例如,out_any[2] 应该指示 in[2] 或 in[1] 是否为 1。由于 in[0] 没有右边的邻居,答案很明显,所以我们不需要知道 out_any[0 ]。
out_different:此输出向量的每一位都应指示相应的输入位是否与其左侧的相邻位不同。例如,out_different[2] 应该指示 in[2] 是否不同于 in[3]。对于这部分,将向量视为环绕,因此 in[3] 左侧的邻居是 in[0]。
module top_module(
input [3:0] in,
output [2:0] out_both,
output [3:1] out_any,
output [3:0] out_different );
assign out_both=in[3:1]&in[2:0];
assign out_any=in[3:1]|in[2:0];
assign out_different=in[3:0]^{in[0],in[3:1]};
endmodule
3.1.17 Even longer vectors
module top_module(
input [99:0] in,
output [98:0] out_both,
output [99:1] out_any,
output [99:0] out_different );
assign out_both=in[99:1]&in[98:0];
assign out_any=in[99:1]|in[98:0];
assign out_different=in[99:0]^{in[0],in[99:1]};
endmodule