设计并实现一个ALU算数逻辑单元(哈工大计组实验一)

2023-10-29 17:40

本文主要是介绍设计并实现一个ALU算数逻辑单元(哈工大计组实验一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 目标
  • 设计
    • 编码
    • 模块接口设计
  • Verilog代码实现
  • 仿真测试
    • 仿真代码
    • 仿真波形图

目标

使用Verilog硬件编程语言完成一个简单的、具有执行16 种算术逻辑运算操作的电路,要求的16 种操作如下表所示:
操作

设计

编码

对ALU的16种运算的编码如下:
编码

模块接口设计

信号说明如下:
• 定义四个输入信号A、B、Cin、Card。其中,A、B 为32 位运算数,Card 为5 位运算操作码,Cin 为进
位。
• 定义三个输出信号F,Cout,Zero,其中F 为运算结果,Cout 为结果进位,Zero 为零标志。

Verilog代码实现

`define T_A_add_B			5'b00001
`define T_A_add_B_cin	5'b00010
`define T_A_sub_B			5'b00011
`define T_A_sub_B_cin	5'b00100
`define T_B_sub_A			5'b00101
`define T_B_sub_A_cin	5'b00110
`define T_value_A			5'b00111
`define T_value_B			5'b01000
`define T_not_A			5'b01001
`define T_not_B			5'b01010
`define T_or				5'b01011
`define T_and				5'b01100
`define T_xnot				5'b01101
`define T_xor				5'b01110
`define T_not_AB			5'b01111
`define T_zero				5'b10000
module alu(input [31:0] A ,     // 操作数input [31:0] B ,     // 操作数input Cin ,				// 进位input [4 :0] Card,	// 控制output [31:0] F ,  	// 结果output Cout,  			// 进位output Zero  			// 零标识位
);//  保存运算结果wire [31:0] A_add_B_result;wire [31:0] A_add_B_cin_result;wire [31:0] A_sub_B_result;wire [31:0] A_sub_B_cin_result;wire [31:0] B_sub_A_result;wire [31:0] B_sub_A_cin_result;wire [31:0] value_A_result;wire [31:0] value_B_result;wire [31:0] not_A_result;wire [31:0] not_B_result;	wire [31:0] or_result;wire [31:0] and_result;	wire [31:0] xnot_result;wire [31:0] xor_result;wire [31:0] not_AB_result;wire [31:0] zero_result;//  进位wire [1:0] Cout_a;wire [1:0] Cout_b;wire [1:0] Cout_c;wire [1:0] Cout_d;wire [1:0] Cout_e;wire [1:0] Cout_f;//  如果是运算后立即赋值,而被赋值变量较宽,则按被赋值的变量宽度计算assign {Cout_a, A_add_B_result} = A + B;assign {Cout_b, A_add_B_cin_result} = A + B + Cin;assign {Cout_c, A_sub_B_result} = A - B;assign {Cout_d, A_sub_B_cin_result} = A - B - Cin;assign {Cout_e, B_sub_A_result} = B - A;assign {Cout_f, B_sub_A_cin_result} = B - A - Cin;assign value_A_result = A;assign value_B_result = B;assign not_A_result = ~A;assign not_B_result = ~B;assign or_result = A | B;assign and_result = A & B;assign xnot_result = ~(A ^ B);assign xor_result = A ^ B;assign not_AB_result = ~(A & B);assign zero_result = 0;//  计算结果:通过Card值的不同,在多个计算结果中选择一个赋值给Fassign F = 	({32{Card == `T_A_add_B}} & A_add_B_result) |({32{Card == `T_A_add_B_cin}} & A_add_B_cin_result) | ({32{Card == `T_A_sub_B}} & A_sub_B_result) | ({32{Card == `T_A_sub_B_cin}} & A_sub_B_cin_result) | ({32{Card == `T_B_sub_A}} & B_sub_A_result) | ({32{Card == `T_B_sub_A_cin}} & B_sub_A_cin_result) | ({32{Card == `T_value_A}} & value_A_result) | ({32{Card == `T_value_B}} & value_B_result) | ({32{Card == `T_not_A}} & not_A_result) | ({32{Card == `T_not_B}} & not_B_result) | ({32{Card == `T_or}} & or_result) | ({32{Card == `T_and}} & and_result) | ({32{Card == `T_xnot}} & xnot_result) | ({32{Card == `T_xor}} & xor_result) | ({32{Card == `T_not_AB}} & not_AB_result) | ({32{Card == `T_zero}} & zero_result);//  判断是否产生进位assign Cout = 	(Card == `T_A_add_B && Cout_a != 0)|(Card == `T_A_add_B_cin && Cout_b != 0) |(Card == `T_A_sub_B && Cout_c != 0) |(Card == `T_A_sub_B_cin && Cout_d != 0) |(Card == `T_B_sub_A && Cout_e != 0) |(Card == `T_B_sub_A_cin && Cout_f != 0);//  判断结果是否位0assign Zero = F == 0;endmodule

仿真测试

这里我们将A固定为{1’b1, 31’b11},B固定为{1’b1, 31’b101},通过改变Card的值来观察执行不同操作时的输出。

仿真代码

module alu_tb;// Inputsreg [31:0] A;reg [31:0] B;reg Cin;reg [4:0] Card;// Outputswire [31:0] F;wire Cout;wire Zero;// Instantiate the Unit Under Test (UUT)alu uut (.A(A), .B(B), .Cin(Cin), .Card(Card), .F(F), .Cout(Cout), .Zero(Zero));initial begin// Initialize InputsA = {1'b1, 31'b11};B = {1'b1, 31'b101};Cin = 1;Card = 5'b00001;// Wait 100 ns for global reset to finish#100;// Add stimulus hereendalways #10 Card = (Card + 1) % 16 == 0 ? 16 : (Card + 1) % 16;endmodule

仿真波形图

波形图
结果如下:
结果

这篇关于设计并实现一个ALU算数逻辑单元(哈工大计组实验一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/302266

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

计组基础知识

操作系统的特征 并发共享虚拟异步 操作系统的功能 1、资源分配,资源回收硬件资源 CPU、内存、硬盘、I/O设备。2、为应⽤程序提供服务操作系统将硬件资源的操作封装起来,提供相对统⼀的接⼝(系统调⽤)供开发者调⽤。3、管理应⽤程序即控制进程的⽣命周期:进程开始时的环境配置和资源分配、进程结束后的资源回收、进程调度等。4、操作系统内核的功能(1)进程调度能⼒: 管理进程、线

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry