加减乘除是运算的基础,也是我们在小学课堂里的重点必修课。乘除运算虽然对于我们今天来说还是小菜一碟,让计算机做起来也是九牛一毛不足挂齿,但是要真探究一下计算机是如何完乘除运算的,可还真有些学问和技巧,并不是人脑那么9*9一闪而过81出来了,计算机虽然得到结果的时间可能比人要快上不知道多少个数量级,但它怎么说还是需要一个过程的。可能不同的CPU内部的运算原理和机制略有差异,我们也无法完全去把这些运算方式搞清楚,这个例程我们就老老实实的用移位累加的方式完成两个8位无符号数的乘法运算。这里先随便举个例子来说明我们的运算原理,例如8位无符号数189和25相乘。因为计算机只认识0和1,因此一切运算的基础都是0和1,所以我们的运算也必须是基于2进制来进行的。因此,我们首先要完成机制的转换。乘数189对应的2进制数为10111101,被乘数25对应的2进制数为00011001。按照我们最常用的10进制乘法运算的方式,我们可以得到如图1所示的2进制乘法。在这个运算过程中,我们从被乘数的最低位到最高位依次判断其取值是1还是0,如果是1则对乘数累加,否则不累加(即取0),需要累加的乘数根据当前被乘数位需要进行相应的移位,如被乘数的bit3为1,则乘数相应左移3次(即放大8倍)作为累加数。依据此原理,我们要设计的8位无符号乘法也是通过对被乘数进行逐位判断后累加进行左移的乘数而得到最终的结果。

图1 2进制乘法在我们的8位无符号乘法运算中,一些基本的接口信号及其功能为:8位无符号数ain和bin是需要进行运算的两个乘数;输出的结果用16位无符号数yout表示;enable信号为运算使能信号;ready信号为运算完成标志位。用户先给ain和bin赋值,然后将enable信号拉高后即开始运算,大约8个时钟周期后运算输出结果,ready信号输出高电平表示运算结果有效,此后如果enable信号被用户拉低则ready信号也随后拉低,表示完成一次运算。接着用户可以给ain和bin赋新的运算值,然后拉高enable信号继续一次新的运算。Verilog参考实例module mux(            clk,rst_n,            enable,ain,bin,yout,ready        );input clk;input rst_n;input enable;                                                           (1)input[7:0] ain;                                                        (2)input[7:0] bin;                                                         (3)output reg[15:0] yout;                                                  (4)output reg ready;                                                       (5)reg[4:0] i;                                                            (6)always@(posedge clk)    if(!rst_n) begin        ready <= 1'b0;        yout <= 16'h0000;        i <= 4'd0;    end    else if(enable)begin        if(i < 4'd8) i <= i+1'b1;        else ;        if(i < 4'd7) begin                                              (7)            ready <= 1'b0;            if(ain[i]) yout <= (yout+{1'b0,bin,7'd0})>>1;               (8)            else yout <= yout>>1;                                       (9)        end        else if(i == 4'd7) begin                                        (10)            if(ain[i]) yout <= yout+{1'b0,bin,7'd0};                    (11)            else ;                                                      (12)            ready <= 1'b1;                                              (13)        end        else ready <= 1'b0;    end    else begin        i <= 4'd0;        yout <= 16'h0000;    endendmodule

运算使能信号。0表示无操作;1表示将对当前输入的ain和bin进行乘法运算。

8位无符号数,他将和bin进行相乘操作。

8位无符号数,他将和ain进行相乘操作。

16位的无符号数,用于存储2个8位无符号数相乘的运算结果。

乘法运算完成标志位。当前运算完成后输出高电平,此后如果enable信号拉低则该信号也拉低无效。

移位计数器,在enable=1时,每个时钟周期i会递增直到i=8停止。i=0~7时,对应进行移位累加计算。

进行7次的移位累加运算(不包括最后一次最高位的累加运算)。我们这里的累加,并不是完全仿照原理中示意的方式进行移位然后累加,而是先将累加的乘数左移7位,然后每次累加完右移1位,对应7次累加完成后,最低位就回到了运算结果的最低位,而第8次累加即最高位的累加运算是不进行移位的。

被乘数的相应位为1,则进行累加并右移1位。

被乘数的相应位为0,则值移位不累加。

第8次累加运算不进行移位操作,

被乘数的相应位为1,则进行累加但不移位。

被乘数的相应位为0,则值不累加也不移位。

最后一次移位,则拉高ready信号表示运算完成,输出结果有效。

仿真验证         这里的验证专门编写了一个小任务,入口参数是给ain和bin的赋值,然后使能enable信号,发起一次运算操作,待ready信号拉高后比对运算结果yout是否正确,打印结果,然后撤销(拉低)enable信号完成当前运算。在iniTIal里面,通过256*256次调用这个小任务,完成对该乘法器的验证。`TImescale 1 ns/ 1 psmodule mux_vlg_tst();reg [7:0] ain;reg [7:0] bin;reg clk;reg enable;reg rst_n;                                      wire ready;wire [31:0]  yout;reg[8:0] i,j;                     mux i1 (    .ain(ain),    .bin(bin),    .clk(clk),    .enable(enable),    .ready(ready),    .rst_n(rst_n),    .yout(yout));iniTIal begin      $display("mux example simulaTIon is running.\n");    rst_n = 0;                                         clk = 0;       enable = 0;    ain = 8'hzz;    bin = 8'hzz;    #1000;    @(posedge clk);                                                        rst_n = 1;     for(i=0;i<256;i=i+1) begin                                          (1)        for(j=0;j<256;j=j+1) begin                                      (2)            mux_ab(i,j);                                                (3)        end    end    $display("mux example simulation is over.All right.\n");            (4)    $stop;                                                             end                                                   always #10 clk = ~clk;  task mux_ab;                                                            (5)    input[7:0] a;    input[7:0] b;    begin        @(posedge clk); #3;        ain = a;                                                               bin = b;                                                               enable = 1;                                                     (6)        @(posedge ready);                                               (7)        @(posedge clk); #3;        if(a*b == yout) $display("%3d * %3d = %5d, it is right.",a,b,yout);                                                                        (8)        else begin                                                      (9)             $display("%3d * %3d = %5d, it is wrong.",a,b,yout);            $stop;        end        @(posedge clk); #3;        enable = 0;                                                     (10)        ain = 8'hzz;        bin = 8'hzz;    endendtask                                         endmodule

乘数ain从0到255递增。

被乘数bin从0到255递增,以此完成全便利测试。

调用乘法运算任务,输入参数i和j分别会赋值给ain和bin用于运算。

所有测试成功完成,则最终打印“mux example simulation is over.All right.”的信息,如果测试中出现任何一个错误,则测试脚本会停止运行,也就意味着见不到这条语句。

产生一次乘法运算任务的激励。输入参数a和b分别为运算的输出乘数和被乘数。

使能信号拉高,发起一次乘法运算。

等待ready信号拉高,表示乘法运算完成,输出结果有效。

测试模块输出的乘法运算结果正确,打印相关信息。

测试模块输出的乘法运算结果错误,打印错误提示并停止测试脚本的运行。

拉低enable信号完成当前运算。

如图2所示,为当前测试结果,我们看到了最后的“mux example simulation is over.All right.”提示信息,表示测试通过。

图2 mux工程测试结果

计算机中 8位无符号数,8位无符号数乘法运算HDL设计实例 - 全文相关推荐

  1. win7计算机中丢失mfc120,mfc120.dll 64位

    mfc120.dll是系统必备的一个正常组件,在办公软件.游戏运行的时候经常会提示"mfc120.dll没有被指定windows上运行"或"计算机中丢失mfc120.dl ...

  2. 字长64位计算机中的64是指,“64位计算机”中的64是指机器字长还是内存容量

    "64位计算机"中的64,是指CPU字长为64位2进制数,64位计算机的CPU一次可以处理64位2进制数. 16位.32位.64位等术语在操作系统理论中主要是指存储器定址的宽度.如 ...

  3. 计算机中用户的分类有哪些,用户分类浅谈交互设计 -电脑资料

    说到网络产品,离不开的话题就是用户,就像传统行业的消费者, 不分类不好定位, 好的用户分类让我知道了我在追求哪些人,满足哪些人,影响哪些人.但分不好类又会错位,更糟,那怎样才能对某一款产品的用户群进行 ...

  4. 计算机中逻辑运算顺序,【计算机系统】位运算与逻辑运算

    计算机系统的位运算与逻辑运算 一.位 1.定义 二进制数字系统中数据存储的最小单位,即每个二进制数0或1就称为位.位也叫比特(bit),8个bit组成一个字节(byte),每个字节表示程序中的某些文本 ...

  5. 计算机中丢失storm.d,win10 64位电脑缺少storm.dll怎么办_win10玩暗黑破坏神2缺少storm.dll文件修复方法...

    storm.dll文件是专门为暴雪游戏像我们大家熟知的暗黑破坏神2所打造的游戏dll文件,只有拥有它,游戏才能够正常运行,当用户遇到win10电脑运行游戏缺少storm.dll时应该怎么办呢?这里就来 ...

  6. 用计算机计算下列各式 11x,用计算器计算有理数的乘方教学设计实例

    <用计算器进行数的简单运算>教学设计 教学目的 1. 使学生能够使用A型,B型,C型计算器,进行有理数的加,减,乘,除,乘方运算,并能运用计算器进行较复杂的有理数的混合运算. 2. 初步体 ...

  7. 计算机怎么升级64位操作系统,如何将计算机的32位更改为64位

    64位技术相对于32位,此位是指CPUGPR(通用寄存器,通用寄存器)的数据宽度为64位,64位指令集是运行64位的指令数据,这也意味着处理器可以一次运行64位数据. 64位处理器不仅现在可用. 在高 ...

  8. 计算机和学数制和码制,[文学]第二章 计算机中的数制和码制.ppt

    [文学]第二章 计算机中的数制和码制 注意:十六进制计数法是为了克服二进制计数法书写麻烦而引入的一种进位计数制:在编写汇编语言源程序时,如果一个十六进制数的最高位为A?F中的一个数字符号时,该数前面必 ...

  9. 为什么计算机中的负数要用补码表示?

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 前言 大家好,我是小彭. 在前面的文章里,我们聊到了计算机的冯·诺依曼架构的 3 个基本原则.其中第 1 个 ...

最新文章

  1. 前端之css基础学习(更正版)
  2. 2月28日云栖精选夜读 | 阿里云率先达成国家绿色数据中心标准,平均PUE低于1.3...
  3. php常用函数time
  4. 中leetcode提示未登录_分享一款将 LeetCode 中 AC 的题目转化为 MarkDown 表格的插件...
  5. 2.10 stack
  6. 自学java编译老是出错_为什么按照书上的代码,编译老是出错?
  7. git 命令行忽略提交_git命令入门(本地仓库)
  8. Ecplice安装Spring插件could noe find jar(超详细解决)
  9. AIX安装中文语言包
  10. spss聚类分析_【SPSS数据分析】SPSS聚类分析的软件操作与结果解读 ——【杏花开生物医药统计】...
  11. Atitit.pdf 预览 转换html attilax总结
  12. Tableau Online免费注册试用
  13. 吉他音阶训练——问题解答
  14. Cocos2dx游戏教程(十二):“见缝插针”,游戏结算界面和音效
  15. A Generative Adversarial Network-based Deep Learning Method for Low-quality Defect ImageReconstructi
  16. 百度短网址 php,PHP实现百度、网易、新浪短网址服务的API接口调用
  17. 外购计算机软件加速摊销的政策,固定资产或购入软件等可以加速折旧或摊销的优惠操作...
  18. 安卓手机上有适合学生的日程app?
  19. UnityEffects(3)之闪电链
  20. java web 图片上传

热门文章

  1. 科班出身程序员和培训出来的程序员区别在哪?
  2. 自动添加芝麻代理白名单的方法
  3. 关于毕业求职的就业经验-写给我亲爱的校友们
  4. kubernetes原生ci/cd工具tekton版本升级至v0.18.1
  5. 轮盘赌算法-Roulette
  6. 关于python,如何更优雅地用%占位符
  7. docker registry 2 私有仓库镜像删除方法
  8. web安全的一句话木马
  9. 一些专业术语的中英文对照
  10. 详解sprintf()sprintf_s()