HDLBits学习------Problem 43~59

参考链接:HDLBits导学


Problem 43 Wire

        问题:实现如下电路

HDLBits学习------Problem 43~59

        解决:

module top_module (
    input in,
    output out);
	
assign out = in;

endmodule

Problem 44 GND

        问题:实现如下电路

HDLBits学习------Problem 43~59

        解决:

module top_module (
    output out);

assign out = 0;

endmodule

Problem 45 NOR

        问题:实现如下电路

HDLBits学习------Problem 43~59

        解决: 

module top_module (
    input in1,
    input in2,
    output out);
	
assign out = ~ (in1 | in2);

endmodule

Problem 46 Another gate

        问题:实现如下电路

HDLBits学习------Problem 43~59

        解决:

module top_module (
    input in1,
    input in2,
    output out);
	
assign out = in1 & ~in2;

endmodule

Problem 47 Two gates

        问题:实现如下电路

HDLBits学习------Problem 43~59

        解决:

module top_module (
    input in1,
    input in2,
    input in3,
    output out);
	
wire out1;
assign out1 = ~(in1 ^ in2);
assign out = in3 ^ out1;

endmodule

Problem 48 More logic gates

        问题:​ 本题希望我们用两输入的组合电路来实现如下功能,该电路共用于7个输出,具体情况如下:

  • out_and: a and b
  • out_or: a or b
  • out_xor: a xor b
  • out_nand: a nand b
  • out_nor: a nor b
  • out_xnor: a xnor b
  • out_anotb: a and-not b

        解决:

module top_module( 
    input a, b,
    output out_and,
    output out_or,
    output out_xor,
    output out_nand,
    output out_nor,
    output out_xnor,
    output out_anotb
);

assign out_and = a & b;
assign out_or = a | b;
assign out_xor = a ^ b;
assign out_nand = ~(a & b);
assign out_nor = ~(a | b);
assign out_xnor = ~(a ^ b);
assign out_anotb = a & ~b;

endmodule

Problem 49 : 7420 chip

        问题:7420 chip是拥有两组4输入的与非门芯片,本练习需要构造一个与7420 chip功能一样的电路,拥有8个输入与2个输出

HDLBits学习------Problem 43~59

        解决:

module top_module ( 
    input p1a, p1b, p1c, p1d,
    output p1y,
    input p2a, p2b, p2c, p2d,
    output p2y );

assign p1y = ~(p1a & p1b & p1c & p1d);
assign p2y = ~(p2a & p2b & p2c & p2d);

endmodule

Problem 50 Truth tables (真值表)

        问题:创建一个电路实现下面的真值表

HDLBits学习------Problem 43~59

HDLBits学习------Problem 43~59

 

        思路:真值表表达式的化简,卡洛图法和公式法(数电知识)

公式法:图来自上述参考链接

HDLBits学习------Problem 43~59

        解决:

module top_module( 
    input x3,
    input x2,
    input x1,  // three inputs
    output f   // one output
);

assign f = (!x3 & x2) | (x3 & x1);
    
endmodule

Problem 51 Two-bit equality

        问题: 创建一个两输入inputs A [1:0], B[1:0],输出为Z。当A 与 B 相等时,Z 输出为1, 否则为0

        解决:

module top_module ( input [1:0] A, input [1:0] B, output z ); 
	assign z = (A == B)? 1 : 0; 
endmodule

Problem 52 Simple circuit A

        问题:创建一个电路,其功能可以实现 z = (x ^ y) & x

        解决:

module top_module (input x, input y, output z);
    assign z = (x ^ y) & x;
endmodule

Problem 53 Simple circuit B

        问题:根据仿真时序图创建电路B

HDLBits学习------Problem 43~59

        思路:分析一下时序图可以看出是一个同或门的时序,不过同或没有符号表示,所以需要实验异或的非

        解决:

module top_module ( input x, input y, output z );
	assign z = ~(x ^ y);
endmodule

Problem 54 Combine circuits A and B

        问题:​ 根据子模块Problem 52 与 53来实现如下电路

HDLBits学习------Problem 43~59

        思路:构建A和B两个子电路,然后例化这两个电路来实现。有简单的写法,但感觉这样写更符合题目要求

        解决:

module top_module ( input x, input y, output z );
	
wire zA1,zA2,zB1,zB2;

assign z = (zA1 | zB1) ^ (zA2 & zB2);

A IA1(
	.x(x),
	.y(y),
	.z(zA1)
);
A IA2(
	.x(x),
	.y(y),
	.z(zA2)
);
B IB1(
	.x(x),
	.y(y),
	.z(zB1)
);
B IB2(
	.x(x),
	.y(y),
	.z(zB2)
);
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

Problem 55 Ring or vibrate

        问题:假设你正在设计一个电路来控制手机的振铃器和振动电机。当手机来电时(input ring),电路必须把震动( output motor = 1 )或响铃( output ringer = 1 )打开,但不能同时打开。当手机处于震动模式时( input vibrate = 1 ),则打开震动( output motor = 1 )。否则打开响铃。

我们尝试仅适用assign语句来实现该组合电路

HDLBits学习------Problem 43~59

         解决:

module top_module (
    input ring,
    input vibrate_mode,
    output ringer,       // Make sound
    output motor         // Vibrate
);

assign ringer = ring ? (vibrate_mode ? 0 : 1) : 0;
assign motor = ring ? (vibrate_mode ? 1 : 0) : 0;

//参考大佬写法
assign motor = ring & vibrate_mode;
assign ringer  = ring & (!vibrate_mode);

endmodule


Problem 56 Thermostat

        问题:一个冷/热恒温控制器可以同时在冬季和夏季对温度进行调节。设计一个电路,根据需要打开和关闭加热器、空调和鼓风机风扇。(本题可参照Problem 55 )

​ 恒温器可以处于两种模式之一:制热(mode = 1)和制冷(mode = 0)。在制热模式下,当温度过低时(too_cold = 1),打开加热器,但不要使用空调。在制冷模式下,当温度过高(too_hot = 1)打开空调,但不要打开加热器。当加热器或空调打开时,也打开风扇使空气循环。此外,即使加热器和空调关闭,用户也可以请求将风扇打开(fan_on = 1)

        思路:有点理解这种逆向思维的想法了,也就是真值表的做法,考虑输出为1的时候,输入应该是什么,这样就省去了判断条件了

        解决:

module top_module (
    input too_cold,
    input too_hot,
    input mode,
    input fan_on,
    output heater,
    output aircon,
    output fan
); 

assign fan = fan_on | heater | aircon;
assign heater = mode & too_cold;
assign aircon = !mode & too_hot;


endmodule

Problem 57 3-bit population count

        问题:​ 设计一个电路来计算输入中 ‘ 1 ’ 个数

        解决:

module top_module( 
    input [2:0] in,
    output [1:0] out );
	
assign out = in[0]+in[1]+in[2];

endmodule

Problem 58 Gates and vectors

        问题:​ 有一个4bit输入的电路,我们需要了解4bit输入数据之间的关系。

  • out_both: 输入的每一个bit均需要检测该bit位与其左侧(即高比特位)是否全为 ‘ 1 ’ 。 示例: out_both[2]应检测in[2] 与 in[3] 是否均为 ‘ 1 ’ 。因为in[3] 为输入的最高位,故我们无需检测out_both[3]
  • out_any: 输入的每一个bit均需要检测该bit位与其右侧(即低比特位)两者其中一个为 ‘ 1 ’ 。 示例: out_any[2]应检测in[2] 与 in[1] 两者其中一个为 ‘ 1 ’ 。因为in[0] 为输入的最低位,故我们无需检测out_any[0]
  • out_different: 输入的每一个bit均需要检测该bit位与其左侧(即高比特位)两者是否不同。 示例: out_different[2]应检测in[2] 与 in[3] 两者是否不同 。在本节中,我们将输入变成一个环,所以in[3]的左侧为in[0]

        思路:(本来想用for循环的,看了一眼大佬的写法)拼接牛逼

        解决:

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[2] & in[3]),(in[1] & in[2]),(in[0] & in[1])};
assign out_any = {(in[2] | in[3]),(in[1] | in[2]),(in[0] | in[1])};
assign out_different = {(in[3] ^ in[0]),(in[2] ^ in[3]),(in[1] ^ in[2]),(in[0] ^ in[1])};

endmodule

Problem 59 Even longer vectors

        问题:该题与P58类似,仅将输入从4bit改为100bit ( input [99:0] ),题目的其余要求均相同

        思路:大佬牛!!!(很好的想法)

        解决:

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[98:0] & in[99:1];
    assign out_any  = in[99:1] | in[98:0];
    assign out_different = in ^ {in[0],in[99:1]};

endmodule

上一篇:redhat 8.3 vnc 配置


下一篇:TS三斜线指令