|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在日常生活中,我们常常需要到正数与负数,比如南北两级气温常年为零度以下,这个时候我们就需要负数来表示温度。5 I Z4 M. ~/ `7 @; p3 `, g6 n: L; C
那么在FPGA工程里面也是这样,我们如果想要做温度监测工程,自然而然的就会需要到负数来表达零下的温度。当然FPGA中除了数字正负的表达,还需要用到小数。在加减乘除的运算中,小数的出现是不可避免的。% X, n0 ?0 L6 H, R0 Z9 t
4 b8 _% j4 s( G/ j! L O7 s
作为FPGA工程师,我们无法保证所有设计都不出现负数或者小数的情况,不能避免我们就客服,今天就为大家分享一下FPGA中负数与小数的表达。
( V2 s: K: K. A" I7 ?# {1 V; I6 e @) n) V( \) C
一、负数的表达
' x5 h3 K8 v5 ?7 A2 W1 C% }- T- O! b: S; u I. e
关于负数,大家都知道在任何正数前加上负号便成了负数,比如“π”前面加上负号为“-π”,“0.178”前面加上负号为“-0.178”。FPGA传输信号使用的是二进制表达,同样二进制的负数表达也是在正数前面增加一个负号。即“1110”加负号为“-1110”,“1010100”前面加负号为“-1010100”。
) c0 j+ ^; o0 K5 p0 S) u0 k G8 _
明确了二进制负数的表达,我们再来考虑如何通过信号传输。
1 i% g" y3 L9 _! w, H9 x/ |
7 Q! T( t1 r* |+ ] 在计算机中,数字信号的大小常用有限位的二进制数表示。信号1为高电平,信号0为低电平,高低电平的变化即可得到对应的信号。想要传输多位信号,就增加对应的线即改变位宽。例如我们需要传输五位二进制数10100就需要5条线,第一条线为高电平传输“1”,第二条线为低电平传输“0”,第三条线为高电平传输“1”,第四条线为低电平传输“0”,第五条线为低电平传输“0”。记住信号传输的原理,我们来考虑负数的表示。: n5 g$ M7 B' [2 k. z, `3 n1 w
+ i9 m4 }0 Q; a5 a+ c( @! F) N& V$ A1 V6 [6 m" h, }4 M* d$ q6 e' C3 T0 s
) \$ n/ x' a8 \3 V 在表示负数之前,我们需要明确一个理念—约定,即你我双方一起遵守一个协议从而达成合作。就如手机制造商和耳机制造商合作一样,如果想要耳机与手机达成适配,就需要达成约定使用一个标准。比如一致的使用圆孔,或者约定使用type-c接口;同时也要约定使用国际标准还是国家标准。如果没有达成约定,两个厂家想当然的进行设计,手机使用了国际标准的type-c接口,耳机却是国家标准的圆孔,那想要达成最终合作也只会变成一场空,无论如何都是无法成功传输声音的。关于数据传输也是一样的,甲乙两个模块之间需要传输数据,一起约定了共传输六位数据,但是第一位数据不考虑,只取后五位。即传输信号为“101011”,其实表达的为“01011”。这个时候两个模块之间一方没有遵守约定,就会得出两种截然不同的结果。) T9 v- U# c- d& I
% _# u. `4 e* r7 |
! k# a, i7 [, S 理解了约定的概念,我们自然而然就解决了负数的问题。前面说过负数是在数的前面增加一个负数符号,那么我们就可以事先约定一条表示正负的线,并且此线为传输数据的第一条线,高电平1为负,低电平0为正。这时传输的数据就如下表所示:
* S* I( _- {/ i* \0 F$ Q1 i6 H1 g I3 w m# Y# Z8 G6 ^7 k5 k: ]6 X
3 o/ l$ H# U% v二进制信号表示
/ V+ O/ _& o; Q" ^+ e+ T' |4 C | 约定前的十进制表示& g) L" q, d% W& D9 ^) }, J. O
( Z U% c: d( R0 ^1 I/ E | 约定后的十进制表示3 n4 `- ~3 L9 k* _2 i+ g
| 001
9 Z+ P2 D% I. x1 a; N2 }' Q) d4 p | 1" h4 {! M. s6 ?- I2 l
6 R; m# u7 Y; R | +1. P( {+ p) v% s6 y& y
! Z9 }, J" T7 Y3 p | 101. u* S/ B1 y' i7 S
- |" @+ l2 V- y. ] | 5* A9 s" s* M! n8 w4 {* x
: J1 j% O8 Z4 G/ } | -17 C+ A6 O/ \9 X" @& u, q0 m* I+ v6 r9 R7 t8 Y
| 0101 g0 o, ?6 ~) x9 n6 J
| 2
; ?3 S, N$ J T- i2 p | +25 | B& e! K& V/ d( }6 N; [3 L9 W$ w/ Z
| 0115 `6 {- p" a: x0 n) z3 E. S$ ?4 X, D/ C6 l$ J3 [# _ j
| 3' e9 b& V4 S1 v6 f3 t6 P5 ~( M0 O6 @8 O% m% V! P% [& K- w
| +3
6 S" f# n8 s3 P( Z | 111/ `6 T, S$ ? s& _8 l8 B I- a3 {# x% m. ^" @% M% x
| 7# ]) h1 Z6 E2 g7 W0 r+ {
0 x) ^7 J' ~9 n$ E) e4 \ | -3
3 u+ M2 S; Q, x" {3 H# U5 J( W |
. Y+ F3 `8 i% g) D: r, U7 t7 P/ O9 Y4 n" t: f0 z' s& ~
可以看出,我们约定为将第一位表示正负是完全没有问题的,当然我们也发现,约定前和约定后的数值是完全不一样的。因此在设计代码的时候一定要注意,模块与模块之间的传输,一定要同时遵守同一约定。遵守约定后,不论我们是约定第几条线表示正负,都可以达到数据正确传输的效果。:
' i$ b7 w; _4 y! Y; r
) s% n6 U. z) I4 m e |
|