第三代半导体 大数据 全局重载运算符 https generics networking datagridview angularjs版本 vue插件 android项目实战 ps视频教程全集完整版 jquery each js空格符 mysql查看锁表 matlab不等于 matlab插值函数 kali重启网卡 php获取当天的0点时间戳 python数据格式 python教学 python使用正则表达式 python读文件 python教程推荐 javaqueue java环境搭建 java基础教学 java链接mysql数据库 java开发接口 java安装配置 java初级入门教程 shell编程学习 linux安装系统 php实例 flash实例教程 服务器操作系统下载 vbscript程序员参考手册 笔记本外接显示器好吗 python封装 kontakt 暴力猴插件
当前位置: 首页 > 学习教程  > 编程语言

verilog设计32位ALU

2021/1/28 23:00:33 文章标签:

一 设计思路(一) 输入、输出(二)运算说明二 verilog代码(一)程序代码变量说明(二)程序代码(三)时序模拟图一 设计思路 (一) 输入、输…

  • 一 设计思路
    • (一) 输入、输出
    • (二)运算说明
  • 二 verilog代码
    • (一)程序代码变量说明
    • (二)程序代码
    • (三)时序模拟图

一 设计思路

(一) 输入、输出

  1. 三个输入:两个32位输入数X、Y及计算类型OP。
  2. 两个输出:计算结果result及有无溢出overflow。
  3. 计算类型代码
    (1)OP = 0有符号数相加,
    (2)OP = 1有符号数相减,
    (3)OP = 2无符号数相加,
    (4)OP = 3无符号数相减,
    (5)OP = 4逻辑左移(X左移Y位),
    (6)OP = 5逻辑右移(X右移Y位)。
    其中,逻辑左移、逻辑右移均在空位补0。
  4. 对于加减法,overflow = 1表示有溢出。

(二)运算说明

输出的计算结果result用33位二进制有符号数表示,其中最高位为符号位。
(1)表示有符号数运算结果时:result = SsSs S30S29…S1S0(双符号位+31位数值位)
(2)表示无符号数运算结果时:result = 0S31 S30S29…S1S0(符号位恒置0+32位数值位)
有符号数、无符号数的运算均视作有符号数补码运算
减法运算:减数补码取反加1后,与被减数做加法运算。

  1. 两个32位有符号数加减:
    [X]补 = Xs X30X29…X1X0
    [Y]补 = Ys Y30Y29…Y1Y0
    其和(差)为:[S] = Ss S30S29…S1S0
    当 Xs = Ys = 0,Ss = 1时,产生正溢。
    当 Xs = Ys = 1,Ss = 0时,产生负溢。
    result次高位与S符号位保持一致,result = SsSs S30S29…S1S0
  2. 两个32位无符号数加减
    [X] = 0X31X30X29…X1X0
    [Y] = 0Y31Y30Y29…Y1Y0
    [-Y] = 1Y31Y30Y29…Y1Y0
    其和(差)为:[S] = Ss S31S30S29…S1S0
    加法:当 Ss = 1时,产生正溢。
    减法:当 Ss = 0时,产生正溢。
    result最高位符号位恒置0,result = 0S31S30S29…S1S0
  3. X逻辑左移/右移Y位
    均在空位补0。
    逻辑左移/右移后的32位有符号数 [S] = S31S30S29…S1S0
    result = 0S31S30S29…S1S0
    若Y<0:overflow = 1。

二 verilog代码

(一)程序代码变量说明

input [31:0] X,Y, // 2个操作数
input [2:0] OP, // 操作类型
output reg [32:0] result, // 33位补码表示的有符号数结果
output reg overflow); // 溢出
	
reg [31:0] _Y,S; // [-Y]补,有符号数运算的中间结果
reg [32:0] SS;	// 无符号数运算的中间结果

(二)程序代码

软件:Quartus II 9.0

module ALU(
	input [31:0] X,Y,         // OP = 0/1:signed add/subtract;
	input [2:0] OP,           // OP = 2/3:unsigned add/subtract;
	output reg [32:0] result, // OP = 4/5:move left/right
	output reg overflow);
	
	reg [31:0] _Y,S;
	reg [32:0] SS;
	
	always @(*)
	begin
		case(OP)
			0: // signed add
			begin
				S = X + Y;
				if(!X[31]&&!Y[31]&&S[31] || X[31]&&Y[31]&&!S[31])
					overflow = 1;
				else
					overflow = 0;
				result = {S[31],S};
			end
			1: // signed subtract
			begin
				_Y = ~Y + 1'b1;
				S = X + _Y;
				if(!X[31]&&!_Y[31]&&S[31] || X[31]&&_Y[31]&&!S[31])
					overflow = 1;
				else
					overflow = 0;
				result = {S[31],S};
			end
			2: // unsigned add
			begin
				SS = X + Y;
				if(SS[32])
					overflow = 1;
				else
					overflow = 0;
				result = {1'b0,SS[31:0]};
			end
			3: // unsigned substract
			begin
				_Y = ~Y + 1'b1;
				SS = X + _Y;
				if(SS[32])
					overflow = 0;
				else
					overflow = 1;
				result = {1'b0,SS[31:0]};
			end
			4: // move left
			begin
				if(Y[31] == 1)
					overflow = 1;
				else
				begin
					overflow = 0;
					S = X<<Y;
					result = {1'b0,S};
				end
			end
			5: // move right
			begin
				if(Y[31] == 1)
					overflow = 1;
				else
				begin
					overflow = 0;
					S = X>>Y;
					result = {1'b0,S};
				end
			end
		endcase
	end
endmodule

(三)时序模拟图

  1. OP = 0:有符号数相加,result = X + Y
    在这里插入图片描述
32位X32位Y溢出33位result
223355
-22-33-55
二进制1,00…00二进制0,00…01二进制11,00…01
二进制1,00…00二进制1,11…11二进制00,11…11

说明:对于有符号数的运算结果,result相当于双符号位补码,最高位与次高位均为符号位,实际表示有符号补码的仅仅是后32位。
用33位仅仅是方便同时表示有符号数和无符号数的运算结果:
有符号数result:双符号位+31位数值位
无符号数result:单符号位(恒置0)+32位数值位

  1. OP = 1:有符号数相减,result = X - Y
    在这里插入图片描述
32位X32位Y溢出33位result
2233-11
22-3355
-2233-55
-22-3311
二进制1,00…00二进制0,00…01二进制00,11…11
二进制1,00…00二进制1,11…11二进制11,00…01

第五组:1,00…00 - 0,00…01 = 1,00…00 + 1,11…11 = (1)0,11…11,产生溢出
第六组:1,00…00 - 1,11…11 = 1,00…00 + 0,00…01 = (0)1,00…01,无溢出

  1. OP = 2:无符号数相加,result = X + Y
    在这里插入图片描述
32位X32位Y溢出33位result
223355
二进制100…00二进制000…01二进制0,100…01
二进制100…00二进制100…00二进制0,000…00

第二组:相当于 231 + 20 = 2147483649
第三组:10…00 + 10…00 = (1) 00…00,产生溢出

  1. OP = 3:无符号数相减,result = X - Y
    在这里插入图片描述
32位X32位Y溢出33位result
221111
2233
二进制100…00二进制000…01二进制0,011…11
二进制100…00二进制100…000

第三组:相当于 231 - 20 = 2147483647

  1. OP = 4:逻辑左移
    OP = 5:逻辑右移
    在这里插入图片描述

3 = 00…0011
逻辑左移1位:000…0110 = 6
逻辑左移2位:000…1100 = 12
逻辑左移40位:000…0000 = 0
逻辑右移1位:000…0001 = 1
逻辑右移2位:000…0000 = 0
逻辑左移40位:000…0000 = 0


本文链接: http://www.dtmao.cc/news_show_650137.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?