找回密码
 注册
关于网站域名变更的通知
查看: 386|回复: 1
打印 上一主题 下一主题

转——【小梅哥FPGA进阶教程】第十三章 四通道数字电压表

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-3-28 13:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 Zedd 于 2019-3-30 16:02 编辑 9 \# `0 n% W7 s9 e: ^
$ @0 C! t$ U" U. r
十三、四通道数字电压表
- ^" L9 z8 R* T! j  x! `
3 e: }3 I2 X9 ~; M/ ?3 d
% Z5 r5 k- Q( x

1 [0 |4 v) k- w  d8 O. S1 `
本文由山东大学研友袁卓贡献,特此感谢

% l" o' L/ }1 J8 q& Q6 w8 i0 j实验目的
4 g, ?* M5 i! Q0 V# i, {1 ^5 |6 P
设计一个四通道的数字电压表. Z  N+ \( i1 k# t  ^7 ]
* D* y  r: R, F
实验平台. B1 l" p% E$ V7 I* b$ L& L/ d0 V
芯航线FPGA核心板、AD/DA模块
% [) Z. @" H+ {! s$ v

2 q" f: I9 H, I! E* M
% e* V  ~; t! |9 C# L" E' w
1 j% A5 |6 a, c
实验现象: R1 z# ]9 W; y& S0 }
实现一个四通道的数字电压表,其中可以用按键切换测量通道并在4位数码管上显示对应的测量值。
% b; p# `" a* L. \实验原理及步骤+ a, C# [: Q- C) x5 ~
数字电压表的工作原理即为,被测信号接入ADC模块的输入引脚,FPGA控制ADC的转换进程以及原始数据的采集,并将其采集到的二进制数据转换为数码管的显示数据。其中按键可以选择ADC模块不同的通道。其系统工作原理图如图1所示。; d& f0 N2 l# Y  _
% Z! C, {4 R6 m# J4 z' x

  a. C5 Q" U( N) ]; @
图1 系统工作原理图
由工作原理图可以暂时将本系统划分为ADC控制模块、码制转换模块、按键数据模块以及数码管驱动模块组成。
0 @9 b  h3 j$ t
ADC控制模块之TLV1544

. T' n4 D7 K4 W5 O6 ?- Z
本系统采用的是TLV1544芯片,其为10位的ADC。因此其理论测量精度为
1 o+ ^' O9 d* J9 q( r4 c! M0 i

" _7 [7 S' `9 x5 `6 z
,且当其输出为’d
1 y: K: d% a' l' Z3 N* s9 r# g
时,实际电压为

: ^5 [  B" B% {% Y3 L: q
" f4 Q" B/ [5 o9 y( C: d" ]% C2 B$ O

7 M( p3 |5 _9 f% D  q# ~
V。本模块的设计在基础课程已经讲解,此处不再详述。其模块接口示意图如下所示。
# L% C- F' M0 N( z

' C- f* b& a% k+ H; ]* i; r0 P$ j
# ^- o2 k$ W% F' }$ t
图2 ADC模块接口示意图
数据预处理模块

; N2 X( H0 w# }! m) s* b8 ?2 W" [
ADC模块输出还是一个十位二进制数,因此需要先将数据转换成实际电压值。

; f; f' v' H2 s& E

  J3 k2 k4 ~  A- t9 A6 D3 \上式中3.42为满量程电压,data为输出的二进制数,1024为ADC总的阶梯数。之所以是3.42,是本模块基准电源TL341输出电压。
7 h+ M/ @. q2 B1 B# \! @9 E这样得出的数据太小,因此先将其放大 倍。这里也可以放大其他倍数。
5 U7 ^0 [2 ?) E5 M( X; s1 r# a
2 Y6 S; B$ Y$ y7 l+ ?' N; ]7 x+ e/ h
经过上式的转换, 还是一个小数,这里再放大1000倍以消除小数。即实际显示的数据为实际电压的1000倍。这样就完成了二进制数到实际电压的转换。, @( a4 S; i9 Y5 y1 T
8 Q: R* ?. G/ S

, a, z* {1 Y, |" N0 o; z/ |由于在上面TLV1544驱动设计中,数据更新速度为4000ns/次。这样已足够用做电压表显示,但是此处为了使数据稳定,加入均值滤波程序。本模块接口示意图如图3所示,其接口功能列表如表1所示。
) p" u+ z2 z( U% Q
0 h2 W* M" ^6 S0 ^# C+ f
图3 数据预处理模块接口示意图
9 X4 p+ ~9 R; _+ H" j2 C
表1 数据预处理模块接口功能描述
先将原始数据进行累加1024次。

" ^- B* S: o' g0 |! T. X; Q1 j

8 g9 P! ~# W5 x  I/ A! _1 G- a将累加后的数据除以1024,也就是右移10位,这里数据总位数为20直接取其高10位即可。
9 e% W2 K& m- k

* L4 i! i7 ]5 I7 X利用上面推导的公式即可输出最后的数据。$ Z- a; t" V# D
' ~8 V+ F/ t& q# h9 y
码制转换模块5 S6 X  B3 g) h/ ?8 ~4 K
由于ADC输出的为10位二进制数而数码管需要的是BCD码的格式,因此需要将其进行码制的转换。* I; b7 O, \6 S- Y  R
首先,先了解二进制与BCD码的位数对应关系。比如一个8位二进制码,可以表示的最大十进制数为255,转换成BCD码为 0010_0101_0101,共需12位,其中每4位组成一个BCD单元。n位二进制码转换成D个BCD码的n~D对应关系表见表2。: K2 }6 ~% `+ ?! B% Y5 f) ]5 U

' D8 z( }4 H% Z* g6 C, J$ L; }
4 e/ A( B$ _" S4 F" E# p
表2  n~D对应关系
此处采用加3移位法进行转换,附件中列举了另一种方式来进行转换。以8位二进制转换为3位BCD码为例,转换步骤是:将待转换的二进制码从最高位开始左移BCD的寄存器(从高位到低位排列),每移一次,检查每一位BCD码是否大于4,是则加上3,否则不变。左移8次后,即完成了转换。需要注意的是第八次移位后不需要检查是否大于5。
$ `' O& X; ]8 b
注意:为什么检查每一个BCD码是否大于4,因为如果大于 4(比如 5、6),下一步左移就要溢出了,所以加 3,等于左移后的加 6,起到十进制调节的作用。
7 P# L' I- E- L  t! }. H7 Y
表3给出了一个二进制码11101011转换成8421BCD码的时序。
* p. ?! D& q: O5 X

1 w+ ^, @4 O+ x4 [& x+ d
表3  B/BCD时序
首先进行判断一个BCD码是否大于4,是则进行加3处理,否则输出原来数值。

6 \1 h7 i& Q, Q. h4 N$ ?
# b3 W% p- h2 O: n! N7 w. b
由以上原理可看出,这里需要定义一个10+12位的寄存器。同时从表3克拿出有几位二进制数就需移位几次。这里为了增加适用范围,将输入定位20位的二进制数,因此输出为7*4位BCD数。这样定义一个48位的移位寄存器。低20位为二进制数,高28位为BCD码。
6 w! W$ E% P6 X0 v每移位一次就需验证高28位BCD码是否大于4因此,编写以下代码。/ Q, `; O2 b  ~) F, d( E

% |! {5 {# |  s8 F/ f9 m现在编写顶层文件,其端口示意图及功能描述如下所示/. {$ Q! S& G4 d" W
6 P/ S4 Q% w6 F4 L1 l
图4 码制转换模块接口示意图
1 {4 p/ T; y" j( b# @
表4 码制转换模块接口功能描述
+ X. H; _, h% X& ^# @6 K  P
向左移位20次。0 {- a6 G- ]; K2 E
* H: y) R" Q9 p" A1 E

3 l2 ]* g3 w+ [" g

* I' l: f. e6 f4 v. y. \3 l) G9 q
6 E# ?' \# j* R/ b- i4 Y  n

- p4 M+ g* P7 d8 f
+ G& h7 {. x; q* u! C5 Z校验以及输出最终输出数据。# c- ?4 L5 \! Y+ W6 M2 u2 L
! _. K7 m+ @! G! |! p' \+ R
按键输入模块% ^6 U7 [) I* \: [
本部分在基础课程中也有介绍,此处只给出其端口示意图。
5 V: N- _/ a% p* P  Q7 c
图5 按键输入模块接口示意图
通道选择模块
" ~) u% s! J, k通过按键进行ADC四通道的选择,本模块接口示意图以及功能描述如下所示。
2 d3 ^) C- K+ N/ ~

5 S1 a0 r" k, J1 G  l& Z, n, J- m
: z0 N' l3 T+ e
图6 通道选择模块接口示意图

) S/ q, U. \, C
1 L: Y! h! f# m% b# z3 r8 |
表5 通道选择模块接口功能描述
内部除了例化还需产生通道选择信号,这里用的模块有四个通道但是为何按键一来就加’d2,是因为通道选择实际信号需为0000、0010、0100、1000,这样我们就需要加’d2。

% I: T- ^; k; ]0 E, z$ j" c
: E( h1 ^% Y6 D" z5 K: D0 n
数码管驱动模块7 |  g, n3 w2 f! A
本部分在基础课程中也有介绍,此处只给出其端口示意图。7 }' d: s8 u: L. W& v
/ ?' r2 p3 C/ l3 ~5 }

' f1 O+ W& r' ?& w$ {$ o& p, L3 K
图7 数码管模块接口示意图
顶层设计
) y- i, @/ ?3 L
此处只需例化各个模块即可,顶层模块接口示意图如下所示。

5 o0 z% F5 W! R6 A9 W! H' Z
: W3 ~6 E  {( Z- e

8 Y3 _1 c3 }) D
图8 顶层模块接口示意图
综合后的RTL视图如图9所示。

* D$ r4 P' u- ?

: j# ?/ K, Q9 ?# }
8 l( z  @1 L2 [$ v" ~3 o# n3 r
图9 RTL Viewer视图
分配好引脚下载后可以看到改变输入电压,数码管上均有正常的显示,且切换通道时数据可以随之更新。

5 ^" G! p5 X8 S8 F; ?: @

$ a' L. a6 W8 E# t* q( \至此一个四通道数字电压表设计完毕。
  W, u- y, u) c附:基于查找表的数据电压换算
  {: n% s$ @8 F6 H: Z前面指出了一种数据处理及码制的方式,这里再列举利用查找表的实现方式。
# [. z! i/ g) U, q( ]6 W' Q这里因为是输入的10位二进制数,也就是说每一位变化对应的变化量为即为精度,这样就可以得出以下待转换数据与实际电压的对照表。这样当3.296v
4 w4 J) o9 Q. e7 [5 ]" w4 Y) W$ y0 G+ S- I4 w) Z0 M
" f2 P6 j3 R/ _1 O
  a$ `1 f8 e' f, o0 m1 H2 ^0 R

* K' l( Y) v2 T$ `这样就可以建立一个查找表,来分别计算其对应位的电压值的BCD码,然后相加。
4 }8 [: w9 o0 D; u5 m
9 ?; D# J+ [  L2 I" c( H' |

* X+ Y( y/ S5 I) l- _- Q
, ]" U$ h9 |  _4 v  z; l  T$ K4 }; q2 m0 Q% w
如果0~3位相加大于9,则加6调整为BCD码,并产生进位信号。再进行4~7位相加加上进位信号判断,再判断8-9位。
. A/ D- S- C4 e( ]

. B5 L) }# O4 D' U9 Z2 `. l0 F  X7 e3 i: e; e- {

2 o: z/ \: z1 c5 u# n" D- k" |; c/ e, j

! A7 c% H. ~$ L# c" s这样再将以上两个部分放置到一个always块中即可。同样可以看到实际效果。将输入数据显示格式修改为十进制后,输入512时输出0001_0110_0101_0000。此时实际电压为512*3.296/1024=1.648,显示为1.650。输入256时实际电压0.824,显示为0.825。& w" L  p6 C3 b4 {, i! M2 Z
1 t) p* ~2 [8 @9 o. T+ j6 U; Y

; R/ @- J+ A7 n5 h: h2 _7 K

% }# P) ?) G1 \& _7 r
9 }7 w/ w* N( m$ g
如有更多问题,欢迎加入芯航线 FPGA 技术支持群交流学习:472607506
小梅哥
芯航线电子工作室/ W* D3 G& Q7 t1 L
游客,如果您要查看本帖隐藏内容请回复
( b- ?5 |. {# f. l5 }& i) b8 T" o

% z: p0 j8 w8 {7 d0 X7 t% P; @

0 t5 t: X* Q& Z' B) ?0 I0 v" t

# R' r0 u. i$ a
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-8 18:26 , Processed in 0.156250 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表