|
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) ]; @由工作原理图可以暂时将本系统划分为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数据预处理模块
; 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% Q0 h2 W* M" ^6 S0 ^# C+ f
9 X4 p+ ~9 R; _+ H" j2 C
" ^- 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此处采用加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首先进行判断一个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
1 {4 p/ T; y" j( b# @
+ 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通道选择模块
" ~) 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
) S/ q, U. \, C
1 L: Y! h! f# m% b# z3 r8 |内部除了例化还需产生通道选择信号,这里用的模块有四个通道但是为何按键一来就加’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顶层设计 ) y- i, @/ ?3 L
此处只需例化各个模块即可,顶层模块接口示意图如下所示。
5 o0 z% F5 W! R6 A9 W! H' Z: W3 ~6 E {( Z- e
8 Y3 _1 c3 }) D
* D$ r4 P' u- ?
: j# ?/ K, Q9 ?# }
8 l( z @1 L2 [$ v" ~3 o# n3 r分配好引脚下载后可以看到改变输入电压,数码管上均有正常的显示,且切换通道时数据可以随之更新。
5 ^" G! p5 X8 S8 F; ?: @
% 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 |
|