在数字逻辑系统,仅仅存在高低。所以用它只代表一个整数数字。并且有3代表性的种类。这是:原码表示(符号加绝对值值)、反码表示(加-minus标志)而补码(符号加补)。这三个在FPGA中都有着广泛的应用。以下分别讨论。

1、原码表示法

原码表示法是机器数的一种简单的表示法。採用符号位级联绝对值的方法表示数字。其最高位为符号位,用0表示正数,1表示负数;其余部分为绝对数值部分。原码一般用二进制形式表示。

比如,X1 = +1010110,X2 = -1001010,则其原码分别为:01010110和11001010

原码表示数的范围与二进制位数有关。当用8位二进制来表示小数原码时,其表示范围:最大值为0.1111111,其真值约为10进制中的0.99;最小值为1.1111111。其真值约为十进制的-0.99。

当用8位二进制来表示整数原码时。其表示范围:最大值为01111111。其真值为十进制的127;最小值为11111111。其真值为十进制的-127。

在原码表示法中。对0有两种表示形式,分别记为+0和-0,以8比特数据为例,其对应的表示为:+0=00000000、-0=10000000。

2、反码表示法

反码可由原码得到。

假设数字是正数,则其反码与原码一样。假设数字是负数,则其反码是对它的原码(符号位除外)各位取反而得到的。

比如:X1 = +1010110, X2=-1001010,则其对应的反码为01010110、10110101。

3、补码表示法

补码表示法师实际中应用最广泛的数字表示法。其表示规则例如以下:若是正数。补码、反码和原码的表示是一样的。若是负数,补码、反码和原码的表示都不一样。

由反码与原码之间的关键,负数的补码等于其反码在最低位加1。

4、各类表示方法小结

原码的长处就是乘除运算方便。不论正负数,乘除运算都一样,并以符号位决定结果的正负号;若做加法则须要推断两数符号是否同样。若作减法,还须要推断两数绝对值的大小,以使大数减小数。

补码的长处是。加法运算方便,不论数的正负都可直接相加。而符号位相同參加运算。

例:给出各类码字表示法的基本加法运算实例,并说明各自特点

(1)首先给出原码的运算演示样例。当中()d代表十进制数。

首先给出一个原码的减法计算实例,完毕“1 + (-1)= 0“”的操作。

(1)d + (-1)d = (0)d

假设读者直接利用原码来完毕上式运算,会发现用符号位的原码进行在加减运算的时候就会出现故障。将数据以8比特的表示形式为例,

(00000001)原 + (10000001)原 = (10000001)原 = (-2)d

计算结果是不对的,问题在于两点:首先。负数的符号位直接改变了计算结果符号;其次,绝对值部分计算也不对。

这说明原码无法直接完毕正数和负数的加法。

(2)既然,原码不能完毕正、负数相加。那么反码形式能够完毕此操作吗?仍然以”1 + (-1) = 0“ 为例,其对应的反码表达式例如以下:

(00000000)反 + (11111110)反 = (11111111)反 = (-0)d

则发现问题出如今+0和-0上。由于实际的计算中的零没有正负之分的。但上式标明了反码完毕正、负数相加后。其绝对值部分是正确的。因此能正确完毕正、负数相加的表达形式必然包括反码的特性。

(3)最后给出补码的相关特性说明,负数的补码就是对反码加1,而正数不变。

以8比特数据为例。通过(-128)d取代了(-10)d。所以其表示范围为【-128,127】。从直观上。补码消除了(+0)和(-0)。而且具备反码特点,那么到底其能完毕正、负加法运算吗?答案是肯定的,以下给出详细实例,所看到的

(00000001)补 + (11111111)补 = (00000000)补 = (0)d

基于以上讨论,能够得到一个基本结论:仅仅有补码才干正确完毕正负加法运算,并将减法运算转化为加法运算,从而简化运算规则。

但对于乘法操作。则以原码形式计算是最方便的。以下有实例。

演示1:原码进行乘法运算 -2 * 2 = -4

module mul(
input clk,
input rstn,
input [7:0] a,
input [7:0] b, output [14:0] q_mul,
output reg [8:0] q_add,
output reg[7:0] ra,
output reg[7:0] rb
); reg [13:0] rmul; always @(posedge clk or negedge rstn)
if(!rstn)
begin
q_add <= 0;
ra <= 0;
rb <= 0; rmul <= 0;
end
else begin //q_mul <= a*b;
if(a[7]==1)
ra = {a[7],~a[6:0] + 1};
else
ra = a;
if(b[7]==1)
rb = {b[7],~b[6:0] + 1};
else
rb = b;
rmul <= ra[6:0]*rb[6:0]; q_add <= {a[7],a} + {b[7],b};
end assign q_mul = {a[7]^b[7],rmul}; endmodule

演示2:通过reg signed实现

module signedMul(
input clk,
input rstn,
input [7:0] a,
input [7:0] b,
output [15:0] q
); reg signed[7:0] ra;
reg signed[7:0] rb; always @(posedge clk or negedge rstn) begin
if(~rstn) begin
ra <= 0;
rb <= 0;
end
else begin
ra <= a;
rb <= b;
end
end
assign q = ra * rb; endmodule

版权声明:本文博主原创文章,博客,未经同意不得转载。

FPGA图案--数字表示(代码+波形)的更多相关文章

  1. 基于FPGA的数字识别的实现

    欢迎大家关注我的微信公众号:FPGA开源工作室     基于FPGA的数字识别的实现二 作者:lee神 1 背景知识 1.1基于FPGA的数字识别的方法 通常,针对印刷体数字识别使用的算法有:基于模版 ...

  2. FPGA经典:Verilog传奇与基于FPGA的数字图像处理原理及应用

    一 简述 最近恶补基础知识,借了<<Verilog传奇>>,<基于FPGA的嵌入式图像处理系统设计>和<<基千FPGA的数字图像处理原理及应用>& ...

  3. 最短的数字判断代码 js

    转自  http://www.cnblogs.com/snandy/p/3590186.html 我们知道JavaScript提供了typeof运算符,因此最容易想到的是用typeof来判断是否是nu ...

  4. delphi 简单的删除字符串尾部数字的代码

    delphi  简单的删除字符串尾部数字的代码 方式一: function FilterShowName(const sName: String): String; var I: Integer; b ...

  5. 编程算法 - 圆圈中最后剩下的数字(递推公式) 代码(C++)

    圆圈中最后剩下的数字(递推公式) 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 0,1...,n-1这n个数字排成一个圆圈, 从数字0開始 ...

  6. 编程算法 - 圆圈中最后剩下的数字(循环链表) 代码(C++)

    圆圈中最后剩下的数字(循环链表) 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 0,1...,n-1这n个数字排成一个圆圈, 从数字0開始 ...

  7. FPGA与数字信号处理

    过去十几年,通信与多媒体技术的快速发展极大地扩展了数字信号处理(DSP)的应用范围.眼下正在发生的是,以更高的速度和更低的成本实现越来越复杂的算法,这是针对高级信息服更高带宽以及增强的多媒体处理能力等 ...

  8.  FPGA边沿检测Verilog代码

    FPGA边沿检测Verilog代码(上升沿,下降沿,双边沿) 实现思路:用两个一位寄存器直接异或可以实现 代码实现: ​ module edge_detect( input clk, input rs ...

  9. FPGA与数字图像处理技术

    数字图像处理方法的重要性源于两个主要应用领域: 改善图像信息以便解释. 为存储.传输和表示而对图像数据进行处理,以便于机器自动理解. 图像处理(image processing): 用计算机对图像进行 ...

随机推荐

  1. C++传递函数指针

    函数指针是一个很好的类型.因此,您可以编写一个函数,它的一个参数是一个函数指针.然后.在(外部)当函数使用的函数指针参数,来间接调用时调用相应的参数的函数的函数. 因为指针在不同的情况下能够指向不同的 ...

  2. Android开发ListView使用OnScrollListener实现分页加载数据

    上篇博文和大家分享了下拉刷新,这是一个用户体验很好的操作方式.新浪微薄就是使用这样的方式的典型. 还有个问题,当用户从网络上读取微薄的时候.假设一下子所有载入用户未读的微薄这将耗费比較长的时间,造成不 ...

  3. Cocos2d-x 脚本语言Lua中的面向对象

    Cocos2d-x 脚本语言Lua中的面向对象 面向对象不是针对某一门语言,而是一种思想.在面向过程的语言也能够使用面向对象的思想来进行编程. 在Lua中,并没有面向对象的概念存在,没有类的定义和子类 ...

  4. 建立Hibernate二级Cache

    建立Hibernate二级Cache它需要两个步骤:首先,一定要使用什么样的数据并发策略,然后配置缓存过期时间,并设置Cache提供器. 有4种内置的Hibernate数据并发冲突策略,代表数据库隔离 ...

  5. 《Linux Device Drivers》 第十七章 网络驱动程序——note

    基本介绍 第三类是标准的网络接口Linux设备,本章介绍的内核,其余的交互网络接口描述 网络接口,必须使用特定的内核数据结构本身注册,与外部分组交换数据线打电话时准备 经常使用的文件上的网络接口操作是 ...

  6. uva 11992 为矩阵更新查询段树

    http://uva.onlinejudge.org/index.php? option=com_onlinejudge&Itemid=8&page=show_problem& ...

  7. WF系列——工作流基本知识

    工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档.信息或任务的过程自动进行,从而实现某个预期的业务目标 ...

  8. HDU 3836 Equivalent SetsTarjan+缩点)

    Problem Description To prove two sets A and B are equivalent, we can first prove A is a subset of B, ...

  9. uva 10817 Headmaster&#39;s Headache 出发dp 位计算

    出发dp,用在一些议题的操作非常~  给出s个课程.m个教师.n个求职者,教师必须招聘.然后招聘一些求职者,使得每一门课都至少有两个老师能教.问题就转换成了招聘哪些求职者使得花费最少.由于s范围小于8 ...

  10. ViewRootImpl和WindowManagerService笔记

    1.每个窗体的ViewRootImpl都有一个mWindowAttributes窗体属性,该属性在WindowManagerGlobal.updateViewLayout()->ViewRoot ...