赞
踩
写个新坑:给大家推荐一个非常好的练习Verilog的网站,有一两百道题,基本涵盖了Verilog语法的方方面面,是一个非常好的入门学习网站。
网站连接:HDLBits
全部答案汇总:刷完这套题,我才发现Verilog原来如此简单----HDLBits答案汇总
题目都是自己做的,都是通过验证的正确答案,顺便附上了自己的解题思路。每个题目只列出了一种方法,但是我知道很多题目都有很多解法,时间关系就没一一列出来了。希望能帮到你。
今天更新Circuits章节中binational Logic的2个小节:Basic Gates,Multiplexers。
个人思路:
最简单的连线问题,没什么好讲的。
- module top_module (
- input in,
- output out);
-
- assign out = in;
- endmodule
个人思路:
直接assign 输出到0即可。
- module top_module (
- output out);
-
- assign out = 1'b0;
- endmodule
个人思路:
主要考察 或非门 的使用。
- module top_module (
- input in1,
- input in2,
- output out);
-
- assign out = ~(in1 | in2);
- endmodule
个人思路:
主要考察 与门、非门以及逻辑图的识别。
- module top_module (
- input in1,
- input in2,
- output out);
-
- assign out = in1 & ~in2;
- endmodule
个人思路:
主要考察 异或门、同或门的使用。
- module top_module (
- input in1,
- input in2,
- input in3,
- output out);
-
- assign out = in3 ^ ~(in1 ^ in2);
- endmodule
个人思路:
主要考察对以下7种逻辑关系的理解,分别对应:
与、或、异或、与非、或非、同或、以及与(其中一个的非)。
- 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
个人思路:
就是两个多输入与非逻辑,根据图片对应关系输出就好。
- 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
个人思路:
找真值表里输出f为1的项,列出来后再逻辑化简。
- module top_module(
- input x3,
- input x2,
- input x1, // three inputs
- output f // one output
- );
- assign f= (~x3 & x2) | (x3 & x1);
-
- endmodule
个人思路:
判断两输入是否相等,相等则输出1,否则输出0。可以用三目运算符,也可以用if-else等。
- module top_module ( input [1:0] A, input [1:0] B, output z );
-
- assign z =(A == B) ? 1'b1:1'b0;
- endmodule
个人思路:
直接按题目给出的逻辑关系输出就好。
- module top_module (input x, input y, output z);
-
- assign z = (x^y) & x;
- endmodule
个人思路:
从时序图可以看出当x,y输入相同时输出1,不同时输出0,所以这是一个同或电路。
- module top_module ( input x, input y, output z );
-
- assign z = ~(x ^ y);
- endmodule
个人思路:
这个题目的A模块是3.1.1.10--z = (x^y) & x;B模块是3.1.1.11--z = ~(x ^ y)。
- module top_module (input x, input y, output z);
-
- wire z1,z2;
- assign z1 = (x^y) & x;
- assign z2 = ~(x ^ y);
- assign z = (z1 | z2) ^ (z1 & z2);
- endmodule
个人思路:
2个输入:打电话过来与否:ring 震动模式开与否:vibrate_mode
2个输出:响铃ringer 震动motor
对应关系:
当有人打电话(ring == 1)且(&)震动模式开(vibrate_mode == 1)--震动开(motor == 1)
当有人打电话(ring == 1)且(&)震动模式关(vibrate_mode == 0)--响铃开(ringer == 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
个人思路:
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)
- 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 = fan_on | heater | aircon;
-
- endmodule
个人思路:
要数一个三位宽输入中1的个数,直接把每一位加起来即可。
- module top_module(
- input [2:0] in,
- output [1:0] out );
-
- assign out = in[2] + in[1] + in[0];
- endmodule
个人思路:
out_both:每一位都与左边一位进行与操作;如果是最高位,则不进行。
out_any:每一位都与右边一位进行或操作;如果是最低位,则不进行。
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[0] = in[1] & in[0];
- assign out_both[1] = in[2] & in[1];
- assign out_both[2] = in[3] & in[2];
- assign out_any[1] = in[1] | in[0];
- assign out_any[2] = in[2] | in[1];
- assign out_any[3] = in[3] | in[2];
- assign out_different[0] = in[1] ^ in[0];
- assign out_different[1] = in[2] ^ in[1];
- assign out_different[2] = in[3] ^ in[2];
- assign out_different[3] = in[0] ^ in[3];
-
- endmodule
个人思路:
基本思路同上一题一样,只不过输入位宽变成了近100位,按上题的写法来解答就效率太低了。仔细观察,还是很容易发现规律的。
- 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[0],in[99:1]} ^ in;
- endmodule
个人思路:
2选1选择器,用三目运算符即可。
- module top_module(
- input a, b, sel,
- output out );
-
- assign out = sel ? b : a;
- endmodule
个人思路:
同上题,不过是位宽变宽了。
- module top_module(
- input [99:0] a, b,
- input sel,
- output [99:0] out );
-
- assign out = sel ? b : a;
-
- endmodule
个人思路:
9选1选择器,用case语句例举出所有情况及默认情况default。
- module top_module(
- input [15:0] a, b, c, d, e, f, g, h, i,
- input [3:0] sel,
- output [15:0] out );
-
- always@(*)begin
- case(sel)
- 4'd0: out = a;
- 4'd1: out = b;
- 4'd2: out = c;
- 4'd3: out = d;
- 4'd4: out = e;
- 4'd5: out = f;
- 4'd6: out = g;
- 4'd7: out = h;
- 4'd8: out = i;
- default:out = 16'hffff;
- endcase
- end
- endmodule
个人思路:
256选1选择器,用case语句的情况就太多了。
题目中:sel=0 should select in[0], sel=1 selects bits in[1], sel=2 selects bits in[2], etc。可以看出这个sel的值和in[]选中的位是一样的,所以有如下:
- module top_module(
- input [255:0] in,
- input [7:0] sel,
- output out );
-
- assign out = in[sel];
- endmodule
个人思路:
用向量部分选择处理比较方便。可参考:Verilog-2001的向量部分选择
- module top_module(
- input [1023:0] in,
- input [7:0] sel,
- output [3:0] out );
-
- assign out = in[sel * 4 +: 4];
-
- endmodule
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。