前言
之前错的题目只记了一点,刚好这次一起总结一下
截止至3.1.3 arithmetic circuits部分
相关文章:
HDLBit 整理1
HDLBit 整理2
HDLBit 整理3
HDLBits 答案合集(一)
提示:以下是本篇文章正文内容,下面案例可供参考
一、知识点
1.1 按位操作和逻辑操作
assign a=4'b0000;
assign b=4'b0001;
assign c = a||b; // c=1
在上述逻辑运算中,a,b首先计算自身逻辑值,即a,b中各个位之间先进行或运算,得到a=0,b=1,再对两者进行逻辑运算,得到c=1。
1.2 位操作的简化
& a[3:0] // AND: a[3]&a[2]&a[1]&a[0]. Equivalent to (a[3:0] == 4'hf)
| b[3:0] // OR: b[3]|b[2]|b[1]|b[0]. Equivalent to (b[3:0] != 4'h0)
^ c[2:0] // XOR: c[2]^c[1]^c[0]
对多位寄存器的各个位进行运算时,可进行简化。
1.3 其他
- always块中,等号左边一定要声明为reg类型
- $bits()为计算位宽函数
- out = '1 ,代表将out的每一位都置1。
二、错误题目
2.1 casez的使用
2.4.7 always casez,题目为:对8位输入进行分类,输出值为1的最低位的序号。
将不需要的位设为z,这样就只剩下8种可能,使用casez便可以快速得到结果。
module top_module (
input [7:0] in,
output reg [2:0] pos );
always @(*)
casez(in)
8'bzzzzzzz1: pos = 0;
8'bzzzzzz1z: pos = 1;
8'bzzzzz1zz: pos = 2;
8'bzzzz1zzz: pos = 3;
8'bzzz1zzzz: pos = 4;
8'bzz1zzzzz: pos = 5;
8'bz1zzzzzz: pos = 6;
8'b1zzzzzzz: pos = 7;
default: pos = 0;
endcase
endmodule
2.2 多位加法器
3.1.3.4 Exams/m2014 q4j,题目如下:
我的思路是构建一个全加器模块,再通过多次调用实现该目的,方法如下:
module top_module (
input [3:0] x,
input [3:0] y,
output [4:0] sum);
wire cin;
wire [3:0] cout;
assign cin = 0;
adder q1(.a(x[0]),.b(y[0]),.cin(cin),.cout(cout[0]),.sum(sum[0]));
adder q2[2:0] (x[3:1],y[3:1],cout[2:0],cout[3:1],sum[3:1]); // 顺序连接
assign sum[4] = cout[3];
endmodule
module adder(
input a,b,cin,
output cout,sum);
assign {cout,sum} = a+b+cin;
endmodule
该题有参考答案,看到之后发现是自己想的太过复杂,实际上就是两个数相加,得到他们的和,答案中只用了一行便实现了该目的。
module top_module (
input [3:0] x,
input [3:0] y,
output [4:0] sum
);
assign sum = x+y; // Verilog addition automatically produces the
endmodule
2.3 符号位溢出
3.1.3.5 Exams/ece241 2014 q1c,题目为:
计算两个7位补码的和,并判断符号位是否溢出。
本题涉及到补码原码知识点,8位有符号数的范围为-128~127,符号位溢出有两种情况:1.正数与正数相加。2.负数与负数相加。
若在第一种情况下结果不为正数,以及第二中情况下结果不为负数,则说明有符号位溢出
module top_module (
input [7:0] a,
input [7:0] b,
output [7:0] s,
output overflow
); //
assign s = a+b;
assign overflow = (a[7] & b[7] & ~s[7]) | (~a[7] & ~b[7] & s[7]);
endmodule