当前位置:   article > 正文

刷完这套题,我才发现Verilog原来如此简单----HDLBits答案系列----Basic Gates、Multiplexers_input [15:0] a,b;

input [15:0] a,b;

写在前面

写个新坑:给大家推荐一个非常好的练习Verilog的网站,有一两百道题,基本涵盖了Verilog语法的方方面面,是一个非常好的入门学习网站。

网站连接:HDLBits

全部答案汇总:刷完这套题,我才发现Verilog原来如此简单----HDLBits答案汇总

题目都是自己做的,都是通过验证的正确答案,顺便附上了自己的解题思路。每个题目只列出了一种方法,但是我知道很多题目都有很多解法,时间关系就没一一列出来了。希望能帮到你。

今天更新Circuits章节中binational Logic的2个小节:Basic Gates,Multiplexers。


3、Circuits

3.1、binational Logic

3.1.1、Basic Gates

3.1.1.1、Wire

        个人思路:

                最简单的连线问题,没什么好讲的。

  1. module top_module (
  2. input in,
  3. output out);
  4. assign out = in;
  5. endmodule

3.1.1.2、GND

        个人思路:

                直接assign 输出到0即可。

  1. module top_module (
  2. output out);
  3. assign out = 1'b0;
  4. endmodule

3.1.1.3、NOR

        个人思路:

                主要考察 或非门 的使用。

  1. module top_module (
  2. input in1,
  3. input in2,
  4. output out);
  5. assign out = ~(in1 | in2);
  6. endmodule

3.1.1.4、Another gate

        个人思路:

                主要考察 与门、非门以及逻辑图的识别。

  1. module top_module (
  2. input in1,
  3. input in2,
  4. output out);
  5. assign out = in1 & ~in2;
  6. endmodule

3.1.1.5、Two gates

        个人思路:

                主要考察 异或门、同或门的使用。

  1. module top_module (
  2. input in1,
  3. input in2,
  4. input in3,
  5. output out);
  6. assign out = in3 ^ ~(in1 ^ in2);
  7. endmodule

3.1.1.6、More logic gates

        个人思路:

                主要考察对以下7种逻辑关系的理解,分别对应:

                        与、或、异或、与非、或非、同或、以及与(其中一个的非)。

  1. module top_module(
  2. input a, b,
  3. output out_and,
  4. output out_or,
  5. output out_xor,
  6. output out_nand,
  7. output out_nor,
  8. output out_xnor,
  9. output out_anotb
  10. );
  11. assign out_and = a & b;
  12. assign out_or = a | b;
  13. assign out_xor = a ^ b;
  14. assign out_nand = ~(a & b);
  15. assign out_nor = ~(a | b);
  16. assign out_xnor = ~(a ^ b);
  17. assign out_anotb = a & ~b;
  18. endmodule

3.1.1.7、7420 chip

        个人思路:

                就是两个多输入与非逻辑,根据图片对应关系输出就好。

  1. module top_module (
  2. input p1a, p1b, p1c, p1d,
  3. output p1y,
  4. input p2a, p2b, p2c, p2d,
  5. output p2y );
  6. assign p1y = ~(p1a & p1b & p1c & p1d);
  7. assign p2y = ~(p2a & p2b & p2c & p2d);
  8. endmodule

3.1.1.8、Truth tables

        个人思路:

                找真值表里输出f为1的项,列出来后再逻辑化简。

  1. module top_module(
  2. input x3,
  3. input x2,
  4. input x1, // three inputs
  5. output f // one output
  6. );
  7. assign f= (~x3 & x2) | (x3 & x1);
  8. endmodule

3.1.1.9、Two-bit equality

        个人思路:

                判断两输入是否相等,相等则输出1,否则输出0。可以用三目运算符,也可以用if-else等。

  1. module top_module ( input [1:0] A, input [1:0] B, output z );
  2. assign z =(A == B) ? 1'b1:1'b0;
  3. endmodule

3.1.1.10、Simple circuit A

        个人思路:

                直接按题目给出的逻辑关系输出就好。

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

3.1.1.11、Simple circuit B

        个人思路:

                从时序图可以看出当x,y输入相同时输出1,不同时输出0,所以这是一个同或电路。

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

3.1.1.12、Combine circuits A and B

        个人思路:

                这个题目的A模块是3.1.1.10--z = (x^y) & x;B模块是3.1.1.11--z = ~(x ^ y)。

  1. module top_module (input x, input y, output z);
  2. wire z1,z2;
  3. assign z1 = (x^y) & x;
  4. assign z2 = ~(x ^ y);
  5. assign z = (z1 | z2) ^ (z1 & z2);
  6. endmodule

3.1.1.13、Ring or vibrate?

        个人思路:

                2个输入:打电话过来与否:ring        震动模式开与否:vibrate_mode

                2个输出:响铃ringer                          震动motor

                对应关系:

                        当有人打电话(ring == 1)且(&)震动模式开(vibrate_mode == 1)--震动开(motor == 1)

                        当有人打电话(ring == 1)且(&)震动模式关(vibrate_mode == 0)--响铃开(ringer == 1)

  1. module top_module (
  2. input ring,
  3. input vibrate_mode,
  4. output ringer, // Make sound
  5. output motor // Vibrate
  6. );
  7. assign ringer = ring & ~vibrate_mode;
  8. assign motor = ring & vibrate_mode;
  9. endmodule

3.1.1.14、Thermostat

        个人思路:

                4个输入:

                        mode:1--加热模式heating         0--制冷模式cooling    

                        too_hot:1--太热状态

                         too_cold:1--太冷状态

                         fan_on:1--风扇控制开               0--风扇控制关

                4个输出:

                        heater:1--加热器打开                     0--加热器不打开

                        aircon :1--制冷器打开                     0--制冷器不打开                  

                        fan:1--风扇打开                           0--风扇不打开       

                对应关系:

                        当处于加热模式(mode == 1)且(&)状态处于太热(too_hot== 1)--加热器开(heater== 1)

                        当处于制冷模式(mode == 0)且(&)状态处于太冷(too_cold== 1)--制冷器开(aircon == 1)

                        当处于加热器开(heater== 1)或(|)制冷器开(aircon == 1)或(|)风扇开关开( fan_on == 1)

  1. module top_module (
  2. input too_cold,
  3. input too_hot,
  4. input mode,
  5. input fan_on,
  6. output heater,
  7. output aircon,
  8. output fan
  9. );
  10. assign heater = mode & too_cold;
  11. assign aircon = ~mode & too_hot;
  12. assign fan = fan_on | heater | aircon;
  13. endmodule

3.1.1.15、3-bit population count

        个人思路:

                要数一个三位宽输入中1的个数,直接把每一位加起来即可。

  1. module top_module(
  2. input [2:0] in,
  3. output [1:0] out );
  4. assign out = in[2] + in[1] + in[0];
  5. endmodule

3.1.1.16、Gates and vectors

        个人思路:

                out_both:每一位都与左边一位进行与操作;如果是最高位,则不进行。

                out_any:每一位都与右边一位进行或操作;如果是最低位,则不进行。

                out_different:每一位都与左边一位进行异或操作;如果是最高位,则与最低位进行异或。

  1. module top_module(
  2. input [3:0] in,
  3. output [2:0] out_both,
  4. output [3:1] out_any,
  5. output [3:0] out_different );
  6. assign out_both[0] = in[1] & in[0];
  7. assign out_both[1] = in[2] & in[1];
  8. assign out_both[2] = in[3] & in[2];
  9. assign out_any[1] = in[1] | in[0];
  10. assign out_any[2] = in[2] | in[1];
  11. assign out_any[3] = in[3] | in[2];
  12. assign out_different[0] = in[1] ^ in[0];
  13. assign out_different[1] = in[2] ^ in[1];
  14. assign out_different[2] = in[3] ^ in[2];
  15. assign out_different[3] = in[0] ^ in[3];
  16. endmodule

3.1.1.17、Even longer vectors

        个人思路:

                基本思路同上一题一样,只不过输入位宽变成了近100位,按上题的写法来解答就效率太低了。仔细观察,还是很容易发现规律的。

  1. module top_module(
  2. input [99:0] in,
  3. output [98:0] out_both,
  4. output [99:1] out_any,
  5. output [99:0] out_different );
  6. assign out_both = in[99:1] & in[98:0];
  7. assign out_any = in[99:1] | in[98:0];
  8. assign out_different = {in[0],in[99:1]} ^ in;
  9. endmodule

3.1.2、Multiplexers

3.1.2.1、2-to-1 multiplexer

        个人思路:

                2选1选择器,用三目运算符即可。

  1. module top_module(
  2. input a, b, sel,
  3. output out );
  4. assign out = sel ? b : a;
  5. endmodule

3.1.2.2、2-to-1 bus multiplexer

        个人思路:

                同上题,不过是位宽变宽了。

  1. module top_module(
  2. input [99:0] a, b,
  3. input sel,
  4. output [99:0] out );
  5. assign out = sel ? b : a;
  6. endmodule

3.1.2.3、9-to-1 multiplexer

        个人思路:

               9选1选择器,用case语句例举出所有情况及默认情况default。

  1. module top_module(
  2. input [15:0] a, b, c, d, e, f, g, h, i,
  3. input [3:0] sel,
  4. output [15:0] out );
  5. always@(*)begin
  6. case(sel)
  7. 4'd0: out = a;
  8. 4'd1: out = b;
  9. 4'd2: out = c;
  10. 4'd3: out = d;
  11. 4'd4: out = e;
  12. 4'd5: out = f;
  13. 4'd6: out = g;
  14. 4'd7: out = h;
  15. 4'd8: out = i;
  16. default:out = 16'hffff;
  17. endcase
  18. end
  19. endmodule

3.1.2.4、256-to-1 multiplexer

        个人思路:

                256选1选择器,用case语句的情况就太多了。

                题目中:sel=0 should select in[0], sel=1 selects bits in[1], sel=2 selects bits in[2], etc。可以看出这个sel的值和in[]选中的位是一样的,所以有如下:

  1. module top_module(
  2. input [255:0] in,
  3. input [7:0] sel,
  4. output out );
  5. assign out = in[sel];
  6. endmodule

3.1.2.5、256-to-1 4-bit multiplexer

        个人思路:

                用向量部分选择处理比较方便。可参考:Verilog-2001的向量部分选择

  1. module top_module(
  2. input [1023:0] in,
  3. input [7:0] sel,
  4. output [3:0] out );
  5. assign out = in[sel * 4 +: 4];
  6. endmodule

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/648832
推荐阅读
相关标签
  

闽ICP备14008679号