电子书:《模拟对话》,共50卷,数百篇精品文章,下载即奖励400信元!
返回列表 发帖

[求助] 《自己动手写CPU》问题求职

[求助] 《自己动手写CPU》问题求职

1、在(第7章 算术操作指令)的实现中对于有符号加法操作符,为什么测试程序 add 80000010 80000001会溢出呢,按照有符号加法,不应该是-16+(-1)等于-17吗?2、第165页,在计算有符号数的补码时,为什么是32位全部取反加一,补码的运算不应该是最高位表示符号,其余剩下的31位取反加一吗?

仔细思考了两天,自己来回答:
发现书中的代码并没有错误。
书中的操作数都是默认是补码形式。
三句话完成加法与减法,有符号数和无符号数的操作,感觉很奇妙。
之所以很简洁,主要还是因为电脑中将数字(正数/负数)按照补码形式来存储的,加法与减法得到统一。
下面是我摘出来用来单独理解写出的程序:
module alu_comp(a,b,add_sel,signed_sel,c,overflow);
input [3:0] a,b;//两个输入数
input add_sel,signed_sel;//两位选择信号:加法/减法 有符号数/无符号数
output [3:0] c;//输出数,对于输出数,如果是负数,比如-3,它会显示1101(-3的补码),而不是1011
output overflow;//当为有符号数时,是否出现溢出
wire [3:0] b_mux;

assign b_mux=(!add_sel)?(~b)+1:b;
assign c=a+b_mux;
assign overflow=((a[3])&&(b[3])&&(!c[3])&&(signed_sel)) || ((!a[3])&&(!b[3])&&(c[3])&&(signed_sel));
endmodule

TOP

返回列表

站长推荐 关闭


Keysight Engineering Education 2019课程详细介绍

Keysight Engineering Education 2019课程详细介绍


查看