一生一芯 算术逻辑部件 ALU verilog浅析与实现

2023-05-16

仙歌音,玉笛灵,酒盏玉露清
剑舞轻,潇洒过白袍影。----《谪仙》


一生一芯项目,预学习部分,数电实验学习记录,笔者电子寄术挂科,基础知识甚是不熟,故文中可能多有错漏,恳请指出!

0. 前言

笔者是新手,verilog很不熟练,写这个只是记录自己的学习过程避免遗忘,同时希望能够帮助后来者省去一些查资料的时间,所以代码肯定写的很烂,也多有错漏,恳请读者评论指出!

1. 项目要求

项目要求
功能选择只需要一个case语句就可以完成,后面的运算也都是基本运算,直接用内置的运算符就可以。但是尤其注意的是,这里需要设计的是补码运算功能。作为挂科学生,必须复习一下补码的运算法则了(感觉这玩意就算你没挂估计你也记不得了吧,毕竟平时用的不多)

2. 补码知识复习

这一部分多为网上资料,摘自这里

正数的补码就是其本身

负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

例如

[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补

3.补码的加减法

3.1 补码的加法

想要运用补码进行加运算:
设两数原码分别为A、B,则应:
1.将负数除了符号位之外的位取反后加1得到补码
2.直接按位相加,符号位直接溢出不管(超出字长部分直接舍弃)

例如

1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原

如果A、B已经是补码,直接相加就可以

3.2 补码的减法

设A、B为两数的补码,则:

A - B = A + ((~B) + 1)

即减去一个数等于加上这个数的(取反+1)。

4. 关于溢出判断的补充

我在查资料的时候也发现有人说,双符号位可以判断溢出,很有道理,摘在此处以为启发,原文点此

双符号位可以判断溢出情况
运算结束,符号位情况对应下列结果
00:结果为正数,无溢出
01:结果正溢出
10:结果负溢出
11:结果为负数,无溢出

5. 补码比较大小

定理:若符号位相同,则除去符号位之后的补码越大,原码也越大

所以直接先判断是否异号,异号就正大负小,同号直接比大小即可。

6. verilog程序实现

上面虽然复习了补码的内容,但是实际上这个ALU的输入就是补码,所以不需要你去写转换。

module top(
    input [2:0] command_input,
    input [3:0] a_input,
    input [3:0] b_input,
    input [0:0] clk,
    output [3:0] ans,
    output [0:0] overflow_flag
);

reg [3:0] temp_ans;
reg [0:0] temp_overflow_flag;
reg [2:0] command = command_input;
reg [3:0] a = a_input;   //如果你需要测试,command、a、b直接赋值就可以,例如
reg [3:0] b = b_input;	 //改成a = 4‘b0111;即可

    always @(posedge clk) begin
        case (command)
            3'b000:begin
            	 //这样写能够取出溢出的那一位,用以判断是否溢出,如果需要,可以输出
                 {temp_overflow_flag, temp_ans} = a + b;
            end
            3'b001:begin
                 b = ~b + 1;
                 {temp_overflow_flag, temp_ans} = a + b;
            end
            3'b010:begin
                 temp_ans = ~a;
            end
            3'b011:begin
                 temp_ans = a & b;
            end
            3'b100:begin
                 temp_ans = a | b;
            end
            3'b101:begin
                 temp_ans = a ^ b;
            end
            3'b110:begin
                if (a[3] == b[3]) begin		//判断符号位是否相等
                    if (a < b)  temp_ans = 1;	//符号位相等直接比大小
                        else  temp_ans = 0;
                end
                else begin					//符号位不相等直接比符号位
                    if ((a[3] == 0) && (b[3] == 1)) temp_ans = 0;
                    if ((a[3] == 1) && (b[3] == 0)) temp_ans = 1;
                end
            end
            3'b111:begin
                if (a == b)  temp_ans = 1;
                    else  temp_ans = 0;
            end
        endcase
    end

    assign ans = temp_ans;
    assign overflow_flag = temp_overflow_flag;		//溢出标志

endmodule

7. 调试中发现的问题

同样的程序,两次编译运行结果却不一样,实在是不知道为什么。不知道verilog的加法是如何自动舍弃的?有知道的请评论留言!

这是第一次运行,加数是0001和1111,答案显而易见应该是10000,因为溢出舍弃最高位,所以ans应该是0000,但是这里输出是0100,不是很懂。看这个样子是verilog舍弃了最低位?并且以为第5位是符号位?你看加完之后不是10000吗,他应该是自动补了符号位然后取了前四位?
1-1
第二次编译运行莫名奇妙的好了,没有改动任何东西。
1-2
截图证明两次都编译运行了,不是没有编译。
2-1
2-2
verilog加法自动舍弃的问题我还不是很懂,有知道的请留言一下
,谢谢。

和同学讨论之后,他建议我改成
3-1
来获得溢出的符号位。前者一位,后者四位,这样正好符合本位之前说的双符号位。所以程序中改成了这样,确实好用。

8. 后记

这个东西统共调了我一天,真的是憨,很不熟练。尤其是遇到了一个重大的问题,我会另发一篇博客来说,不过确实回顾、学到了一些知识。希望之后能加快进度。

命中注定不能靠近,爱你的事当作秘密。----《云与海》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一生一芯 算术逻辑部件 ALU verilog浅析与实现 的相关文章

随机推荐

  • 使用 Learner Lab 建立 WordPress 网站 (EC2)

    使用 Learner Lab 建立 WordPress 网站 EC2 AWS Academy Learner Lab 是提供一个帐号让学生可以自行使用 AWS 的服务 xff0c 让学生可以在 100 USD的金额下 xff0c 自行练习所
  • LaTex 排版相关记录--1 参考文献排版

    找到latex代码中的 bibligraphystyle xff0c 然后根据下面的各种需求进行替换 bibliographystyle unsrt 样式同plain xff0c 只是按照引用的先后排序 xff0c 参考文献会根据在正文中引
  • 使用rke构建企业生产k8s,安装kubectl客户端

    一 使用rke构建企业生产k8s xff0c 安装kubectl客户端 1 安装kubectl客户端工具 span class token comment wget https storage googleapis com kubernet
  • 保持pppoe不掉线

    对于无极网络的VPS 修改 etc ppp pppoe server options 这个文件里面的两个参数 默认 xff1a lcp echo interval 1 发送间隔秒 lcp echo failure 5 5次未响应断开 因为o
  • Linux环境编程06

    目录 Linux环境编程之进程管理一 进程的基本概念二 创建进程三 进程的正常退出 Linux环境编程之进程管理 一 进程的基本概念 进程与程序 程序是存储在磁盘上的可执行文件 xff0c 程序被加载到内存中开始运行时叫做进程 一个程序可以
  • 区间最大平均值

    题目链接 xff1a https www luogu com cn problem P1404 题目描述 xff1a 给一个长度为 n 的数列 xff0c 我们需要找出该数列的一个子串 xff0c 使得子串平均数最大化 xff0c 并且子串
  • 输出 0~N 内的素数 ( C++ )

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • 快读模板 ( C++ )

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • Java正整数分解质因数

    leetcode 2 Java正整数分解质因数 1 题目 xff1a 将一个正整数分解质因数 例如 xff1a 输入 90 打印出 90 61 233 5 2 题目解析 xff1a 先将数m从2开始整除 xff0c 如果能被2整除 xff0
  • you-get使用教程

    you get爬虫 xff0c 依赖于Python3 10 xff0c 可以爬取网页无法下载的视频文件 xff0c 具体步骤如下 xff1a 1 xff0c 下载Python3 10无脑下一步安装 2 xff0c 新建一个空白文件夹 xff
  • Windows如何自定义右键新建菜单栏

    目录 右键新建菜单的实现原理在右键新建菜单中新增项方法一可能出现的问题 方法二编辑右键新建菜单的图标 修改右键新建菜单栏的顺序 右键新建菜单的实现原理 参考文章 修改 win10 右键 新建 菜单 xff08 原理 两种方法及注意事项 xf
  • Centos 8升级至Centos 8 Stream

    文章目录 一 背景 xff1a 二 分析 xff1a 三 升级步骤 xff1a 四 成功安装 openstack 软件仓库参考链接 xff1a 一 背景 xff1a 因使用华为云ecs部署 openstack yoga 版本过程中 xff0
  • Ceph OSD为DOWN时修复

    本文所使用Ceph版本为luminous 不同版本删除OSD基本操作相同 xff09 xff0c 当出现Ceph OSD为down的情况时 xff0c 可以通过以下方法解决 xff08 假设ceph admin节点OSD 1 Down xf
  • 【Anaconda创建虚拟环境】报错及解决办法

    Q1 CondaHTTPError HTTP 000 CONNECTION FAILED for url 错误原因 xff1a 下载网速过慢 xff0c 时间过长 xff0c 自动断开 解决方法 xff1a 在下载命令前加入 conda c
  • 二叉树的绘制

    目录 一 知乎方法 二 动手实践 DOT 语言 无向图 有向图 绘制二叉树 设置属性 如何绘制优美的二叉树 一 知乎方法 知乎上的大佬提供了一系列画图的方法 xff0c 感兴趣的朋友可以自行去看看 用 Graphviz 绘制一棵漂亮的二叉树
  • 修改CPU的调频策略

    cat proc cpuinfo 查看CPU信息 CPU的调频策略修改 xff0c scaling governor xff1a governor 调频 策略 xff0c Linux 内核一共有 5 中调频策略 Performance xf
  • 一文看懂map、odom、base_link、laser之间的tf关系

    这三者之间的关系到底是怎样的 xff1f 尤其是map坐标系到odom坐标系之间的变换 xff0c 到底是有什么意义呢 xff1f 我当时被这个问题也是困扰了很久 现在经过实践终于有机会记录一下拙见 xff0c 如有错误 xff0c 还请指
  • VTK库cmake编译时找不到Qt5UiPlugin_DIR和QT5Sql_DIR

    ubuntu使用cmake gui编译VTK时 xff0c Qt5UiPlugin DIR和QT5Sql DIR是红的 xff0c 怎么办 xff1f 答 xff1a 安装libqt5x11extras5 dev和qt5 default两个
  • 超前进位加法器原理与递推式超详细推导+verilog实现与测试

    当记忆的线缠绕过往支离破碎 xff0c 是慌乱占据了心扉 寂寞沙洲冷 超前进位加法器原理 1 一位二进制的加法 首先考虑两个1位二进制相加 a 43 b xff0c 不考虑上一级的进位 xff0c 0和1简单相加 xff0c 即使是三岁小孩
  • 一生一芯 算术逻辑部件 ALU verilog浅析与实现

    仙歌音 xff0c 玉笛灵 xff0c 酒盏玉露清 剑舞轻 xff0c 潇洒过白袍影 谪仙 一生一芯项目 xff0c 预学习部分 xff0c 数电实验学习记录 xff0c 笔者电子寄术挂科 xff0c 基础知识甚是不熟 xff0c 故文中可