名称:基于FPGA的CPU的ALU数据通路设计Verilog代码VIVADO仿真
软件:VIVADO
语言:Verilog
代码功能:
ALU数据通路
一、分析
1.ALU模块(alu8.v)的控制信号:
综合考虑,确定ALU输入输出信号如下:
方向 |
信号名 |
说明 |
输入 |
a[7:0] |
操作数1 |
输入 |
b[7:0] |
操作数2 |
输入 |
alusel[3:0] |
运算功能选择。实验任务1要求设计加/减法器电路,实验任务2要设计具有13个功能的ALU模块。所以,确定该信号位宽位4bits。 |
输出 |
y[7:0] |
运算结果 |
输出 |
zf |
0标志。运算结果=0时,zf=1;否则,zf=0 |
输出 |
cy |
进位标志。运算结果有进位或借位时,cy=1;否则,cy=0。仅用于算术运算。 |
输出 |
of |
溢出标志。运算结果溢出时,of=1;否则,of=0。仅用于算术运算。 |
输出 |
nf |
负数标志。运算结果为负时,nf=1;否则,nf=0。仅用于算术运算。 |
2.?输入/输出缓冲器(threeStBuff.v)模块的控制信号:
综合考虑,确定输入/输出缓冲器的输入输出信号如下:
方向 |
信号名 |
说明 |
输入 |
DataIn[7:0] |
输入数据 |
输入 |
nDataToBus |
输入控制,nDataToBus=0时,缓冲器打开;否则输出端为高阻态。 |
输出 |
DataOut[7:0] |
输出数据,三态 |
本次实验的输入缓冲和ALU的输出缓冲采用此模块。
3.?寄存器(不带输出控制)(dr.v)模块的控制信号:
综合考虑,确定寄存器(不带输出控制)的输入输出信号如下:
方向 |
信号名 |
说明 |
输入 |
d[7:0] |
输入数据 |
输入 |
lddr |
输入数据锁存信号。上升沿时刻,输入存入。 |
输入 |
clrn |
输入控制。clrn =0时,寄存器复位,即输出q[7:0]为0。 |
输出 |
q[7:0] |
输出数据 |
本次实验的DR1和DR2采用此模块。
4.?三态缓冲寄存器(register.v)模块的控制信号:
综合考虑,确定寄存器(不带输出控制)的输入输出信号如下:
方向 |
信号名 |
说明 |
输入 |
DataIn[7:0] |
输入数据 |
输入 |
ldreg |
输入数据锁存信号。上升沿时刻,输入存入。 |
输入 |
nDataToBus |
输入控制,nDataToBus=0时,寄存器锁存的值输出;否则输出端为高阻态。 |
输出 |
DataOut[7:0] |
输出数据 |
本次实验的R0,R1,R2和R3采用此模块。
请参考下列源文件,设计具有上述功能的电路模块。
(1)修改参考文件alu8.v的内容,分别实现实验任务1和实验任务2的要求。
(2)参考dr.v和threeStBuff.v,设计三态缓冲寄存器模块。
(3)根据实验指导书电路原理图要求,参考下图所示电路,设计本次实验的顶层模块。
(4)参考alu_dataPath_sim.v,编写测试文件,分别仿真测试各电路模块以及顶层模块。仿真测试通过后,上板验证。自行设计仿真和上板验证(可选)过程,并分析仿真和上板验证(可选)结果。
设计出的运算器数据通路实验顶层电路图如下(alu_dataPath.v):
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
1. 工程文件
2. 程序文件
3. 程序编译
4. RTL图(顶层电路图)
部分代码展示:
`timescale?1ns?/?1ps //顶层文件 module?alu_dataPath( input?ldr0, input?nr0_bus, input?ldr1, input?nr1_bus, input?ldr2, input?nr2_bus, input?ldr3, input?nr3_bus, input?[7:0]?in, input?nsw_bus, input?lddr1, input?lddr2, input?nalu_bus, input?[3:0]?alusel, output?cy, output?zf, output?of, output?nf, output?[7:0]?DBUS ); wire?[7:0]?data_in; wire?[7:0]?data_out; wire?[7:0]?q_a; wire?[7:0]?q_b; wire?[7:0]?ALU_y; //寄存器模块 register?R0( .DataIn?????(data_in), .ldreg??????(ldr0), .nDataToBus?(nr0_bus), .DataOut????(data_out) ); //寄存器模块 register?R1( .DataIn?????(data_in), .ldreg??????(ldr1), .nDataToBus?(nr1_bus), .DataOut????(data_out) ); //寄存器模块 register?R2( .DataIn?????(data_in), .ldreg??????(ldr2), .nDataToBus?(nr2_bus), .DataOut????(data_out) ); //寄存器模块 register?R3( .DataIn?????(data_in), .ldreg??????(ldr3), .nDataToBus?(nr3_bus), .DataOut????(data_out) ); dr?DR1( .clrn?(1'b0), .d????(data_out), .lddr?(lddr1),? .q????(q_a) ); dr?DR2( .clrn?(1'b0), .d????(data_out), .lddr?(lddr2),? .q????(q_b) ); alu8?ALU(? .a?????(q_a), .alusel(alusel), .b?????(q_b), .cy????(cy), .nf????(nf), .of????(of), .y?????(ALU_y), .zf????(zf) ); threeStBuff?SWtoBus( .nDataToBus(nsw_bus), .DataIn????(in), .DataOut???(data_in) ); threeStBuff?ALUtoBus( .nDataToBus(nalu_bus), .DataIn????(ALU_y), .DataOut???(data_in) ); assign?DBUS=data_in; endmodule
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=855