vivado实现ALU模块,Opcode实现8命令格式和3地址索引

这篇具有很好参考价值的文章主要介绍了vivado实现ALU模块,Opcode实现8命令格式和3地址索引。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ALU 模块设计要求

介绍

MIPS(Microprocessor without Interlocked Pipeline Stages),是一种采取精简指令集(RISC)的指令集架构(ISA),由美国 MIPS 计算机系统公司开发。MIPS 广泛被使用在许多电子产品、网络设备、个人娱乐设备与商业设备上。最早的 MIPS 架构是 32 位,最新的版本已经变成 64 位,其商业市场主要竞争对手为 ARM 与 RISC-V。在国内外一些著名大学中计算机架构的课程上,学生们通常会首先学习 MIPS 架构。这个架构极大地影响了后来的精简指令集架构,如 Alpha。我国的龙芯 CPU 在起步的时候,也采用 MIPS 架构, 2020 年 8 月龙芯推出了自主设计的 CPU 指令集——LoongArch,其中依然可以看到 MIPS 一些设计理念。32 位 MIPS 1 代的指令集共有 31 条,本次实验需要同学们实现 MIPS 指令中的 ALU 指令所对应的 ALU 计算单元。

ALU寄存器和指令描述

表格中一共有八个算术和逻辑指令。它们是 ADD、SUB、AND、OR、XOR、NOT、SRA 和 SLL。其中 ADD、SUB、AND、OR、XOR 和 NOT 指令具有三地址格式。这些指令的汇编级语法是

指令位数 15 : 12 11 : 8 7 : 4 3 : 0
Opcode 指令 寄存器地址rd 操作数地址rs 操作数地址rt

ADD、SUB、AND、OR、XOR 和 NOT 指令还设置或清除状态字寄存器 PSW 中的零 (Z)、溢出 (V) 和符号 (N) 位。

  • 当且仅当操作的输出为零时设置 Z 标志。
  • 当且仅当操作导致溢出时,V 标志由 ADD 和 SUB 指令设置。如果遇到 AND、OR、XOR 和 NOT 指令在执行的时候需要清除 V 标志。
  • 当且仅当 ADD 和 SUB 指令的结果为负时,才会设置 N 标志。AND、OR、XOR 和 NOT 指令清除 N 标志。
    除了上一段中描述的那些之外,没有其他指令设置或清除 PSW 标志。
  1. SRA 是算数右移指令, SLL 是逻辑左移指令SRA 和 SLL 指令具有以下汇编级语法。其中 imm 是 SRA 和 SLL 指令的无符号表示的 4 位立即数(Immediate)。 SRA 和 SLL 按 imm 字段中指定的位数移位 (rs),并将移位后的结果保存在寄存器 rd 中。 SRA 是右移算术,SLL 是左移逻辑。 SRA 和 SLL 指令保持标志不变。
  2. 八个算术指令的机器级编码是0aaa dddd ssss tttt其中 aaa 代表操作码(见表 1),dddd 和 ssss 分别代表 rd 和 rs 寄存器。 tttt 字段代表 rt 寄存器或 imm 字段。
  3. 请实现这 8 种 ALU 运算,列出操作码的编码(),其中包括加减运算,其中减法在
    内部要转换为加法,与加法运算共同调用实验一里的加法模块。
  4. 8 种的 ALU 运算均需要两个时钟周期才能完成
  5. 要求设计一种指令译码器,可以根据 Opcode 来产生该指令所对应的控制信号。
  6. 使用 Verilog 编写或优化相应代码 alu.v。
  7. 编写仿真代码,得到正确的测试波形图,来测试每一条指令
  8. 将以上的所有指令的设计在一个单独的 ALU 模块,设计一个外围模块(TestBench)去调用该模块,完成设计并编写代码 alu_testbench.v,在 TestBench 中需要对每一条指令进行 8 个测试用例,每一次测试要求均输入的是随机数;TestBench 也需要提供操作数。

相关实验配置

(这一块是实验报告要求,大家可自行跳过)

  • 使用软件:vivado 2019.1版本
  • 相关配置:xc7k7Otfbv676-2
  • 电脑版本:win11 Windows Feature Experience Pack 1000.25136.1000.0
  • 电脑配置:Intel® Core™ i7-10710U CPU @ 1.10GHz 1.61 GHz;32.0 GB (31.8 GB 可用)

实验内容

此次实验代码可在以下链接自行下载:
GitHub:https://github.com/Junzhou-Chen/ALU-Design
CSDN:https://download.csdn.net/download/weixin_51717597/85643775

运算器种类

此次实验功实现8种运算器,共包括:位与、位或、异或、非、补码加法、补码减法、算数左移和算数右移

alu模块设置

module alu(
    input [3:0]Opcode,				// 4位指令
    input  [15:0] alu_src1, 		// 操作数1
    input  [15:0] alu_src2,			// 操作数2
    input  [3 :0] Opcode_src3,		// 操作数2指令地址
    output reg [2:0] PSW,			// 状态字寄存器 PSW
    output reg [15:0] td			// 结果寄存器td
    );
  • 位与实现:
td = alu_src1 & alu_src2;
if(!td) PSW = 3'b100; 
else PSW = 3'b000;
  • 位或实现:
td = alu_src1 | alu_src2;
if(!td) PSW = 3'b100;
else PSW = 3'b000;
  • 异或实现:
td = alu_src1 ^ alu_src2;
if(!td) PSW = 3'b100;
else PSW = 3'b000;
  • 非实现:
td = ~alu_src1;
if(!td) PSW = 3'b100;
else PSW = 3'b000;
  • 加法实现:
td = alu_src1 + alu_src2;  
PSW[2] = 1 & td; // 是否为0
PSW[1] = ((~alu_src1[15])&(~alu_src2[15])&td[15])|(alu_src1[15]&alu_src2[15]&(~td[15])); // 是否溢出
PSW[0] = td[15]; // 符号位
  • 减法实现:
num2 = alu_src2[15]?{alu_src2[15],~alu_src2[14:0]+1}:alu_src2;
td = alu_src1 + num2;  
PSW[2] = 1 & td; // 是否为0
PSW[1] = ((~alu_src1[15])&(~num2[15])&td[15])|(alu_src1[15]&num2[15]&(~td[15])); // 是否溢出
PSW[0] = td[15]; // 符号位
  • 算数左移实现:
td = alu_src1 >>> Opcode_src3;
PSW = 3'b000;
  • 算数右移实现:
td = alu_src1 <<< Opcode_src3;
PSW = 3'b000;

testbench实现

testbench中需要设置寄存器,其中每个指令地址能够映射16个寄存器,所以三种寄存器都要有16组
配置如下:

reg     [15:0]  Opcode;                 //指令格式:15-12是指令,11-8是结果的下标,7-4是操作数1的下标,3-0是操作数2的下标
reg		[15:0]	alu_src1_ram	[15:0];	//16位宽、16深度的内存(RAM),用来存储操作数1
reg		[15:0]	alu_src2_ram	[15:0];	//16位宽、16深度的内存(RAM),用来存储操作数2
reg		[15:0]	td_ram			[15:0];	//16位宽、16深度的内存(RAM),用来存储运算结果

其余部分需要随机生成Opcode对alu模块进行测试
初始化时alu_src1_ram和alu_src2_ram都设置为随机数,td_ram设置为0,设置代码如下:

initial begin
    Opcode = 0;
    //对操作数2赋初值,方法为随机赋值,这一段只能想到for循环,always总报错
	for(integer i2 = 0; i2 <16; i2 = i2 + 1) begin
	    //对操作数1赋初值,方法为随机赋值
		alu_src1_ram[i2] <= {$random} % 2**16; 
	    //对操作数2赋初值,方法为随机赋值
		alu_src2_ram[i2] <= {$random} % 2**16;   
		//对运算结果赋初值,赋值为全0
		td_ram[i2] <= 16'd0;
	end
	#100;			
end

测试时序图

vivado实现ALU模块,Opcode实现8命令格式和3地址索引
vivado实现ALU模块,Opcode实现8命令格式和3地址索引
其中Opcode为16位指令,alu_sc1_ram和alu_scr2_ram为操作数寄存器地址,td_ram为结果寄存器地址,PSW为状态寄存器,op_index、alu_src1_index、alu_src2_index和td_index为指令模块拆分结果文章来源地址https://www.toymoban.com/news/detail-485173.html

到了这里,关于vivado实现ALU模块,Opcode实现8命令格式和3地址索引的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Nginx常用内置模块, 实现目录索引+状态监控+IP访问控制+用户访问控制

    1.安装nginx 2.配置nginx扩展配置文件,实现自定义网页根目录 3.配置autoindex自动索引模块 4.配置nginx状态监控模块 5.配置nginx基于IP访问控制access模块 6.配置nginx基于用户访问控制auth模块 1.挂载光盘,进入nginx软件包目录 umount /dev/cdrom /mnt eject mount /dev/cdrom /mnt cd /mnt/nginx-rpm/ 2.使用

    2024年01月21日
    浏览(57)
  • vivado创建原理图模块

               

    2024年02月11日
    浏览(31)
  • IP协议 (通俗易懂),IP协议的主要功能及实现原理,IP地址分类,IP数据包分片,IP数据报格式。

    「作者主页」: 士别三日wyx 「作者简介」: CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「专栏简介」: 此文章已录入专栏《计算机网络零基础快速入门》 IP协议的作用是什么? IP地址分类有哪些? IP数据包为什么分片?怎么分片? IP是一种 「不

    2024年02月02日
    浏览(49)
  • [Vivado那些事儿]将自定义 IP (HDL)添加到 Vivado 模块设计(Block Design)

    使用Vivado Block Design设计解决了项目继承性问题,但是还有个问题,不知道大家有没有遇到,就是新设计的自定义 RTL 文件无法快速的添加到Block Design中,一种方式是通过自定义IP,但是一旦设计的文件有问题就需要重新修改,同时需要控制接口时候还需要在AXI总线模板基础上

    2024年02月02日
    浏览(53)
  • Vivado自写分频模块的分频时钟的约束条件编写

    由于项目需要,整个工程需要在100kHz的时钟下运行,FPGA的clk:50MHz clocking wizard 问题:MMCM和PLL都不能实现分频到100KHz这么低的频率 MMCM最小频率4.687MHz PLL最小频率6.25MHz 分频模块如下: 问题:自己写的分频模块直接使用是不可以的,需要在约束文件中进行时序约束 (1)打开

    2024年02月07日
    浏览(63)
  • VIVADO 综合优化掉模块或者综合太长的原因

    1.首先,不要怀疑综合工具,大概率自己写的代码有问题。 2.直接进入正题,在综合后的原理图中模块被综合优化掉了,附图如下: 可以看到,图中的输入信号没有接到模块内部。  3.解决方法 (1)从例化入手,看例化信号有没有定义正确,例化端口正确不。 (2)从代码入

    2024年02月11日
    浏览(82)
  • Vivado仿真小技巧,让所有模块的波形都可以显示

    使用vivado仿真的过程中,经常会遇到要查看某个信号的波形,但这个信号并没有被添加进来。这时就需要添加该信号,再重新仿真。遇到仿真时间较长的工程,效率会很低。有两种方法可以解决这个问题。 首先打开settings,在弹出的页面中选中simulation,右侧出现simulation的配

    2024年02月11日
    浏览(54)
  • Vivado设计资源优化 ,查看各子模块资源占用的方法大全

    在FPGA开发中,资源占用和时序约束一直是主要问题。为了解决这些问题,Vivado提供了丰富的优化工具和资源占用分析工具,帮助工程师优化FPGA设计,深入了解各个子模块的资源使用情况。 本文将从资源占用的角度,介绍Vivado中如何进行FPGA设计资源优化以及查看各子模块资源

    2024年02月11日
    浏览(41)
  • Apache Lucene 7.0 - 索引文件格式

    原文地址 这个文档定义了在这个版本的Lucene中使用的索引文件格式。如果您使用的是不同版本的Lucene,请查询对应版本的文档。 本文档试图提供Apache Lucene文件格式的高级定义。 Lucene的基本概念是索引、文档、字段和术语(分词后的检索词)。 索引包含一系列文档。 文档是

    2024年02月07日
    浏览(29)
  • BoostCompass(建立正排索引和倒排索引模块)

    这个模块我们定义了一个名为 Index 的C++类,用于构建和维护一个文档索引系统。该系统采用单例模式确保只有一个索引实例,并使用正排索引和倒排索引来快速检索文档。正排索引存储了文档的基本信息,如标题、内容和URL,而倒排索引则根据将文档分组。类中提供了

    2024年04月13日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包