EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 FPGA技术江湖 于 2023-2-15 17:02 编辑
N/ V/ i) A3 ?3 a! |4 @$ t% J1 S3 P
g. |* i4 d) n; R
% I |& y1 Y2 D% ` Z
大侠好,欢迎来到FPGA技术江湖。本次带来FPGA系统性学习系列,本系列将带来FPGA的系统性学习,从最基本的数字电路基础开始,最详细操作步骤,最直白的言语描述,手把手的“傻瓜式”讲解,让电子、信息、通信类专业学生、初入职场小白及打算进阶提升的职业开发者都可以有系统性学习的机会。
7 J6 D" x1 ]; j) L: L' s+ [
系统性的掌握技术开发以及相关要求,对个人就业以及职业发展都有着潜在的帮助,希望对大家有所帮助。后续会陆续更新 Xilinx 的 Vivado、ISE 及相关操作软件的开发的相关内容,学习FPGA设计方法及设计思想的同时,实操结合各类操作软件,会让你在技术学习道路上无比的顺畅,告别技术学习小BUG卡破脑壳,告别目前忽悠性的培训诱导,真正的去学习去实战应用,这种快乐试试你就会懂的。话不多说,上货。 ( f: P* X- S* S7 B" X# l
4 y8 |: k( m, |* }# C( [- L F0 ]& X
数字电路中的数字表示
' J3 k# j/ k$ Q% g0 `/ o# s! q
+ X+ p3 f0 `; ~3 i' l" ]
在我们的生活中,常用的是十进制数字,有0、1、2、3、4、5、6、7、8、9十个数字。我们用这不同的十个数字可以表示不同的十种情况,但是很多情况下,会现在超过10种情况,那我们应该怎么表示呢?例:有很多(远远多于10个)的房间需要贴门牌号,我们可以从0开始贴,逐渐增加,在我们贴到第10个(9号)后,后面一个我们应该怎么办?
, R \2 h. N# D8 u+ ?) l" m) T) H, `$ N
数字信号通常都是用数码来表示的,不同的数码可以表示数量的不同大小。用数码表示数量的时候,仅仅用一个数码往往不够,因此需要用进位计数制的方法组成多位数码使用。我们把多位数码中每一位的构成方法以及从低位到高位的进位规则称为数制。
) W7 M- }7 E. @- J3 b
当用数码表示大小时,它们之间可以进行数量间的加、减、乘、除等算数运算。 2 I b. y0 E5 q2 K8 t9 ]
下面讨论十进制。 + F% D. @* e" ]) ]+ W4 D* j1 w
十进制是生活中最常使用的进位计数制(可能是人都有十个手指头,十个脚趾头,所以古人创立了十进制),十进制的有0~9十个数码,计数的基数是10。超过9的数必须要用多位数来表示。 2 C& V9 ~0 J# L; R
例: " @; j; I, M& ~; x
任何的十进制数字都可以写成本位的数字乘以本位的权重的累加和。十进制的数字一般用“D”来标注。 N2 E2 g- ` C* H2 ~
在日常生活中,我们都是十进制来表示大小,多少等等。十进制有自己的运算规则。例:有五个抽屉,每个抽屉有五块糖,一共有多少块糖?现在我们讨论的是数字电路基础,那么在电路中还适合使用十进制数吗?
/ m( ~2 S$ ]) ~- @) R% j4 s ]! k
在第一章中,我们已经给出答案,用的是“0” 和“1”两个数码。那么我们按照十进制的规律类推一下二进制。
7 E6 r5 l2 B$ R7 T
二进制有0和1两个数码,计数的基数是2。超过1的数必须要用多位数来表示。二进制一般用“B”来标注。 ! B B- d5 K# S. u9 y8 ?: J5 Q( [
例: % H1 R. G( V+ i
通过对二进制的本位数字乘以本位的权重的累加和,我们可以算出二进制的101.01,就是我们十进制的5.25。
l* M7 P- W6 |! Z* w, x
通过上述的方法,我们确定了二进制换算到十进制的方法。那么十进制的数字换算到二进制的方法如下:
; H$ r2 a( U7 |: n$ B* F
: b. ]0 K X$ k- P1 ^例:将十进制的173化为二进制数字的方法如下: 8 x/ w. R4 U" M# p) S. b
4 h# i9 A0 Z9 X7 u
X9 Q" n( ^- Y: D, }$ Y
' U7 D' f3 R* |9 c. d5 K
( \* B7 R1 t7 _ v3 Y( \# n
: O# R) z4 u8 Z4 D! z# k图1 :十进制173换算二进制的过程 : ~4 Q8 y9 T/ k a) q( y+ Y
; s# Y# a2 G) Q( r1 Q
# U9 O+ P7 I( c将上述的余数倒着写下来10101101就是我们想要的结果。 5 b* o, g. ^+ f2 b8 G8 N* K# `
通过讲解十进制和二进制,我们应该了解,描述同样一个物体的大小,我们可以用两种不同的方法,但是本质上还是相等的。只是描述的方法不一样而已。
" M' f* i# U' {7 p0 U
同理,我们可以定义出八进制、十六进制。 2 i/ U4 A$ r7 I" R
八进制使用数码0~7来表示,一般用字母“O”来标注;十六进制使用数码0~9和A~F来表示,一般用字母“H”来标注。它们与十进制的换算关系与二进制相同。
1 P; i& F8 N( U5 C% x* ^/ S' [
下面我们研究八进制与二进制之间的换算关系。
) Z$ `6 R: b. V2 @" G5 m
对于八进制来说,它的权重是8的n次幂,也可以表示成权重是2的3n次幂。八进制的数码为0~7,0~7的数码用二进制表示可以写成:K=。如果此时的权重是8的n次幂(2的3n次幂),那么此位的数码乘以权重(K*8的n次幂),用二进制表示就是:。按照二进制的规则,正好是连续三个数码。所以八进制转换二进制的方法如下: & _, O" t* K" d0 ]. G) C M8 P
将一个八进制转换为三个二进制排列即可(必须熟悉0到7对应的二进制码)。 ( k6 I( Q R- V$ v
例:八进制的253,转换二进制为010 101 011。
0 |0 n5 X: Q- q. B+ L- C+ o
二进制转八进制的方法如下:
6 j" P7 f4 _( w/ l( f9 x
从权重为1开始,向左(整数向左,小数向右)三个一组,最左或者最右不够三位时,用零补充,转成八进制即可。
" k4 \& n$ i# y( K
例 :二进制1010110.01,分组001 010 110 . 010 –> 126.2
. T& e* f6 [" e8 ~- E K
十六进制与二进制之间的转换是四个一组(必须熟悉0到9和A到F所对应的二进制码),和八进制是类似的,不在多余描述。 2 t5 x$ Z8 p5 ^ i7 F" I, o
: ^& O ], U! W+ v
7 C) d4 {1 ^0 k8 M
' @; [! A! i6 [& j
0 R7 \* |3 f* A7 K
/ H$ g* i1 I9 T) z( g+ x% J
% s1 ^: X# A4 I7 h2 r' L' x5 m
图2 :二进制、八进制、十进制、十六进制前16个数码的对应表
& e2 Z6 f2 Y: Q" x% }- B9 M& }
: \$ U2 i5 f6 L1 F1 I8 ^5 \/ S7 v' ^ T! M$ M' o2 Y$ I& h
4 [, A9 L# d2 r1 ?, ^ J2 E \& @
思考:为什么在上述图表中,二进制直接用四个数码来表示,八进制直接用两个数码来表示?
9 G- L) Q$ w3 |, [
四个二进制的数码或者两个八进制的数码才可以表示到十进制的15。
0 T+ {5 l& l! I2 Q+ ?
在电路中,这些数码都是要存放的,每一个数码都需要一个小存储空间。当存储空间的个数是固定的时候,所表示的数字的大小也就有了范围。例:只考虑整数的情况下,三个数码的十进制表示000~999。 ) b( | h- }9 K) z; O0 G
后续设计时,如果我们出现设计失误,将四个数码存放到三个存储空间里时,就会出现错误(综合器不一定报错),最终结果为将后面的三个数码存放到三个存储空间里了,最高位的那个数码丢掉了,一定要注意。不要在设计中看到某一个变量赋值为N,就一直以为这个变量为N,不一定,一定观察变量的存储空间的个数和N所需要的个数的对比。 ; i1 D6 Y' S/ s7 F2 {3 w1 V
思考:在电路中,数字N需要几个存储空间? & |2 f7 `; w6 R7 g' U; G t
根据上一个问题的思考,一个存储空间只能存放一个数码,那就需要看数字N有多少个数码了。这样的想法是正确的吗?注意:在电路中,都是二进制表示。那么也就是数字N需要的存储空间的个数,应该是N转换成为二进制时,他的数码的个数。
% Z$ |4 @5 j- x$ h: K6 [+ D
例:十进制的25,首先转换成为二进制11001,所以需要5个存储空间。
9 b3 S- d# A* d: _, G! _% G' z
思考:在设计电路时,需要把所有的数字都写成二进制吗?
6 h# m5 a0 M. D9 k7 q/ [/ g
目前设计大多数是写代码,代码想要形成电路,需要综合器的综合。而综合器是可以把任何进制的数字转换成为二进制的。注意:存储空间的问题。
/ L; a! g. J4 A$ d8 a, y
思考:在赋值时,两个变量赋值的进制不相同,可以直接对比大小吗?
: Z" ~0 N' y" s, b
例 :在电路中变量A赋值十进制的25,变量B赋值十六进制的24,假设变量A和B的存储空间的个数可以放下本身赋值的数字,可以直接对比吗?答案是肯定的,我们经常说的进制不同不能相对比,那是对于人类自己看见的而言,但是对于设计来说,我们的赋值是在代码级别,距离真正的电路还有一个综合器的综合,综合器综合过后,所有的进制都是二进制,那就可以直接对比了。
: r* U5 C- M6 _1 y
BCD码(nary-Coded Decimal)又称二-十进制代码,亦称二进码十进数。是一种二进制的数字编码形式,用二进制编码的十进制代码。这种编码形式利用了四个位元来储存一个十进制的数码。利用四位二进制表示十进制数的个位或者十位等。 ! f. a/ g, \- D$ M& I* L# O
二进制码的10110,表示十进制的22,利用BCD码表示则为0010 0010。 # A, Y' E; r* W( Y: ~
在计算中会经常遇到负数,那么在数字电路中,怎么样来表示负数呢? 5 p% \0 W% a+ U" ^7 ~
首先要认识到,无论是正数还是负数,都是人类赋予它的意义。同样的数字,在对他用不同的眼光来看待时,也会得到不同的结果。例:101,在十进制中它就是一百零一,如果用二进制来看,这就是十进制中的五。 + X* @: \& j& P
当一个变量为无符号位时,就认为这个变量是正数,所有位按照自己的权重进行计算。如果一个变量为有符号位时,那么规定他的最高位为符号位(0:正数。1:负数),其他位用来表示数值。 ) |( x2 P9 d' n0 R( P3 T
下面讨论有符号数的表示。0011表示正三,1011表示负三,这样的表示方法对吗?首先表示方法没有对错之说,只是符合不符合场合。这个表示方法是不符合当代计算机中的表示方法的。在当代计算机中,不仅仅要描述数的表示,还要表示运算。很明显这两个数字相加不为0。
, [( k( L* K- L }
那应该如何表示负数呢?如果在只有四位的二进制,四位二进制可以表示16种状态,无符号数可以表示0到15,15+1=0,0-1=15,这两个算式是正确的。 ! _+ C7 }* m. u
$ o1 D" q7 h# e( @& X& d
0 f, [1 ?' ^/ C: T3 E4 \) d, u; ^
5 h% E+ d0 Z" z7 @) V8 M9 Y$ G( w0 `/ O+ j. q3 M
图3 :四位二进制补码运算的例子
, A; W' a$ A4 M% B" E- G) N& f* \7 R* Z" I6 `4 z
: F3 l, j& o/ X6 E" m: y g+ \: N
8 J7 v5 u' W9 Y% q4 P! q补码就是顺时针方向的长度。 ; i% J1 f( y# I
符号和绝对值拼接到一起组成的码成为原码。 1 W: m$ a( h! T$ _7 V6 q
表示正数时,补码和原码是相同的;表示负数时,补码和原码不相同,两个绝对值相加应该为“一圈”。
; Z) ]2 f/ M, d8 V/ D
二进制的位数和能够表示的有符号数的范围也是有关系的。例:四位二进制能够表示16种状态,它能够表示的范围[-8:7]。并不是负数比正数多一个,中间有一个0。 原码能够直观的看出大小,补码比较方便有符号位计算。在当代数字电路中,都是利用补码进行存储和运算的。 ) i0 E9 \8 a7 q" U5 R
表示范围为-200到200,至少需要多少位二进制码才能表示?
' n* o, {" F* H7 q
-200到200一共有401种情况,需要9位来表示。9位的二进制表示有符号数时,能够表示-256到+255。
* P0 m( q, `( d" U. W2 \& v
扩展符号位不改变数字大小。
% E1 O3 L+ Z1 Y0 _/ W. E$ y% l
正数不在叙述。对于负数来说,就是在前面加了一个“1”,是否会改变数字大小呢?补码计算原码的规则为:补码减1,符号位不变,其他位取反。而我们添加的“1”,正好在“其他位取反”中,无论扩展多少位,都不会改变数字大小的。
: R% Q$ [, I( K; g7 L
在电路中大多数都是二进制的信息,那我们如何能够看得到汉字或者字母呢?对于字母来说,我们来介绍一下ASCII码。 . g5 Z$ x9 T6 V' B( I8 f9 V& R: o
ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。
# I" y* w- y) J, q: J( O8 J. Y. ]8 m2 U* M$ w; A5 J
4 O! D |: r9 d$ C' y9 A1 m6 |
$ b+ K: F2 j1 E
4 g" G+ |, a/ T Z0 `9 t5 U0 u1 E' g: {8 {
图4 :部分ASCII码对照表
" K% X! V. S1 M5 H6 f
' R9 N) o5 o# f0 x% S' ]+ j5 K6 w- S7 T2 }
汉字国标码,创建于1980年,目的为了使每个汉字有一个全国统一的代码而颁布了汉字编码的国家标准。每个汉字有个二进制编码,叫汉字国标码。在我国汉字代码标准GB2312-80中有6763个常用汉字规定了二进制编码。具体国标码的信息就不在叙述,有兴趣的读者可以自行查询。 + h8 Y3 P' I6 K, h9 f5 l
“ABC”字母序列在计算机中存储的形式按照ASCII码存储,十六进制的“41、42、43”。“郝旭帅”汉字序列在计算机中存储的形式按照汉字国标码存储,十六进制的“BA、C2、D0、F1、CB、A7”。 # x, E% M6 P# Q9 x; @3 l
上述叙述的几种计数或者表示规则,都是非常常用的几种。在某些特殊的场合我们也可以自己编写规则,类似于24进制数,用5个二进制表示一个24进制数中的数字,都是可以的。 0 v% r2 u3 b' d) w2 Y& F# p
在数字电路中,只要是发送方和接收方能够统一好编码规则,就是可以的。 ( j F. ` C/ @: u5 W( f. M/ g1 E
如果在数字电路中表示小数?方法有定点数和浮点数(浮点数不做介绍)。
3 e6 Q1 h( h& p6 x4 a+ V定点数。 P1 j |$ V( D. n* _
定点格式,即约定电路中所有数据的小数点位置是固定不变的。 : z9 X7 g* f+ ^& _7 R1 Y
对于整数而言,小数点默认位置在最后一位的后面。例:二进制的101表示十进制的5,小数点的位置就在101的后面。 2 ?7 N# {+ n. M
如果是有小数呢?那如何来表示呢?例:十进制的5.5。 6 w& I& v6 C" I5 J/ I& w/ j
有小数时,就不能够把点放在最后一位的后面了,因为要存放小数,所以点必须在中间。当用8位来表示时,规定四位表示整数,四位表示小数:0101.1000,小数点并不是真实存在的,只是我们规定的而已。 6 k% q5 P5 y; R% U* a+ I. }
也可以有另外一种理解,整数用的基础值是2的0次幂,所以所有的整数直接编写即可。如果有小数的话,基础值就要有所变化,假如是2的-3次幂。那么表示十进制的5时,就会变为101000。 # H3 X6 t! x: R" `: X, r
定点、定点就是定好了小数点的位置,也就是定好基础值。 . v I+ Z! X) `
浮点数即小数点的位置可以浮动,利用专门的几个数码确定小数点的位置。这里不做过多介绍,有兴趣的读者,可以自行查阅相关资料。
6 q8 A, S. H" N1 }0 F+ K# a* D
4 `8 U, X) d9 ?8 B
: z: k( ~7 A( @, Q% @. j8 }
. R# v8 K3 v3 N9 z( R) D$ Z' q" L0 q" j4 K M
) J& u; z3 i R+ e/ o
|