●高共模抑制比:
>110dB(G=1000>;
●低噪声:
1.5μVp-p(0.1~100Hz>;
●单电阻可编程增益:
1≤G≤1000;
●具有输出参考端及远程补偿端;
●可进行内部补偿;
●除增益电阻外,不需其它外围器件;
●可调整偏移、增益和共模抑制比
4、温度采集模数信号转换部分电路图
工作芯片介绍
CycloneIIEP2C5Q208C8是Altera公司生产的一款具有较高性价比的FPGA芯片,它采用Stratix架构,使用90nm工艺生产,具有4608个LE,26个M4K单元,2个PLL以及13个乘法器,另外,其I/O管脚可以直接与系统中使用的其它芯片相连而不需要进行电平转换。
该款FPGA的内部资源以及管脚数量能够完全满足本案的设计需求。
故选用该款FPGA作为主控逻辑芯片。
FPGA的内部功能模块可以划分为UART收发、AD521控制、包络信号DDS、脉冲信号控制、变频控制信号输出这五个主要部分,另外,还包括各个模块间的协调以及时钟信号产生等部分。
这些控制逻辑都通过Verilog硬件描述语言来实现
主程序
LIBRARYIEEE。
USEIEEE.STD_LOGIC_1164.ALL。
USEIEEE.STD_LOGIC_UNSIGNED.ALL。
ENTITYclockIS
PORT(
clk:
INSTD_LOGIC。
enable:
INSTD_LOGIC。
sel:
OUTSTD_LOGIC_VECTOR(2DOWNTO0>。
segment:
OUTSTD_LOGIC_VECTOR(6DOWNTO0>>。
ENDclock。
ARCHITECTURErt1OFclockIS
COMPONENTclk_div1000
PORT(clk:
INSTD_LOGIC。
clk_div:
OUTSTD_LOGIC>。
ENDCOMPONENT。
COMPONENTcount100
PORT(
enable:
INSTD_LOGIC。
clk0:
INSTD_LOGIC。
qh:
OUTSTD_LOGIC_VECTOR(3DOWNTO0>。
ql:
OUTSTD_LOGIC_VECTOR(3DOWNTO0>>。
ENDCOMPONENT。
COMPONENTdisplay
PORT(
clk:
INSTD_LOGIC。
qh:
INSTD_LOGIC_VECTOR(3DOWNTO0>。
ql:
INSTD_LOGIC_VECTOR(3DOWNTO0>。
sel:
OUTSTD_LOGIC_VECTOR(2DOWNTO0>。
segment:
OUTSTD_LOGIC_VECTOR(6DOWNTO0>>。
ENDCOMPONENT。
signalqh:
STD_LOGIC_VECTOR(3DOWNTO0>。
signalql:
STD_LOGIC_VECTOR(3DOWNTO0>。
signalclk0:
STD_LOGIC。
BEGIN
u0:
clk_div1000PORTMAP(clk,clk0>。
u1:
count100PORTMAP(enable,clk0,qh,ql>。
u2:
displayPORTMAP(clk,qh,ql,sel,segment>。
ENDrt1。
LIBRARYIEEE。
USEIEEE.STD_LOGIC_1164.ALL。
USEIEEE.STD_LOGIC_UNSIGNED.ALL。
ENTITYclk_div1000IS
PORT(
clk:
INSTD_LOGIC。
clk_div:
OUTSTD_LOGIC>。
ENDclk_div1000。
ARCHITECTURErt1OFclk_div1000IS
SIGNALq_tmp:
INTEGERrange0to999。
BEGIN
PROCESS(clk>
BEGIN
IF(clk'eventandclk='1'>THEN
IF(q_tmp=999>THEN
q_tmp<=0。
ELSE
q_tmp<=q_tmp+1。
ENDIF。
ENDIF。
ENDPROCESS。
PROCESS(clk>
BEGIN
IF(clk'eventandclk='1'>THEN
IF(q_tmp=999>THEN
clk_div<='1'。
ELSE
clk_div<='0'。
ENDIF。
ENDIF。
ENDPROCESS。
ENDrt1。
Libraryieee。
Useieee.std_logic_1164.all。
Useieee.std_logic_unsigned.all。
Entitycont10is
Port(clk,clr:
instd_logic。
Y:
outstd_logic_vector(3downto0>。
Cout:
outstd_logic>。
Endcont10。
Architectureexampleofcont10is
Signaly_temp:
std_logic_vector(3downto0>。
Begin
Process(clk>
Begin
Ifclr='1'then
Y_temp<="0000"。
Elsifclk'eventandclk='1'then
Ify_temp="1001"then
Y_temp<="0000"。
Cout<='1'。
Else
Y_temp<=y_temp+1。
Cout<='0'。
Endif。
Endif。
Endprocess。
Y<=y_temp。
Endexample。
Libraryieee。
Useieee.std_logic_1164.all。
Packagemy_pkgis
Componentcont10
Pork(clk,clr:
instd_logic。
Y:
outstd_logic_vector(3downto0>。
Cout:
outstd_logic>。
Endcomponent。
Endmy_pkg。
Libraryieee。
Useieee,std_logic_1164.all。
Usework.my_pkg.all。
Entitycont_100is
Pork(clk,clr:
instd_logic。
Y_l,y_h:
outstd_logic_vector(3downto0>>。
Endcont100。
Architectureexampleofcont100is
Signalx:
std_logic。
Begin
U1:
cont10portmap(clk,clr,y_l,x>。
U2:
cont10portmap(clk=>x,clr=>clr,y=>y_h>。
Endexample。
LIBRARYIEEE。
USEIEEE.STD_LOGIC_1164.ALL。
USEIEEE.STD_LOGIC_UNSIGNED.ALL。
ENTITYcount8IS
PORT(
clk:
INSTD_LOGIC。
sel:
OUTSTD_LOGIC_VECTOR(2DOWNTO0>>。
ENDcount8。
ARCHITECTURErt1OFcount8IS
signalsel_temp:
STD_LOGIC_VECTOR(2DOWNTO0>。
BEGIN
PROCESS(clk>
BEGIN
IF(clk'eventandclk='1'>THEN
IF(sel_temp="111">THEN
sel_temp<=(others=>'0'>。
ELSE
sel_temp<=sel_temp+1。
ENDIF。
ENDIF。
sel<=sel_temp。
ENDPROCESS。
ENDrt1。
LIBRARYIEEE。
USEIEEE.STD_LOGIC_1164.ALL。
ENTITYtime_chooseIS
PORT(
sel:
INSTD_LOGIC_VECTOR(2DOWNTO0>。
qh:
INSTD_LOGIC_VECTOR(3DOWNTO0>。
ql:
INSTD_LOGIC_VECTOR(3DOWNTO0>。
q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0>>。
ENDtime_choose。
ARCHITECTURErt1OFtime_chooseIS
BEGIN
PROCESS(sel,qh,ql>
BEGIN
CASEselIS
WHEN"000"=>q<=ql。
WHEN"001"=>q<=qh。
WHENOTHERS=>q<="XXXX"。
ENDCASE。
ENDPROCESS。
ENDrt1。
LIBRARYIEEE。
USEIEEE.STD_LOGIC_1164.ALL。
ENTITYseg7IS
PORT(
q:
INSTD_LOGIC_VECTOR(3DOWNTO0>。
segment:
OUTSTD_LOGIC_VECTOR(6DOWNTO0>>。
ENDseg7。
ARCHITECTURErt1OFseg7IS
BEGIN
PROCESS(q>
BEGIN
CASEqIS
WHEN"0000"=>segment<="0111111"。
WHEN"0001"=>segment<="0000110"。
WHEN"0010"=>segment<="1011011"。
WHEN"0011"=>segment<="1001111"。
WHEN"0100"=>segment<="1100110"。
WHEN"0101"=>segment<="1101101"。
WHEN"0110"=>segment<="1111101"。
WHEN"0111"=>segment<="0100111"。
WHEN"1000"=>segment<="1111111"。
WHEN"1001"=>segment<="1101111"。
WHENOTHERS=>segment<="XXXXXXX"。
ENDCASE。
ENDPROCESS。
ENDrt1。
LIBRARYIEEE。
USEIEEE.STD_LOGIC_1164.ALL。
ENTITYdisplayIS
PORT(
clk:
INSTD_LOGIC。
qh:
INSTD_LOGIC_VECTOR(3DOWNTO0>。
ql:
INSTD_LOGIC_VECTOR(3DOWNTO0>。
sel:
OUTSTD_LOGIC_VECTOR(2DOWNTO0>。
segment:
OUTSTD_LOGIC_VECTOR(6DOWNTO0>>。
ENDdisplay。
ARCHITECTURErt1OFdisplayIS
COMPONENTcount8
PORT(
clk:
INSTD_LOGIC。
sel:
OUTSTD_LOGIC_VECTOR(2DOWNTO0>>。
ENDCOMPONENT。
COMPONENTtime_choose
PORT(
sel:
INSTD_LOGIC_VECTOR(2DOWNTO0>。
qh:
INSTD_LOGIC_VECTOR(3DOWNTO0>。
ql:
INSTD_LOGIC_VECTOR(3DOWNTO0>。
q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0>>。
ENDCOMPONENT。
COMPONENTseg7
PORT(
q:
INSTD_LOGIC_VECTOR(3DOWNTO0>。
segment:
OUTSTD_LOGIC_VECTOR(6DOWNTO0>>。
ENDCOMPONENT。
SIGNALsel_tmp:
STD_LOGIC_VECTOR(2DOWNTO0>。
SIGNALq:
STD_LOGIC_VECTOR(3DOWNTO0>。
SIGNALsegment_tmp:
STD_LOGIC_VECTOR(6DOWNTO0>。
BEGIN
U0:
count8PORTMAP(clk,sel_tmp>。
sel<=sel_tmp。
U2:
time_choosePORTMAP(sel_tmp,qh,ql,q>。
U3:
seg7PORTMAP(q,segment_tmp>。
segment<=segment_tmp。
ENDrt1。
四、技术总结
为期两周的课设已经接近尾声了,在这2周中,我学到了很多,对EDA的认识也进一步加深了。
从一个刚入门的学习者,渐渐的爱上了这门技术,虽然说对于EDA的知识还有很多要学习和提高,但是在这2周中我还是感受到这门课程的魅力所在。
在拿到数字钟这个课题时,我和我的合作伙伴对这个课题感到比较轻松,脑海中一下子出现了许多设计念头,于是我们就分头去寻找这方面的资料,通过图书馆的书籍资料,网络上的虚拟资料。
在2天的找资料的过程中,我开始觉得所谓的数字钟并非我想象的那么简单。
一开始我想到的数字钟只是一般的计数功能并未涉及到调时,调分,和闹铃功能。
在如何显示方面也没有细细的考虑过。
在看过一些资料后,越来越感觉到数字钟课题并非手到擒来。
在与伙伴商量后,我们以一本参考书的资料为基础开始展开细致设计。
我们一开始的输入是有三个模块,输入模块,计数模块,和显示模块。
对于计数模块我们通过分频方法很快就得到了1HZ的频率用于计数,再通过计数进位标志实现秒,分,时的互相关联,再显示模块,我们通过7段数码管扫描显示也的到了实现。
但是在输入模块,我们却遇到了障碍,如何通过硬件上的有限的开关和按钮来实现呢。
我们首先想到了,做一个可以输入数字的键盘和开关<16*16),可是在想到键盘设计本身就是一个非常复杂的过程,想到2周能做好的话有一定的难度,于是我们果断的放弃了这一计划。
那么如何实现输入,这个问题摆在我们面前,我感到了课设以来前所未有的压抑感。
通过四个开关控制0—9的输入,但是如何控制是输入的是哪一位,如何进行调时,闹铃控制?
都是难题。
在冥想了2天后,我才发现自己陷如了思维的局限性中,为什么一定通过输入来完成调时呢,我们不可以通过他本身的计数功能来调时,这样虽然没有像我们所想的输入调时那样方便,但是它的简单在于充分利用了1HZ频率,通过干扰进位标志进行调时。
这一个方法想到后,其他的闹铃功能和报时功能也都迎刃而解了。
经过3天的编程和功能完善,我们基本实现了所有的功能,各个模块的编译和仿真也都实现了,第二个星期,实验室开放,我和伙伴就开始进行硬件上的实现了,在完成顶层设计后,我们成功的下载在硬件上了。
通过调时后,基本实现了全部功能,并通过了老师的检查。
到此本次课设基本上实现了所有的功能,但在有些功能的实现中,还有待提高。
比如说对于调时功能,只能等待调时,这样对于调时的机动性不好,如果控制不好,过了应调时间的话,就必须在等一次循环后才能调时,这样就很浪费时间了。
还有就是闹钟功能并未完全实现它,我们只是编写了一个特定的程序来闹铃,闹铃时间已经事先安排好了,无法再通过手动调节了,这样就缺少了人性化。
这在课设结束以后,要进一步的改进,争取获得一款高性能的人性化的数字钟。
通过本次课设,我不仅学到了关于EDA的许多专业知识,同时也让我感觉到团队合作的重要性。
其实如何有效和快速的找到资料也是课设给我的启发,利用好图书馆和网络,是资源的到最好的利用。
如果我们一味的屋子里苦思冥想那么再给2周的时间或许也不会有数字钟诞生,所以我觉得与他人交流思想是取得成功的关键,在交流中,不仅强化了自己原有的知识体系也可以扩展自己的思维。
通过思考、