数字电路课程设计Word下载.docx

上传人:b****8 文档编号:22873294 上传时间:2023-02-05 格式:DOCX 页数:18 大小:2.46MB
下载 相关 举报
数字电路课程设计Word下载.docx_第1页
第1页 / 共18页
数字电路课程设计Word下载.docx_第2页
第2页 / 共18页
数字电路课程设计Word下载.docx_第3页
第3页 / 共18页
数字电路课程设计Word下载.docx_第4页
第4页 / 共18页
数字电路课程设计Word下载.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

数字电路课程设计Word下载.docx

《数字电路课程设计Word下载.docx》由会员分享,可在线阅读,更多相关《数字电路课程设计Word下载.docx(18页珍藏版)》请在冰豆网上搜索。

数字电路课程设计Word下载.docx

1.3原理阐述

利用重力感应芯片检测运动,将信号放大之后输入施密特触发器产生方波波形,并利用FPGA将方波波形计数并在数码管上显示。

第二章设计思路、方法及方案

2.1系统功能需求分析

本次实验采用的重力感应芯片是ADI公司生产的ADXL335加速度传感器,传感器本身支持三轴重力感应,驱动电压为3V。

我们的实验只需要读取其中一轴的信号即可。

但是感应器本身输出峰值在200mV左右,且为随着加速度大小连续改变的模拟信号,而FPGA的信号输入需要方波脉冲。

传感器输出不论是峰值电压还是连续信号本身都不能满足要求。

于是,我们需要首先对传感器的输出信号进行放大,并将其波形转换为方波信号,以便FPGA的进一步处理。

2.2方案确定及框图结构说明

根据前文所说,由于信号在生成方波以前需要进行电压幅度放大,考虑到放大电路本身存在噪声,再加上环境因素的影响,为了有效滤除噪声对方波信号的影响,我们选择施密特触发器而不是简单的比较器来产生方波,触发器由555电路为主构成,驱动电压为3.3V左右,最大转换电压越2V,最低转换电压为1V,以此为依据,我们可以设计出放大器的放大倍数。

放大器设计中,我们使用简单的LM324集成运放,其价格便宜,设计指标也能满足信号放大的需求。

使用LM324中的一个运算放大器,使用利用深度反馈原理,即可获得相应的放大倍数。

由于传感器本身输出信号带有一定的直流偏执,所以在放大之前需要使用隔直电容将直流隔去。

在完成电路之后,将产生峰值在2V左右的方波信号,信号输入到FPGA开发板上,通过编程实现对方波的计数,并最终显示在数码管上。

下面是设计的框图。

最终确定的主要元器件和设备有:

1、ADXL335重力感应传感器

2、LM324集成运放

3、555电路

4、XC3S250E144型FPGA开发板

第三章硬件原理图设计、装配与调试

3.1硬件原理

硬件原理如下图所示

本电路完成了运动信号的采集,放大,生成方波信号的操作,其中,LM324放大电路仅使用其中一个运算放大器,通过调节R1和R2电阻值的比值,将放大器增益设置在20dB左右。

原理图如下:

使用555电路组成施密特触发器的原理图如下:

3.2装配成果

最后焊接完成后的电路板如下图所示。

正面图:

背面图:

3.3调试结果

如下图所示,首先将示波器接头接在隔直电容前端,可以看到缓慢上下摇动一次传感器产生的带有直流分量的输出信号(模拟信号)。

将放大器和施密特触发器都调试完成后,不停摇动电路板,可以在最后的输出端看到如下的方波信号,可以看到,信号幅度在2.26V,且方波比较规则,仅有很小的失真。

第四章FPGA模块程序设计

使用FPGA对施密特触发器产生的方波脉冲信号进行计数,并将数值显示在7段数码管上。

在设计时应当注意的是,使用上升沿计数时,脉冲上升沿与系统时钟不同步,在7段数码管显示时,每个数码管都有一个使能信号。

同时,整个系统需要设定复位信号。

最终整个FPGA设计框图如下:

具体VHDL代码见附录1.

代码完成之后,为了将VHDL模块的端口信号与FPGA的硬件接口关联起来,同时对一些信号进行约束,需要进行管教适配,适配所用代码见附录2.

第五章系统调试及硬件检查

5.1系统调试过程

在实验过程中,曾经遇到了不小的困难,期间也经历过多次调试。

第一次困难在于产生的方波信号存在直流偏置,首先想到的是隔直电容出现短路,但是更换电容以后没有解决问题,后来我们偶然发现,如果将电容接地放电,可以解决存在直流偏置的问题,最后考虑到这应该和电容本身的充电现象有关。

第二次困难在于方波信号电压不足,导致FPGA难以检测到信号输入。

该问题通过重新调节俩个变阻器的阻值之比得到解决。

第三次困难在于VHDL编程过程中,由于对进程和信号概念理解不清楚,在设计D触发器之后的比较器时,使用了错误的代码,导致系统自检出错,后来通过请教同学,改变设计方法,解决了这一问题。

在实验过程中,还因误触稳压电源旋钮烧坏了一个LM324运放,幸运的是并没有损坏其他电路原件,这也提醒我们在实验过程中一定要细致,小心。

5.2实验结果

在代码和硬件都分别完成并分块调试完毕以后,将VHDL代码下载到FPGA开发板上,并将整个系统连接好,即完成了实验主要内容。

摇动电路板,FPGA上的数码管能正确显示计数到99次,按下reset键可以对显示清零并重新开始计数。

第六章结束语

通过本次实验,第一次体会到了数字电路设计开发过程,对高精度的电路焊接,FPGA开发,系统调试等都有了更加深入的了解并增加了实践的经验。

贴片芯片的焊接是一个对耐心和细致要求极高的工作,我也是通过仔细琢磨,并花了很长时间才掌握了焊接的诀窍。

并成功将几根头发丝一样细的导线焊上去。

同时,系统设计虽然很完善,但是实际电路完全和设计不同,反复的调试也让我体会到了电路设计一定要结合实际这一观点。

正如一个学姐说的,“只有调的出来的电路设计,才是好设计”。

反复调试也让我更加体会到耐心和坚持的重要,试想,如果一次两次调试失败就放弃,是不可能做得出来这个小装置的。

在实验过程中,我还发现,由于是两个同学共同完成一块板子的制作,所以很多同学不愿意亲自动手完成繁琐的焊接工作,完全交给另外一个同学完成(当然我们组是真正两个人合作完成的),这样的话就失去了这个宝贵的锻炼动手能力的机会,不得不说是一个遗憾,所以还是希望以后能够多采购一些元器件,让每个同学都能够充分感受制作的过程,毕竟培养同学动手能力也是实验目的的一部分。

最后,感谢在实验过程中给予我帮助的老师和同学们,没有你们的帮助和支持,我的实验将完成的非常困难,是你们让我感受到了团队合作的力量。

附录1

VHDL程序

---------------------------------------------------------------------

--Company:

--Engineer:

--CreateDate:

02:

54:

5005/12/2011

--DesignName:

--ModuleName:

raysc-Behavioral

--ProjectName:

--TargetDevices:

--Toolversions:

--Description:

--Dependencies:

--Revision:

--Revision0.01-FileCreated

--AdditionalComments:

libraryIEEE;

useIEEE.STD_LOGIC_1164.ALL;

useIEEE.STD_LOGIC_ARITH.ALL;

useIEEE.STD_LOGIC_UNSIGNED.ALL;

----Uncommentthefollowinglibrarydeclarationifinstantiating

----anyXilinxprimitivesinthiscode.

--libraryUNISIM;

--useUNISIM.VComponents.all;

entityrayscis

Port(din:

inSTD_LOGIC;

clk:

reset:

dout:

outSTD_LOGIC_VECTOR(7downto0);

en_out:

outSTD_LOGIC_VECTOR(7downto0));

endraysc;

architectureBehavioralofrayscis

signalcnt1,cnt2:

std_logic_vector(3downto0);

--theoutcomesofthecounter

signalcont1,cont2:

std_logic_vector(7downto0);

--theencodingsofdisplayer

signala,b:

std_logic;

signalcounter1:

std_logic_vector(12downto0);

signalcounter2:

signalcnt_flag,en_flag:

signalzer,one,two,thr,fou,fiv,six,sev,eig,nin,E:

std_logic_vector(7downto0);

begin

a<

=din;

zer<

="

11000000"

;

one<

11111001"

two<

10100100"

thr<

10110000"

fou<

10011001"

fiv<

10010010"

six<

10000010"

sev<

11111000"

eig<

10000000"

nin<

10010000"

E<

10000110"

process(clk,reset)

ifreset='

0'

then

b<

='

elsifclk'

eventandclk='

1'

=a;

endif;

endprocess;

process(clk,reset)

cnt1<

=(others=>

'

);

cnt2<

ifa='

andb='

ifcnt1="

1001"

cnt1<

cnt2<

=cnt2+'

else

=cnt1+'

endif;

endif;

counter1<

cnt_flag<

--en_flag<

ifcounter1="

1111111111111"

counter1<

else

=counter1+'

process(clk,reset)

ifclk'

ifcounter1<

"

0111111111111"

en_flag<

process(cnt1,cnt2)

casecnt1is

when"

0000"

=>

cont1<

=zer;

0001"

=one;

0010"

=two;

0011"

=thr;

0100"

=fou;

0101"

=fiv;

0110"

=six;

0111"

=sev;

1000"

=eig;

=nin;

whenothers=>

=E;

endcase;

casecnt2is

cont2<

process(en_flag,cont1,cont2)

begin

ifen_flag='

then

dout<

=cont1;

en_out<

11111110"

else

dout<

=cont2;

11111101"

endBehavioral;

附录2

管脚适配

NET"

clk"

TNM_NET=clk;

############################clock

TIMESPECTS_clk=PERIOD"

20nsHIGH50%;

din"

LOC=P21;

LOC=P128;

reset"

LOC=P38;

#NET"

set"

LOC=P41;

#################################################NixieTube

dout(7)"

LOC=P66;

dout(6)"

LOC=P53;

dout(5)"

LOC=P54;

dout(4)"

LOC=P77;

dout(3)"

LOC=P76;

dout

(2)"

LOC=P58;

dout

(1)"

LOC=P75;

dout(0)"

LOC=P52;

#################################################control

en_out(7)"

LOC=P51;

en_out(6)"

LOC=P59;

en_out(5)"

LOC=P74;

en_out(4)"

LOC=P43;

en_out(3)"

LOC=P82;

en_out

(2)"

LOC=P83;

en_out

(1)"

LOC=P85;

en_out(0)"

LOC=P81;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1