HDLBits 整理1


前言

之前错的题目只记了一点,刚好这次一起总结一下
截止至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 其他

  1. always块中,等号左边一定要声明为reg类型
  2. $bits()为计算位宽函数
  3. 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
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值