[Verilog18]HDLBits习题_Basic Gates

HDLBits习题讲解_Basic Gates

  • 本章节无新知识点,主要对之前所学知识进行加强巩固

Wire

  • 题目要求,编写代码,将输入端口in和输出端口out连接。代码如下:
module top_module (
    input in,
    output out);
	assign out = in;
endmodule

GND

  • 题目要求,编写代码,将输出端口out接地。代码如下:
module top_module (
    output out);
	assign out = 1'b0;
endmodule

NOR

  • 题目要求,编写代码,实现一个或非门。代码如下:
module top_module (
    input in1,
    input in2,
    output out);
    assign out =~(in1 | in2);
endmodule

Another gate

  • 题目要求,编写代码,实现上图所示的门电路。代码如下:
module top_module (
    input in1,
    input in2,
    output out);
    assign out = in1 & (~in2);
endmodule

Two gates

  • 题目要求,编写代码,实现上图所示的级联门电路。代码如下:
module top_module (
    input in1,
    input in2,
    input in3,
    output out);
    assign out = (~(in1^in2)) ^ in3;
endmodule

More logic gates

  • 尝试同时建立几个逻辑门,建立一个两输入的组合电路。共7个输出如下:
  1. out_and: a and b
  2. out_or: a or b
  3. out_xor: a xor b
  4. out_nand: a nand b
  5. out_nor: a nor b
  6. out_xnor: a xnor b
  7. 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

7420 chip

  • 7400系列集成电路是一个数字芯片系列,每个都由几个基本的逻辑门构成。7420是一个带有两个4输入与非门的芯片。
  • 题目要求,实现一个具有与7420芯片相同功能的模块,共8个输入和2个输出。代码如下:
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

Truth tables

  • 在前面的练习中,我们使用简单的逻辑门和几个逻辑门的组合,这些电路是组合电路的例子。组合电路的意思是电路的输出仅取决于输入,这意味着对于任何给定的输入值,只有一个可能的输出值。因此,描述组合函数行为的一种方法是明确地列出所有可能的输入所对应的输出值,即真值表。对一个有N个输入的布尔函数而言,有2N种可能的输入组合。真值表的每一行都列出了一个输入组合,因此总有2N行。output列显示了每个输入值对应的输出。
number x3 x2 x1 f
0 0 0 0 0
1 0 0 1 0
2 0 1 0 1
3 0 1 1 1
4 1 0 0 0
5 1 0 1 1
6 1 1 0 0
7 1 1 1 1
  • 题目要求,构建一个模块,实现上述的真值表功能。
  • 首先 ,先通过卡诺图化简真值表:
x3\x2x1 00 01 11 10
0 0 0 1 1
1 0 1 1 0
  • 化简可得,f=(~x3&x2) | (x3&x1),编写代码如下:
module top_module( 
    input x3,
    input x2,
    input x1,  // three inputs
    output f   // one output
);
    assign f = (~x3&x2) | (x3&x1);
endmodule

Two-bit equality

  • 题目要求,创建一个有两个2位输入A[1:0]和B[1:0]的电路,产生一个输出z。若A=B,则z=1,否则z=0。代码如下:
module top_module ( input [1:0] A, input [1:0] B, output z ); 
    assign z=(A==B)?1'b1:1'b0;
endmodule

Simple circuit A

  • 题目要求,创建电路,实现函数z = (x^y) & x,代码如下:
module top_module (input x, input y, output z);
    assign z=(x^y)&x;
endmodule

Simple circuit B

  • 题目要求,创建电路,实现如上图所示的输入输出关系。代码如下:
module top_module ( input x, input y, output z );
    assign z=~(x^y);
endmodule

Combine circuits A and B

  • 题目要求,A、B模块的功能如题Simple circuit ASimple circuit B所示,。搭建模块实现上图所示功能。代码如下:
module top_module (input x, input y, output z);
    wire za , zb;
    assign za = (x ^ y) & x;
    assign zb = ~(x ^ y);
    assign z = (za | zb) ^ (za & zb);
endmodule

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 = ring & (~vibrate_mode);
    assign motor = ring & vibrate_mode;
endmodule

__tips:__当进行模块设计时,我们最好后向思考问题,如何从输出到输入。这与我们平时顺序式地思考编程问题不同,在编程时我们一般首先看输入如何决定输出,即输入为XX时输出为XX;对硬件工程师而言,通常的思路为输出为XX时输入是XX?在硬件设计中,在两种思路间思考与切换是很重要的技能。

Thermostat

  • 题目要求,加热/冷却恒温器同时控制加热器(冬季)和空调(夏季)。设计一个电路,根据需要打开或关闭加热器、空调和鼓风机。
  • 恒温器有两种模式:加热模式(mode= 1)和冷却模式(mode= 0)。在加热模式下,当温度过低时打开加热器(too_cold = 1)但是不要使用空调。在冷却模式下,当温度太高(too_hot= 1)时打开空调,但不要打开加热器。当暖气或空调打开时。同时打开风扇让空气流通。此外。用户也可以仅要求风扇打开(fan_on = 1),即使加热器和空调关闭。
  • 代码如下:
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 = (mode & too_cold) | ((~mode) & too_hot) | fan_on;
endmodule

3-bit population count

  • 题目要求,构造一个计数器,计算一个三位输入向量中1的个数。代码如下:
module top_module( 
    input [2:0] in,
    output [1:0] out );
    always@(*)begin
        case(in)
            3'b000:out=2'd0;
            3'b001:out=2'd1;
            3'b010:out=2'd1;
            3'b011:out=2'd2;
            3'b100:out=2'd1;
            3'b101:out=2'd2;
            3'b110:out=2'd2;
            3'b111:out=2'd3;
            default:out = 2'd0;
        endcase         
    end
endmodule

Gates and vectors

  • 题目要求,输入一个4位的输入向量in[3:0],输出每个比特和它相邻比特之间的一些关系:
  1. out_both:这个输出向量的每一位应该表示对应的输入位和它左边的比特位(左边比特具有更高的索引)是否均为“1”。举例说明,out_both[2]应该指示出in[2]和in[3]是否均为1。
  2. out_any:这个输出向量的每一位都应该表示相应的输入位和它右边的比特位是否存在“1”。
  3. out_different:这个输出向量的每一位都应该表明相应的输入位是否与其左边的比特位不同。
  • 代码如下:
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:0] & in[3:1];
    assign out_any = in[3:1] | in[2:0];
    assign out_different = in[3:0] ^ {in[0],in[3:1]}; 
endmodule

Even longer vectors

  • 题目要求,输入一个4位的输入向量in[99:0],输出每个比特和它相邻比特之间的一些关系:
  1. out_both:这个输出向量的每一位应该表示对应的输入位和它左边的比特位(左边比特具有更高的索引)是否均为“1”。举例说明,out_both[98]应该指示出in[98]和in[99]是否均为1。
  2. out_any:这个输出向量的每一位都应该表示相应的输入位和它右边的比特位是否存在“1”。
  3. out_different:这个输出向量的每一位都应该表明相应的输入位是否与其左边的比特位不同。
  • 代码如下:
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[99:0] ^ {in[0],in[99:1]};
endmodule

参考:
HDLBits
HDLBits答案(6)_硬件模块设计的思考方式