FPGA学习之路—应用程序—基于Verilog设计单总线8位ALU
FPGA学习之路——基于Verilog设计单总线8位ALU
定义
ALU(arithmetic and logic unit) 算术逻辑单元,简称ALU,是计算机的数学运算核心,也就是负责运算的组件,如将两个数相减或者做逻辑运算等。基本其它的组件都用到了ALU,它有两个单元,算术单元和逻辑单元。算术单元执行如加、减、乘、除操作,逻辑单元执行与、或、非、异或等操作。
ALU的输入为操作数以及来自控制单元的控制命令(ADD R0,R1;),输出为运算结果以及状态信息。
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的位数一致,否则会“万里江山一片红”。
- FPGA学习之路—应用程序—原码二位乘法器及Verilog代码分析
- [Craftor原创]基于Verilog的I2C总线驱动设计
- 基于FPGA的PCIE总线扩展卡的设计
- 小嵩的毕设学习之路--基于Scut的FPS设计实现(17.12.22)
- 小嵩的毕设学习之路--基于Scut的FPS设计实现(17.12.31)
- 小嵩的毕设学习之路--基于Scut的FPS设计实现(18.01.02)
- 小嵩的毕设学习之路--基于Scut的FPS设计实现(17.12.23)
- 小嵩的毕设学习之路--基于Scut的FPS设计实现(18.01.01)
- 基于matlab FPGA verilog的FIR滤波器设计
- 小嵩的毕设学习之路--基于Scut的FPS设计实现(17.12.25)
- Verilog与FPGA数字系统设计学习笔记(一)——EDA技术概述与fpga概述
- FPGA 学习之路(一)EDA软件设计流程
- 小嵩的毕设学习之路--基于Scut的FPS设计实现(17.12.30)
- FPGA学习(第8节)-Verilog设计电路的时序要点及时序仿真
- FPGA 学习之路 (七) UART串口设计
- 小嵩的毕设学习之路--基于Scut的FPS设计实现(17.12.19)
- 基于AHB总线的master读写设计(Verilog)
- 【Verilog】基于FPGA的打地鼠小游戏设计(VGA显示、附代码、演示视频)
- 【Verilog】基于FPGA的闹钟系统设计(功能完整、附代码)
- 小嵩的毕设学习之路--基于Scut的FPS设计实现(17.12.20)