对于verilog的学习,这里推荐一个比较好的实践网站HDLBits:https://hdlbits.01xz.net/wiki/Main_Page
本系列记录一些我觉得有价值的题目,希望通过这些题目可以对verilog更加熟练。
题目: 假设你有两个8位有符号的输入,即a [7:0]和b [7:0]。这些数字相加产生s [7:0],还要计算是否发生溢出情况。
module top_module (
input [7:0] a,
input [7:0] b,
output [7:0] s,
output overflow
);
endmodule
一个有符号数的最高位代表正负,最高位是0代表正数,最高位是1代表负数。那什么时候会发生溢出(overflow)的情况?只有两个正数(负数)相加才会发生溢出,相减(即一正一负)是不会发生溢出的。
两个正数相加(符号位都为0),如果结果为负数,则发生溢出;两个负数相加(符号位都为1),如果结果为正数,则发生溢出,其他情况都为没有发生溢出。因此我的答案如下
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])?((a[7])?(!s[7]?1:0):(s[7]?1:0)):0;
endmodule
在其他博客看到有更简单做法,原理也是一样的,a[7] & b[7] & ~s[7]是判断两个负数的情况,当s[7]为0,即相加结果为正数,发生溢出情况,overflow为1;~a[7] & ~b[7] & s[7]是判断两个正数的情况,当s[7]为1,即相加结果为负数,发生溢出情况,overflow为1。
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
建立了一个微信公众号“Andy的ICer之路”,此公众号主要分享数字IC相关的学习经验(后期打算与csdn同步更新),做公众号的目的就是记录自己的学习过程,很多东西回过头来可能就忘记了,为了记住知识和分享知识,希望自己可以保持更新,有兴趣的朋友可以关注一下!