当前位置: 首页 > news >正文

《一生一芯》数字实验三:加法器与ALU

1. 实验目标

设计一个能实现如下功能的4位带符号位的 补码 ALU:

Table 4 ALU 功能列表 

功能选择

功能

操作

000

加法

A+B

001

减法

A-B

010

取反

Not A

011

A and B

100

A or B

101

异或

A xor B

110

比较大小

If A<B then out=1; else out=0;

111

判断相等

If A==B then out=1; else out=0;

ALU进行加减运算时,需要能够判断结果是否为0,是否溢出,是否有进位等。这里,输入的操作数A和B都已经是补码。比较大小请按带符号数的方式设置。

执行逻辑操作时不需要考虑overflow和进位。

由于开发板上输入有限,可以使用SW作为数据输入,button作为选择端。使用SW作选择器。

2. 通过实验的收获

1. 理解ALU 功能单元单元

2. 理解进位和溢出位的区别。进位是加法器每个比特相加过程中的中间结果。而溢出位是最终结果用来判断计算结果是否有效的指示信息。

3. 如何通过C代码读取硬件模块中的值

3. 实现过程

1. 新增 alu_bit4.v 模块文件

利用组合逻辑实现计算,利用case语句实现对溢出位的判断。下面是实验中的部分代码。

// 预计算所有可能的操作结果assign not_A     = ~A;assign and_result = A & B;assign or_result  = A | B;assign xor_result = A ^ B;assign add_result = {1'b0, A} + {1'b0, B};  // 扩展为5位进行加法assign sub_result = {1'b0, A} - {1'b0, B};  // 扩展为5位进行减法// 根据opcode选择执行的操作always @(*) begincase (opcode)3'b000: begin  // 加法result  = add_result[3:0];carry   = add_result[4];  // 进位为最高位overflow = (A[3] == B[3]) && (result[3] != A[3]); // 符号相同但结果符号不同end3'b001: begin  // 减法result  = sub_result[3:0];carry   = ~sub_result[4];  // 减法的借位取反overflow = (A[3] != B[3]) && (result[3] != A[3]); // 符号不同但结果符号异常end

2.修改top.v文件

例化ALU模块,同时将计算结果的变量添加到输出端口,方便main.cpp进行访问

module top(input clk,input rst,input [4:0] btn,input [15:0] sw,input ps2_clk,input ps2_data,input uart_rx,output uart_tx,output [15:0] ledr,output VGA_CLK,output VGA_HSYNC,output VGA_VSYNC,output VGA_BLANK_N,output [7:0] VGA_R,output [7:0] VGA_G,output [7:0] VGA_B,output [7:0] seg0,output [7:0] seg1,output [7:0] seg2,output [7:0] seg3,output [7:0] seg4,output [7:0] seg5,output [7:0] seg6,output [7:0] seg7,output [3:0] result, //实验三:简易4bit ALUoutput zero, //实验三:简易4bit ALUoutput overflow,//实验三:简易4bit ALUoutput carry //实验三:简易4bit ALU
);//实验三:简易4bit ALU// output declaration of module alu_4bitalu_4bit u_alu_4bit(.A        	(sw[3:0]        ),.B        	(sw[7:4]        ),.opcode   	(sw[10:8]      ),.result   	(result    ),.zero     	(zero      ),.overflow 	(overflow  ),.carry    	(carry     )
);
3.修改main.cpp 文件

添加对输出结果的打印

      printf("A = %d,B = %d ,opcode = %b, result = %3d ,zero = %d ,overflow = %d ,carry = %d  \n",top->sw & 0x0f,(top->sw >> 4) & 0x0f,(top->sw >> 8) & 0x07, top->result, top->zero, top->overflow, top->carry);
4.运行结果

SW[3:0] 为输入A

SW[7:4] 为输入B

SW[10:8] 为计算选择器

在npc目录下 ,运行make run 可以实验体验

下图位一个 6-2  的实验输出

相关文章:

  • ASP.NET Core使用Quartz部署到IIS资源自动被回收解决方案
  • Ubuntu崩溃修复方案
  • 购物商城网站 Java+Vue.js+SpringBoot,包括商家管理、商品分类管理、商品管理、在线客服管理、购物订单模块
  • 船舶事故海上搜救VR情景演练全场景 “复刻”,沉浸式救援体验​
  • 机器学习的数学基础:决策树
  • Unity VR/MR开发-VR设备与适用场景分析
  • HTML中各种标签的作用
  • 为什么要选择VR看房?VR看房有什么优点?
  • html - <mark>标签
  • 【Go语言基础【3】】变量、常量、值类型与引用类型
  • html文字红色粗体,闪烁渐变动画效果,中英文切换版本
  • 酷黑NBA足球赛事直播源码体育直播M39模板赛事源码
  • Ubuntu20.04设置为开机后直接自动进入纯命令行界面
  • Cilium动手实验室: 精通之旅---4.Cilium Gateway API - Lab
  • 从0开始学习R语言--Day17--Cox回归
  • Ubuntu ifconfig 查不到ens33网卡
  • Axure零基础跟我学:展开与收回
  • 【hadoop】Davinci数据可视化工具的安装部署
  • 如何自定义一个 Spring Boot Starter?
  • 【hadoop】Flink安装部署
  • 旅行社网站的建设开题报告/网站可以自己建立吗
  • web网站建设培训班/公司调查公司
  • 紧固件做网站有效果吗/学seo需要学什么专业
  • 网站建立的意义/全网推广方案
  • 做app的模板下载网站有哪些内容/百度推广客户端下载网址
  • 网站免费靠谱2021/雅虎搜索引擎