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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 Zedd 于 2019-3-30 16:02 编辑 " y3 L0 ?1 B& \0 s6 i  S6 _

, E$ I% Q* P% c; X# l: o
十三、四通道数字电压表

: X8 U) |4 r$ y6 w5 y0 |

' M, k1 H! M* w: t& {4 }, }
" t& x2 K& F1 a3 u- o0 ?& _

. v) V6 v& X. a0 T+ t6 D+ Y
本文由山东大学研友袁卓贡献,特此感谢
: ~. S1 O, g; Y( P
实验目的

6 ~# l/ Z: C& a) w' l) j* s  t设计一个四通道的数字电压表
& ?6 k& }4 r: s  V/ ]* a. M( i' {' b2 J, n3 F0 J
实验平台
, ^& {- R( Q+ s2 t* k$ T0 x& N) {芯航线FPGA核心板、AD/DA模块" F$ o  N' p3 v; f
. D' s  w, i- m$ t
8 H3 V; `5 R3 D" H7 k/ i# j7 ?

# C3 N% G0 C* P4 U实验现象( U9 T' D) P* a; @
实现一个四通道的数字电压表,其中可以用按键切换测量通道并在4位数码管上显示对应的测量值。! d* K& P% f' U
实验原理及步骤
7 ]% H: O/ o/ q  ]$ R& ]数字电压表的工作原理即为,被测信号接入ADC模块的输入引脚,FPGA控制ADC的转换进程以及原始数据的采集,并将其采集到的二进制数据转换为数码管的显示数据。其中按键可以选择ADC模块不同的通道。其系统工作原理图如图1所示。$ j. y& @" d; g; Q4 U$ y

: u7 f6 |1 ]; s% I' f( E

% }7 z5 |  w% G' C9 W2 P; Y
图1 系统工作原理图
由工作原理图可以暂时将本系统划分为ADC控制模块、码制转换模块、按键数据模块以及数码管驱动模块组成。

6 G# Z' h( x" B3 o# ^
ADC控制模块之TLV1544
7 l6 M# Q/ f: C0 O
本系统采用的是TLV1544芯片,其为10位的ADC。因此其理论测量精度为
4 j7 y$ t2 g8 M, Y
# x5 {8 ~" K7 w% @# |
,且当其输出为’d

" @* {( M: ^3 a, T
时,实际电压为
4 d) k2 |" O4 N5 \& s& j
. M' {: P( `( N3 t
# S6 P( D7 G  w" f: a
V。本模块的设计在基础课程已经讲解,此处不再详述。其模块接口示意图如下所示。
% J% D  W7 E1 K0 R1 V
% s, J. ^' f! S: n

" r+ B& r* Z0 B
图2 ADC模块接口示意图
数据预处理模块
! P' k, t3 l( G2 Q3 y# n2 O
ADC模块输出还是一个十位二进制数,因此需要先将数据转换成实际电压值。
5 Q' x  M" ?! [7 H
" \; M( e+ Q  T
上式中3.42为满量程电压,data为输出的二进制数,1024为ADC总的阶梯数。之所以是3.42,是本模块基准电源TL341输出电压。% a+ a- z1 X; o7 ^. g  B1 Z- I& x
这样得出的数据太小,因此先将其放大 倍。这里也可以放大其他倍数。
7 L' n8 b' C  x2 J9 b, L
3 `, ^* B& Q8 O8 x
经过上式的转换, 还是一个小数,这里再放大1000倍以消除小数。即实际显示的数据为实际电压的1000倍。这样就完成了二进制数到实际电压的转换。
# O3 S# O+ K  I1 X- ~
' s4 P0 ~& }! l
& C; |# ?7 q7 }: Z; D7 _$ x" ^4 N
由于在上面TLV1544驱动设计中,数据更新速度为4000ns/次。这样已足够用做电压表显示,但是此处为了使数据稳定,加入均值滤波程序。本模块接口示意图如图3所示,其接口功能列表如表1所示。3 l$ \, K; f6 C6 x4 o0 k( Q

) {  e! s/ |" h& ^! R
图3 数据预处理模块接口示意图

' @/ q+ o' z& p$ P: n) j
表1 数据预处理模块接口功能描述
先将原始数据进行累加1024次。

6 x+ c0 T7 J$ D3 A* U$ h

  k, \0 A) _/ a, E) L4 d( v将累加后的数据除以1024,也就是右移10位,这里数据总位数为20直接取其高10位即可。
6 l- V' e, x8 \- Z

- }$ C# l+ V9 V利用上面推导的公式即可输出最后的数据。3 W- T3 F2 [! x( w* j& H2 i( Z
  z6 C! [' x/ X4 x" P9 Q9 g: k
码制转换模块4 k8 ?, v+ i* |+ o6 P: i
由于ADC输出的为10位二进制数而数码管需要的是BCD码的格式,因此需要将其进行码制的转换。
' ?9 C9 c, |* G6 \+ f/ F6 U首先,先了解二进制与BCD码的位数对应关系。比如一个8位二进制码,可以表示的最大十进制数为255,转换成BCD码为 0010_0101_0101,共需12位,其中每4位组成一个BCD单元。n位二进制码转换成D个BCD码的n~D对应关系表见表2。. g7 D# ]3 y; G: D8 }
3 a% t8 f; M; w& i$ ]6 Z8 }
1 S, ?6 z$ R2 K2 Z, B
表2  n~D对应关系
此处采用加3移位法进行转换,附件中列举了另一种方式来进行转换。以8位二进制转换为3位BCD码为例,转换步骤是:将待转换的二进制码从最高位开始左移BCD的寄存器(从高位到低位排列),每移一次,检查每一位BCD码是否大于4,是则加上3,否则不变。左移8次后,即完成了转换。需要注意的是第八次移位后不需要检查是否大于5。
( u! T+ a, ?: G. P" M8 u
注意:为什么检查每一个BCD码是否大于4,因为如果大于 4(比如 5、6),下一步左移就要溢出了,所以加 3,等于左移后的加 6,起到十进制调节的作用。

. J1 W7 N! }' t1 R, @
表3给出了一个二进制码11101011转换成8421BCD码的时序。

1 G  B$ l. J5 j: C
  v5 j: R7 d( Q. P9 K2 @+ j1 t. `
表3  B/BCD时序
首先进行判断一个BCD码是否大于4,是则进行加3处理,否则输出原来数值。
6 ?3 r& d  w  [) M; o* f+ @+ M
$ Q" q0 P/ x/ |6 }$ D3 W& b
由以上原理可看出,这里需要定义一个10+12位的寄存器。同时从表3克拿出有几位二进制数就需移位几次。这里为了增加适用范围,将输入定位20位的二进制数,因此输出为7*4位BCD数。这样定义一个48位的移位寄存器。低20位为二进制数,高28位为BCD码。
- g! f7 a% W- u5 Y8 `每移位一次就需验证高28位BCD码是否大于4因此,编写以下代码。/ u+ F3 W8 ?: N" P+ r

/ `. p* x, ^& }8 U# E2 H7 b现在编写顶层文件,其端口示意图及功能描述如下所示/
* l( b/ m$ U+ i
% L: v& W# i6 ?5 M6 ~5 J
图4 码制转换模块接口示意图
$ I8 Y) K) J- v
表4 码制转换模块接口功能描述
( p2 |5 r& K3 _7 H
向左移位20次。+ j4 b3 A9 k# I  b& S

5 d+ g5 Q) t+ r+ x2 n) y5 F: V; }' h( ]( z! u8 W4 h# T

& m8 [3 ^/ R- g; b& P6 t# O; @: m" g3 [) S$ @
$ h8 j# h8 f! c$ h' n* b

0 s: o) k2 v7 a9 s+ u9 X; v$ f1 ^6 O4 T8 s* f# W
校验以及输出最终输出数据。" h8 l, y5 h- a9 O1 I

% N! ~0 H6 f  ~" r  g, m按键输入模块
' e1 _& ?7 i3 }& w本部分在基础课程中也有介绍,此处只给出其端口示意图。
3 a; D/ h; i- Z5 ~, L6 A6 ~$ P' A
图5 按键输入模块接口示意图
通道选择模块) K! V+ y; b$ \9 ]8 p
通过按键进行ADC四通道的选择,本模块接口示意图以及功能描述如下所示。
, ~. j! T0 Q" c

. ~3 C$ {- A8 d# l; A8 g1 h7 l
- [- N" O+ j' E2 Y: H5 G/ o
图6 通道选择模块接口示意图

/ K0 T9 Z" J2 ?7 m: Q
! L6 `; _1 Y& |+ |; i- m4 n
表5 通道选择模块接口功能描述
内部除了例化还需产生通道选择信号,这里用的模块有四个通道但是为何按键一来就加’d2,是因为通道选择实际信号需为0000、0010、0100、1000,这样我们就需要加’d2。
) ]; u* k3 n) d4 v) F
# e# W0 t& e1 m0 Q& A
数码管驱动模块
  C) x) J7 Z) R- _+ o2 X4 x本部分在基础课程中也有介绍,此处只给出其端口示意图。4 V7 d9 u8 C+ f" S8 \4 f
, ?+ `1 K+ X7 _6 u, |$ m+ c+ W# y; Z
( r, J- v9 {+ j( f0 @6 B
图7 数码管模块接口示意图
顶层设计

: K7 N5 F' E0 M* n4 T/ |
此处只需例化各个模块即可,顶层模块接口示意图如下所示。

4 _& r+ k9 d2 B$ L8 x
; K6 k. b" {* D7 S9 j& y
9 I8 s* m9 e8 ]' f7 [* X% b+ G
图8 顶层模块接口示意图
综合后的RTL视图如图9所示。

5 n  C( g7 z3 u6 b
3 P! w' M( O7 E3 x8 X  V/ {3 V
+ d9 x$ P2 r  a2 O9 h( V/ H
图9 RTL Viewer视图
分配好引脚下载后可以看到改变输入电压,数码管上均有正常的显示,且切换通道时数据可以随之更新。

2 R2 ?. `$ }: y8 P* r7 ?
% A3 W( L' X8 t5 R
至此一个四通道数字电压表设计完毕。
/ F) d; b) J" A) N附:基于查找表的数据电压换算# B; u. S# w7 r0 E: D3 O
前面指出了一种数据处理及码制的方式,这里再列举利用查找表的实现方式。
& x6 W4 [' f4 [$ T, K/ {这里因为是输入的10位二进制数,也就是说每一位变化对应的变化量为即为精度,这样就可以得出以下待转换数据与实际电压的对照表。这样当3.296v% K  T8 |: r" w' F- }6 P5 H
: I& {; C( A2 K0 C" l7 }

: t0 I$ s0 c! p% z8 `+ A  l( A3 Q- ^5 o: v0 J

' _% Y3 S7 _) l5 w这样就可以建立一个查找表,来分别计算其对应位的电压值的BCD码,然后相加。' C+ b! {, @# w# @

+ \% s3 h' m' j' W/ w# l6 t' C+ z
: Y8 {/ E  y+ ~

/ F. l: ^1 q5 D' ]$ I/ F( S) e& V- }
如果0~3位相加大于9,则加6调整为BCD码,并产生进位信号。再进行4~7位相加加上进位信号判断,再判断8-9位。0 j7 i% U! D( \. q3 _

+ o0 i# d6 s" A2 E, B
; Q. c3 A% U2 a/ P  _; M

. z9 G: X0 ~  |; ?6 F( m: `7 b; s7 N" h+ m' Y# }
$ q5 Z. v9 g% Q/ q
这样再将以上两个部分放置到一个always块中即可。同样可以看到实际效果。将输入数据显示格式修改为十进制后,输入512时输出0001_0110_0101_0000。此时实际电压为512*3.296/1024=1.648,显示为1.650。输入256时实际电压0.824,显示为0.825。
  Z9 \2 C  V: O4 Z

8 x  F, f) p* ^3 H' `, O8 p( _9 b, H, }# K
% }! N% [# g0 R4 v8 t

2 [! G" T0 X  }' a( V; }5 V% }. \
如有更多问题,欢迎加入芯航线 FPGA 技术支持群交流学习:472607506
小梅哥
芯航线电子工作室
& |# x7 f- [; P) \0 e3 H( n$ `
游客,如果您要查看本帖隐藏内容请回复
. i1 K7 s0 m3 h/ g1 L; Z
: ]+ i- @+ `. i* V- `

5 ^  O' A2 {8 o7 V! t$ q
9 h; q" C- G$ F: f0 I' ?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-29 03:29 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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