FPGA学习之路—应用程序—基于Verilog设计单总线8位ALU

FPGA学习之路——基于Verilog设计单总线8位ALU

定义

ALU(arithmetic and logic unit) 算术逻辑单元,简称ALU,是计算机的数学运算核心,也就是负责运算的组件,如将两个数相减或者做逻辑运算等。基本其它的组件都用到了ALU,它有两个单元,算术单元逻辑单元。算术单元执行如加、减、乘、除操作,逻辑单元执行与、或、非、异或等操作。

ALU的输入为操作数以及来自控制单元的控制命令(ADD R0,R1;),输出为运算结果以及状态信息。
ALU
ALU的设计流程如下图所示。
ALU设计流程

单总线结构,是指所有部件都接到同一总线上,数据可以在任何两个寄存器之间,或是在任一寄存器和ALU之间传送。在同一时间内,只能有一个操作数放在总线上进行传输。
所以对本次的ALU设计而言,需要分两次才能将两个操作数输入到ALU,且需要A、B两个缓冲寄存器。优点是控制电路比较简单,缺点是操作速度较慢。
单总线结构

功能

算术运算:带进位加减法、不带进位加减法
逻辑运算:与、或、异或、同或
移位操作:左移、右移、清零、取反

//算术运算
parameter A_ADDC=5'd1;   //带进位加法
parameter A_ADD=5'd2;    //不带进位加法
parameter A_SUBC=5'd3;   //带进位减法
parameter A_SUB=5'd4;    //不带进位减法
//逻辑运算
parameter A_AND=5'd5;     //与操作
parameter A_OR=5'd6;      //或操作
parameter A_XOR=5'd7;     //异或操作
parameter A_NOR=5'd8;     //同或操作
//移位功能
parameter A_SHIFT=5'd9;   //移位操作
//移位选择
parameter A_LSH=2'd0;     //左移操作
parameter A_RSH=2'd1;     //右移操作
parameter A_CLR=2'd2;     //数据清零
parameter A_CPL=2'd3;     //数据取反

输出包括计算结果dataout、进位标志CY、零标志ZN和溢出标志OV,以不带进位加法为例说明输出的计算过程。

A_ADD:begin
            {CYreg,dataout}<=RegA+RegB;
            ZNreg<=(RegA+RegB)?0:1;
            OVreg<=((RegA[7]==RegB[7])&&(RegA[7]!=dataout[7]))?1:0;
        end

补码加法运算溢出判断三种方法:在代码中我们用的法一。
[方法一]
Xf、Yf分别两个数的符号位,Zf为运算结果符号位。
当Xf =Yf =0(两数同为正),而Zf=1(结果为负)时,负溢出;
当出现Xf =Yf =1(两数同为负),而Zf=0(结果为正),正溢出.
[方法二]
Cs表示符号位的进位,Cp表示最高数值位进位,⊕表示异或。
若 Cs⊕Cp =0 ,无溢出;
若 Cs⊕Cp =1 ,有溢出。
[方法三]
用变形补码进行双符号位运算(正数符为00,负数符号以11)
若运算结果的符号位为"01",则正溢出;
若结果双符号为10,则负溢出;
若结果的双符号位为00或11,无溢出

实验结果

1、算术运算带进位加法,A=23,B=42,C0=1。
算术运算带进位算法
从结果我们可以看到,data总线开始进行RegA,RegB数据的传输。在运算完成后,输出结果又放到data总线上,实现了单总线的设计。运算结果66=23+42+1,验证正确。

2、逻辑运算,以异或为例。可以从下图看到异或逻辑正确。
逻辑运算结果

3、移位操作,RegA=18,RegB=2,以(RegA<<RegB)左移为例,结果如下,可以看到结果正确。
移位操作结果

心得

此模块中的data总线为inout类型,在编写代码和调试过程中遇到部分问题,使用方法如下。

inout data;
reg dataout;      //需输出的数据
reg link;         //inout口方向控制
assign data=(link)?dataout:1'bz;   //若输出数据则将dataout与data连接。
								   //若接收数据,则挂高阻态。

1、inout端口不能被赋值为reg型,因此,不能用于always语句中
2、对于inout端口的逻辑判断,要用到?:条件表达式,来控制高阻的赋值。当需要inout输入数据时,给高阻态。当需要给inout输出数据时,与相应的输出结果寄存器连接
3、写tb文件时,给inout数据进行赋值也是用assign的类似操作。
4、设置inout的高阻态时,高阻态的数据位数要与inout的位数一致,否则会“万里江山一片红”。

实验项目下载链接

猜你喜欢

转载自blog.csdn.net/qq_42334072/article/details/105922149