DSP算法实验报告.docx
《DSP算法实验报告.docx》由会员分享,可在线阅读,更多相关《DSP算法实验报告.docx(10页珍藏版)》请在冰豆网上搜索。
DSP算法实验报告
ALU模块运行测试
实验报告
一、实验目的
通过对指令译码的输入测试,了解掌握ALU模块运行的一般原理和规律,加深对ALU模块的了解。
二、测试结果
(一)ALU原理
ALU(ArithmeticLogicUnit)算术逻辑单元,是指中央处理器(CPU)的执行单元,是所有中央处理器的核心组成部分,由"AndGate"和"OrGate"构成的算术逻辑单元,主要功能是进行二进制的算术运算。
ALU在处理器CPU之中用于计算的那一部分,与其同级的有数据传输单元和分支单元。
ALU负责处理数据的运算工作,包括算术运算起(如:
加、减、乘、除等),逻辑运算(如:
AND、OR、NOT..等)及关系运算(比较大小等关系),并将运算的结果存回记忆单元。
ALU必须与数字电路的其他部分使用同样的格式来进行数字处理。
对现代处理器而言,数值一律使用二进制补码表示。
早期的计算机曾使用过很多种数字系统,包括反码、符号数值码,甚至是十进制码,每一位用十个管子。
以上这每一种数字系统所对应的ALU都有不同的设计,而这也影响了当前对二进制补码的优先选择,因为二进制补码能简化ALU加法和减法的运算。
一个简单的能进行与或非和加运算的2位ALU。
绝大部分计算机指令都是由ALU执行的。
ALU从寄存器中取出数据。
数据经过处理将运算结果存入ALU输出寄存器中。
其他部件负责在寄存器与内存间传送数据。
控制单元控制着ALU,通过控制电路来告诉ALU该执行什么操作。
通常而言,ALU具有对处理器控制器、内存及输入输出设备的直接读入读出权限。
输入输出是通过总线进行的。
输入指令包含一个指令字,有时被称为机器指令字,其中包括操作码,单个或多个操作数,有时还会有格式码;操作码指示ALU机要执行什么操作,在此操作中要执行多少个操作数。
比如,两个操作数可以进行比较,也可以进行加法操作。
格式码可与操作码结合,告知这是一个定点还是浮点指令;输出包括存放在存储寄存器中的结果及显示操作是否成功的设置。
如操作失败,则在机器状态字中会有相应的状态显示。
(二)ALU模块主要作用
算术逻辑运算部件ALU主要作用:
1、算术逻辑运算部件ALU主要完成二进制代码的定点算术和逻辑运算,有时也叫多功能函数发生器;
2、算术运算主要包括定点加、减运算;
3、逻辑运算主要包括逻辑与、或、非、异或;
4、ALU的核心加法器。
(三)ALU模块功能实现
指令的测试方法
首先下载ModelSim6.5软件,安装。
组合电路测试
对于一个已有的待测模块,测试平台中需要声明与待测模块输入输出端口对应的变量。
与输入端口相连接的变量定义为reg,与输出端口相连接的变量定义为wire,例化时将测试平台中声明的变量与待测模块的输入输出端口相关联。
使用initial语句控制程序运行,initial语句是一种过程结构,在initial块中可使用延迟控制语句来控制initial块中的程序流动。
这里对一个简单的算术逻辑单元(ALU)为例进行测试,下面是该单元Verilog描述。
//多动能ALU的Verilog代码
'timescale1ns/100ps
modulealu_4bit(a,b,f,oe,y,p,ov,a_gt_b,a_eg_b,a_lt_b);
input[3:
0]a,b;
input[1:
0]f;
inputoe;
input[3:
0]y;
outputp,ov,a_gt_b,a_eg_b,a_lt_b;
reg[4:
0]im_y;
always@(aorborf)
begin
ov=1'b0;
im_y=0;
case(f)
2'b00:
begin
im_y=a+b;
if(im_y>5'b01111)
ov=1'b1;
end
2'b01:
begin
im_y=a-b;
if(im_y>5'b01111)
ov=1'b1;
end
2'b10:
im_y[3:
0]=a&b;
2'b11:
im_y[3:
0]=a^b;
default:
im_y[3:
0]=4'b0000;
endcase
end
always@(aorb)
begin
if(a>b)
{a_gt_b,a_ge_b,a_lt_b}=3'b100;
elseif(a
{a_gt_b,a_ge_b,a_lt_b}=3'b001;
else
{a_gt_b,a_ge_b,a_lt_b}=3'b010;
end
assignp=^im_y[3:
0];
assigny=oe?
im_y[3:
0]:
4'bz;
endmodule
模块alu_4bit是四功能的算术逻辑单元,输入包括数据信号a、b和功能信号f,输出包括数据信号y和ALU生成的奇偶校验信号p、溢出信号ov及比较信号。
下面代码描述了alu_4bit模块的测试平台。
moduletest_alu_4bit;
reg[3:
0]a=4'b1011,b=4'b0110;
reg[1:
0]f=2'b00;
regoe=1;
wire[3:
0]y;
wirep,ov,a_gt_b,a_eg_b,a_lt_b;
alu_4bitcut(a,b,f,oe,y,p,ov,a_gt_b,a_eg_b,a_lt_b);
initial
begin
#20b=4'b1011;
#20b=4'b1110;
#20b=4'b1110;
#80oe=1'b0;
#20$finish;
end
always#23f=f+1;
endmodule
与alu_4bit模块相连的变量在声明时被赋初值。
用一个initial语句对ALU的输入数据b和输出使能oe赋值,在前60ns,每隔20n给b赋一个新值然后等待80ns,给oe赋0值来禁止ALU的输出,再等待20ns后结束仿真。
最终等待20ns后,显示的仿真结果里包含最后一个输入数据产生的输出。
用always语句对alu_4bit的输入数据f赋值,f的初值为0,以后每隔23ns它的值加1.initial块的$finish语句在160ns时被执行,此时所有正在运行的过程语句都停止,仿真结束。
下图所示是仿真后的波形曲线。
并行加法器与进位链结构情况
1、用n位全加器实现两个n位操作数各位同时相加,这种加法器称为并行加法器。
2、并行加法器中传递进位信号的逻辑线路称为进位链。
基本进位公式
例如:
设两个n位操作数为:
A=An-1An-2...Ai...A0
B=Bn-1Bn-2...Bi...B0
定义辅助函数情况:
其中,Gi称为进位产生函数,其含义:
若该位两个输入端Ai,Bi均为1,必向高位产生进位,此分量与低位进位无关;Pi称为进位传递函数,其含义:
当Pi=1,如果低位有进位,本位必产生进位,也即低位传来的进位能工越过本位而向更高位传递。
因此有:
Ci+1=Gi+PiCi
并行加法器的串行进位情况
1、所谓串行进位又叫行波进位,其中的进位是逐级形成的,每一级进位直接依赖前一级进位。
将i=0,1,...,n-1分别代入上式,可得:
优点:
节省器件,成本低
缺点:
延迟时间长
并行进位(先行进位,同时进位)
1、各级进位同时形成
2、根据上式得到的逻辑图:
3、常用的分组进位结构:
(1)组内并行,组间串行;
(2)组内并行,组间并行。
运算方法情况
1、数值运算的核心是加、减、乘、除四则运算。
由于计算机中的数有定点和浮点表示,因此相应有定点数的运算和浮点数的运算。
定点加减运算
在大多数计算机中,通常只设置加法器,减法运算是通过转换为加法来实现的。
原码加减运算
对原码表示的两个操作数进行加减运算时,计算机的实际操作是加还是减,不仅取决指令中的操作码,还取决于两个操作数的符号。
而且运算结果的符号判断也较复杂。
例如,加法指令指示做(+A)+(-B)由于一操作数为负,实际操作是做减法(+A)-(+B),结果符号与绝对值大的符号相同。
同理,在减法指令中指示做(+A)-(-B)实际操作做加法(+A)+(+B),结果与被减数符号相同。
由于原码加减法比较繁琐,相应地需要由复杂的硬件逻辑才能实现,因此在计算机中很少被采用。
补码加减运算
在计算机中,参加补码运算的操作数及运算结果皆用补码表示。
(1)补码加法运算
两个相加的数无论正负,只要表示成对应的补码形式,则可直接按二进制规则相加,且符号位作为数的一部分直接参与运算,所得结果就是和的补码形式。
可用如下关系式描述:
[X]补+[Y]补=[X+Y]补
(2)补码减法运算
公式:
[X-Y]补=[X+(-Y)]补=[X]补+[-Y]补
三、实验收获和心得体会
通过对老师所给指令译码的输入测试,才发现课堂学习和实践操作之间的差距如此之大,明白了要把一个理论的事物运用到实际操作中面临如此之多的问题,这还仅仅是依据已给定的指令译码进行输入测试,就已经遇到各种各样的问题了,如果是自己设计、编写译码和开放ALU模块,那会是多么复杂呢?
由此可以看出,学习不是一个简单听听老师讲课,自己看看书就行的工作,而是要通过自己的实际动手操作,在实际中发现问题,然后带着问题去学习,去思考,去解决问题,一步一步的才会把老师教的知识慢慢转化为自己所掌握的内容。
虽然在指令译码测试中遇到了很多问题,但是通过老师讲解和查阅各种资料、学习借鉴网络上的他人经验,使我对ALU模块有了一定的理解。
衷心感谢老师的淳淳教诲,在以后的学习中,将更加珍惜机会,加强学习。