基于FPGA ad数据采集存储处理报告(含Verilog源代码)_第1页
基于FPGA ad数据采集存储处理报告(含Verilog源代码)_第2页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于FPGAAD数据采集存储处理项目报告(XILINXALTEARA都可用)组员:华、文、杰一、实验目的本次实验利用Basys2开发板完成一个开发小项目,即开发AD数据采集存储处理系统,旨在掌握FPGA开发基本方法以及锻炼解决开发过程中出现问题的能力。二、关键词Basys2、FPGA、AD转换、RAM、串口通信、MATLAB处理三、方案设计要实现本次项目,首先确定器件,其次根据器件时序写出模块的使用程序,最后综合成一个工程,然后进行仿真,上板实验。本次实验的器件:32M8位模数转换器、Basys2开发板、串口转RS232cp2102模块、基于三极管的电平转换电路。选择好器件后,根据器件的时序完

2、成模块的代码书写。写好AD模块、串口通信模块后,现在就需要处理采样速率与串口通讯速率不匹配的问题了。根据香农采样定理,采样频率得高于信号频率的两倍才能完成信号复现,我们这里使用25M的高速采样频率,而串口dps9600传送一个位104us明显比采样慢许多。所以这里需要解决速率不匹配的问题。我们想到可以利用FPGA的RAM先存储采样来的数据,然后再提取数据经过串口通信送至PC经由MATLAB处理。本次小项目最为关键的是控制好采样与串口通信的时序问题。关于时序的控制,留到模块介绍里面说明。方案小结:本次实验基于片内RAM存储AD采样过来的数据,然后待采样完成后提取数据串口通信至PC,最后经由mat

3、lab处理。四、模块介绍1.Verilog开发程序介绍如下给出基于Quartusll绘制出的BlockDiagram图,涵盖了所有的模块以及模块之间的连线。图4.1综合模块图如下给出程序目录(txt格式):clk.txtEZ匚ON.txtRAM.txtTOP.bdUART.txt2017/12/1312:441KB2017/12/1221:063KB017/12/1221:051KB2017/12/1221:042KB2017/12/1221:053KE现在分别介绍各个模块的端口以及功能。AD外设:电路图、实物图、接口丸転昨口tdfc;爭血为章*卜*H脅勒如$*L«*±*:

4、頁内呂fix目0注1rcw!IWC*5V45DACUhDADfi?U»B7OWE.KWM5DA曲曲$0AU4血的血迪LIMDQf11&WDA&S13DAdfb駡ISIS17ia15idnWJWJWlBlin«KBl曲VMShADfflB削湘氏制4£4KJU>S£3EZ7WtBtlAMfPwaadSjCCLK031現»盲朗聖.典At务価片剧4#-*U1»;胡頁:也扣!処曲弓口珂如曲卧弭心耐弓MriMi弘制日.HA.MXj鹹g这个外设提供最大32M采样速率,包括一个模拟信号输入和一个采样时钟输入以及八个数字信号输出。

5、在每个采样时钟的上升沿输出相应的采样数字信号。Basys2开发板:串口通讯模块外设:i:霸;BtKRh:这个模块旨在把Basys2输出的LVTTL转换成RS232的负逻辑高电平,实现串口与PC的通信。它有五个引脚:GND、3.3V、5V、TXD、RXD。在使用中,只使用RXD和GND。需要注意的是,倘若GND不与FPGA串口的GND连接,那么串口输出的电平,此模块无法识别,这就是数字地需要共地的重要性。这里的RXD接Basys的串口输出C6(这是分配的tx输出管脚)。接线当然用杜邦线的公母线连接。TOP模块:moduleTEST(inputclk7/50Minputrst_n,复位input7

6、:0datain,“AD输入outputclk_25M;outputtx串口TOP模块命名为TEST是当时自己写的非最终版程序用来测试正确性,最后测试正确后也没修改过来,但是对仿真没影响。elk是系统时钟输入,用来作为全局时钟并且为调用后面四个子模块提供时钟基础,设置为50M。rst_n是系统复位设置,复位到初始状态,这里大家都熟悉,不用多说。input7:0datain是AD外设的8位数字信号输入,这个数字信号随着AD采样时钟(elk_25M)变化,在后面CLK模块里面会说明。outputelk_25M为调用CLK模块后输出的AD采样时钟,这个输出用来接AD外设的时钟输入,提供采样时钟。ou

7、tputtx为调用uart模块后,与PC通信的“桥梁”即携带数据的信号吧。CLK模块:modulead_2clk(inputelk,/系统时钟50Uhzinputreset_n/复也彳氐电平有效,复位时时钟都低outputregclk_25M,用于AB采样苗频率outputregclk_dps9600/用于串口逋信的赣率这里模块名字设置为AD_2CLK,旨在表明输出两个CLK,用来AD米样和串口通信。inputelk为系统时钟50Mhz。Inputreset_n为系统复位,低电平有效。Outputregelk_25M为AD采样时钟,之前做过说明。Outputregdps9600为输出给uart

8、模块的时钟。ENCON模块:modulead_encoiii(inputwr_c1k,/写时钟输入inputrd-dk,/读时钟輪入inputrst_n,/夏铠言号,低电平有效outputregwren,写使能输出outputreg8:0vrraddress,写地址输出outputregrden;读使能输出outputreg8:0rdaddress,/Y读地址输出outputregwrsig/串口发送信号输出这个模块是整个程序的控制核心,下面介绍端口说明。Inputwr_elk为写时钟输入,这里我们接的当然就是AD写入的时钟CLK_25M,这里的写速率要和采样速率匹配才可以保证采样再存储的正确

9、性。Inputrd_elk为读时钟输入,这里接dps9600,符合串口协议。Inputrst_n为系统复位,低电平有效。Outputregwren为写使能输出,当wren为高时,写有效,即表明AD的八位数字信号写进RAM。Outputreg8:0wraddress为写地址,写地址在写时钟下降沿完成加一,保证每次写完后都是新的地址存储数据保证了ram能够存储512个正确数据。Outputregrden为读使能输出,当rden为高时,读有效,即表明RAM里面对应地址的信号读出。Outputreg8:0rdaddress为读地址,在每个读信号的下降沿完成加一,保证每次读完一个数据后地址指向新的内容,

10、保证读出的512个数据的正确性。Outputregwrsig为发送给串口的发送信号,上升沿有效。每一上升沿使串口开始发送送到串口的数据给PC。RAM模块:moduleinputinputinputinputinputinputinpiitoutputratnwren,rden,wr_clk7rd_clk77:0datain,8:0rdaddresb,dataoutwraddress,/读地址/采集时钟/串口逋氓时毎/写使能/读使罷/采集数据入/写地址Inputwr_clk为RAM的写时钟,上升沿有效在相应地址写入数据。Inputwren为RAM写使能信号,高电平有效,有效时配合wraddres

11、s和wrclk进行写操作。Input8:0wraddress为写地址,在每个wr时钟下降沿完成加一操作,确保每次写入的地址正确性。Inputrd_clk为RAM的读时钟,上升沿有效,在相应的地址读出数据。Input8:0rdaddress为读地址,同写地址功能。Inputrden,同wren。Outputdataout是读出的数据,送至UART模块通信给PC。UART模块:modulead_uartinputelk,/时钟input工复位input7:0datain,/'/数据入inputwrsig,/outputregidle./是否空闲高为线路忙,低为线路空闲outputt蛊);I

12、nputelk为CLK模块的clk_dps9600,用于配合这个模块打成波特率为9600的串口输出。Inputrst_n为复位,低电平有效。Input7:0datain接RAM模块的数据输出。Inputwrsig上升沿有效,开启串口发送,接ENCON模块wrsig。Outputregidle为串口工作状态说明,为高表明正在发送数据。Outputtx为发送的串口信号,接至上面的串口通讯外设模块RXD。介绍完所有模块后,现在给出仿真波形以及testbench的设置。TOP程序以及子程序调用:田mcdn丄亡TEST(j15J.了131920"1222324252G272-523303132

13、33343535373339404142434445464734?wireclk_dps3600;田ad2elkal(wirewren;wire9:C«wraddre33;wire8;C1xd.add.xe2:;wirerden;wirewrsig;_亡neonj2(.wr_clk(clk_-5M,写时铀输人.id_clk(clk_dps9600)f/V读时钟输入.TBt_rL(rst._n,/>fe信号彳牴电平有效.wren(wrenf/写使能输出.wraddr亡曰s呻匸直说工亡吕3#/写地1止输出.Tden(r-den)打读使能输出.zrdaddress(i-daddres

14、s)f/读地土止输岀.wrsigfwisig/串口皤注信号输出Eadw:L工亡?;Cdzt己cr>i匸;日raian3(.wr_clk(clk_25MJf.rd_clk:(clk_dp3B600)f.wrenfwizEnfzden(rdenf采隼时钟/V串口通讯时钟"写快能_"读使能.datairL(da-tainF77采隼数据入.wraddress(wraddress)f/写地止.rdaddr亡ss(rdaddr亡ss)f.;'读地iltdataout(1曰.七aontElad_jartj4(.elk(clk_dp36O0)f/UART时訓,采用clk_dp

15、s90Q,调用AB_2CLX=H块I5t_7L(r5t;_Il),/Wfe信号.datainfdataont)f/ADE过来的數字信号.wrsig(wisig)f/岌送命令、上升沿有埶IdleO,/V箜路状态指示!高忙!低闹.任(匸刃打岌送埶捐信号endirLod'AlETestbench:"timescale二tis/二psmcidjleTE5Tvlgtst();/constants/genexalfaxposeregistersregeachvec;/testvectoxinputreg!erfxegelk;xegxeg7;匚/wlxeswiretfi;wireclk_2

16、5M;/assignstatem亡nts(ifany)TEST11(elk(elk),i5t_nt.datsin(datdin)*.clk_25M(c23c_25M),.tx(tx)-);initialElteginclk:=0;rst_n=0;datsin=W'dLTO;#200zst_n=1;Lendalways#10EJbeginclk:=clkj-endendmodule对应的仿真波形:!)'we-OeFsJJ:+i或xig11:J/TKTJ4QJH【皿11unLtltpLTCnF11ji*i11jjIIiIi普/TET_归上伸5扌/1如帧甘沖1-Ib!_jUpi1|p

17、i|iIiI&-*/nSFhigJsl.yatakiiduuoihsa可见,CLK25M输出正确。lDUaLOlflRJnnnuLJU'igr.djLtrydk屮肛5T4<jttE_n<ST>E)LtUdt_2J怔ST.虹tt/tx可见,tx的输出也满足设计的10101010B然后验证每个位的时间,大概为104us,满足通信要求仿真通过。2.Matlab处理程序介绍:程序:clccleartextreadCC:UsersacerDesktopRec170923163333.txt*,'%s)ap=hex2dec(data;plot(ap);串口调试小助

18、手软件以及工作界面:WComAs5istant.exe2017/1/1421:50应用程序1S8KB清空接履区接履区傳止显7F厉自动清空两+六进制显示接收文件両三|保存数拥|更改路径|C:COMDATAUU99999999999999999999989898:389899999999989898999899999999989999999898999998:389899989898999998999998989998999998999998989999:399999999898999999989899999998999998989999999999:39999899999999999999999

19、8999998989999999899999999:3999999898999998989987818180808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080809298

20、98989899999999999999989999999899999998999999999999999999999998989999989899999998999999989999999998999999999999999999999998999999999999999899999999999999999999999998999999999999999999989999999999989999999999999999999899999999999999999999989899989987808181S08080807F808080808080808080808080808000999999

21、99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999997C81S18080808080808080808080808080808080808080808080SO8080808080808080808080808080808080808080808080SO8080808080808080808080808080808080808080808080SO8080808080808080808080808080808080808080808080SO80808080

22、80808080808080808080808080808080808080E:080809C989899999999999999999999999999999999999999999999999999999999串口调试小助手诣LJ瘠空重填|自动发送手动发送|+六进制发送这个程序提取串口通信至PC的数据(经由串口调试小助手输出),然后将十六进制转换成十进制最后绘图输出。五、关键问题分析处理我们小组在代码编写编译过程、仿真过程以及上板过程中出了不少错误,但最终都及时纠正了。在这个发现问题与解决问题的两周里,我们小组对出现的部分问题做了分析与记录有些还自行设计了实验验证。如下列出了一些关键问题的

23、分析处理。I:模块的购置问题与电平是否兼容的处理我们的小项目设计到两个外设,一个是AD转换模块一个是串口转RS232通信模块。在购置模块时需要考虑引脚电平是否与FPGA电平(我们这里使用的是LVTTL3.3V引脚电平)兼容,所需要的引脚空间Basys2是否有足够的提供,还需要考虑成本以及模块的时序问题。本实验过程中,我们购置了兼容LVTTL八位AD转换模块和兼容TTL的串口通信模块。成本很低,串口模块加上AD模块在几十块以内。网购的模块到了之后,我们开始测试各模块的电平值。经测试,AD输出高3.34V低0V,符合LVTTL3.3V电平逻辑经测试,串口模块txd输出高5v,低0V。基于这里,我们

24、通过串口txd接自己的rxd实现了串口模块是否损坏的测试,测试通过,串口是好的。由于在测量电平时,我们没有完成上板工作,所以我们只好假设串口模块rxd需要接TTL5V逻辑才可正常工作,因此我们组利用两个三极管搭建了一个电平转换电路,实现了电平转换。其实到后面的上板工作之后,发现3.3V的输出接到RXD,也能正常工作。II:源代码的借鉴与部分时序代码设计问题我们程序需要Verilog串口通信模块,为了节省时间,我们在网上寻找了若干串口通信例程,在掌握了例程的原理后,我们自行又编写了自己的串口模块和分时模块还有存储模块以及时序控制模块。其中,最为困难的是采集速率和通信速率不匹配怎么解决的问题。我们

25、采取利用ram存储并且提取数据以及设计了合理的存储提取时序控制模块解决这个问题。然而其中困难重重,由于网上资源有限,对ISEramip核理解不够,我们花了很多时间思考怎么实现这个速率匹配。最终利用ram语句构成的模块实现了ram存取功能。之后时序控制也顺利设计出来。叮:分模块调试在完成了各个模块的基本书写后,分模块调试是必须的,不然当各个模块整合到主程序之后除了问题,都不好分析。这里的调试当然还是基于testbench的仿真调试。W:子程序直接的衔接在主程序里调用子程序的过程中,我们出现了变量格式不匹配的问题,即上个子程序的输出需要用wire型去构成下个子程序的输入。而最开始,缺少经验的我们用

26、的是reg型变量来衔接子程序。仔细想想两个变量类型就知道,子程序就当作是一个黑盒子,只有输入输出,输出的变量类型就是wire型。在这个变量类型的选择上,我们组在这里跌了大坑,不过最终还是成功解决。顺利完成编译工作。V:主程序里子程序的分块调试完成编译工作之后,并不代表仿真就可以通过。我们组就遇到了这样的问题。我们在testbench里设计了7:0datain的激励输入,结果得到的tx输出既有高阻态也有红线不确定值输出。简而言之,仿真出错。所以我们开始在主程序里面执行程序的分块调试。考虑到我们程序的时序逻辑。我们由输入一个个分块仿真一直到最后输出。即先在主程序仿真CLK模块,注释掉其他模块并做做

27、适当修改(比如在主module里面添加时钟输出),验证好CLK模块之后,再在主程序里面仿真CLK+ENCON模块,然后再方向很CLK+ENCON+RAM模块,最后在全部仿真。经过上述主程序里的分块调试,我们成功完成了软件仿真工作。W:串口调试软件的熟悉我们的项目需要利用到一个软件,串口调试小助手。这个软件我们不是很熟悉,我们自己单独设计了一个串口通信工程,并且利用我们购置的串口通信模块完成这个熟悉过程。主要是通过修改数据长度、校验选择、停止位长度,来熟悉他们之间的通信协议。最终大家都对这个软件的应用有了深入了解。讪:上板调试我们组花了两个下午和三个晚上在南一楼完成调试工作,期间出了诸多问题。但

28、是我们冷静的分析问题,并且根据问题的现象给出做出假设,并给出试探性的解决方案。这样一步一步,大概处理了七八个问题之后,我们上板终于通过了。皿最重要的数字地共地问题这是本次上板实验过程中,出现的最大的问题!为什么要共地?因为我们需要一个标准去衡量数字电路中的高电平到底有多高。我们实验有三个地:BASYS2FPGAPMODio地、串口模块地、AD模块地(也就是给AD模块供电的电源地,这里使用的是实验室的电源)。第一个晚上的调试过程中,PMOD地和串口模块地没接,仅仅有一个AD地,结果导致PC上串口调试小助手只能一次接受到512个00数据(这里我们设计的一次采集512个数据),表明我们的软件模块并没

29、出错,出错的是硬件连线。我们冷静分析,在第二个晚上的实验中,把PMOD地与AD地共在一起,发现不能接受到512个数据了,只能随机的不可控的接到诸如FFFE这样的错误数据,而且只能接收到一两个数据。出了这样的问题,大家都手足无措。第三天晚上也就是项目提交的前一天晚上,我们把三个地全部接在一起。兴奋的发现,通过!可见,共地在数字电路中是多么重要。六、结果与分析如下是在实验室验收时的一张图:写在前面:本实验采样时钟25M,AD是八位而且输出幅度可调,每次采样512个数据。故每次采样的总时长:512*40ns20000ns=20us,f=50khz也就是说信号为50khz能够采集一个周期,信号为100

30、KHZ能够采集两个周期测量结果:sin50KHZ:n1BO16014012030604020Figure1交伴CE扁辑CE查春型插入0)工具CD卓面窗口血WctDnaH|聞窥口掐風|口E|020010001111110100200300400500600squ50KHZ:ZHMOST1Q=1亠夕飞越检第:|罔尺IHM强刚凰里茅苜工(DY®E呈皋難吕曲革LXIMFEUreS+Fexg枣BHQB底IsnlalGI莊融一声具ol腿竈丄凹一口固一口XSinlSOKHB:ZHMOSIT1B=3亠夕飞越处第:|罔尺IHM强刚凰苜工(DY®E呈皋難曲革B=3亠夕飞越处旨|罔尺IHM强刚凰

31、(OJffiM苜工(DY®E呈皋難曲革XL:ZHWIUJSB=3©亠夕飞越处旨|罔尺IHM强刚竖苜工(DY®E呈皋難曲革Q=3它1亠夕飞越处旨|罔尺IHM强刚竖苜工(DY®E呈皋難曲革XL:ZHwguisB=1亠夕飞越检J|罔FG尺IHM强刚黑里茅苜工(DY®E呈皋難吕曲革XLnEyjr18016000806020交叶E扁辑CE插入工貝CD卓面窗口应WMDaa|te|:+?v-?vr?®-1s|s|°020012001111101002003flO400500600结果分析:信号源VPP都是2.9V,基于上面的AD转换的算法

32、介绍,我们简单计算一下每个波形最高点对应的十进制数:(2.9/5+1)/2*255=201而我们采样出来的一般在180左右。为什么?因为我们说过,这个AD采样器有控制采样输出幅度的功能。如果要实现准确电压复现,可以再通过一个转换算法即可。根据上述三种波形以及不同频率的波形展示,可以看出,我们基本上完成了项目功能。但是在5M赫兹时,输出波形躁动很大,研究发现,是因为信号发生器的稳定性原因导致。(实验室信号发生器在5Mhz时稳定性很低)七、总结经过本次小项目,我们大家经历了很多。从立项到方案设计、模块购置、代码书写调试、仿真调试上板测试等等,大家一起在宿舍与南一实验室直接奔波多次,才完成这个项目,

33、其中的辛苦不易溢于言表。这个项目,网上基本上找不到完整源代码,所以我们自行设计了除了串口之外的全部代码,这很好的锻炼了我们的应用知识的能力。在项目工作中,我们知道了发现问题的重要性,清楚的认识到如何设计实验如何设计方案却解决问题更为重要。我们团结协作大家一起烧脑思考的奋斗经历更是难忘的。附录:源代码/moduleTEST(inputclk,/50Minputrst_n,/复位input7:0datain,/AD输入outputclk_25M,outputtx/串口);wireclk_dps9600;ad_2clku1(.clk(clk),/系统时钟50Mhz.reset_n(rst_n),/复

34、位,低电平有效,复位时时钟都低.clk_25M(clk_25M),/用于AD采样的频率.clk_dps9600(clk_dps9600)/用于串口通信的频率);wirewren;wire8:0wraddress;wire8:0rdaddress;wirerden;wirewrsig;ad_enconu2(.wr_clk(clk_25M),/写时钟输入.rd_clk(clk_dps9600),/读时钟输入.rst_n(rst_n),/复位信号,低电平有效.wren(wren),/写使能输出.wraddress(wraddress),/写地址输出.rden(rden),/读使能输出.rdaddre

35、ss(rdaddress),/读地址输出.wrsig(wrsig)/串口发送信号输出);wire7:0dataout;ramu3(.wr_clk(clk_25M),.rd_clk(clk_dps9600),/采集时钟/串口通讯时钟.wren(wren),.rden(rden),.datain(datain),/写使能/读使能/采集数据入.wraddress(wraddress),/写地址.rdaddress(rdaddress),/读地址.dataout(dataout);ad_uartu4(.clk(clk_dps9600),/UART时钟,采用clk_dps9600,调用AD_2CLK模块

36、.rst_n(rst_n),/复位信号.datain(dataout),/AD送过来的数字信号.wrsig(wrsig),/发送命令,上升沿有效.idle(),/线路状态指示,高忙,低闲.tx(tx)/发送数据信号);endmodule/modulead_2clk(inputclk,/系统时钟50Mhzinputreset_n,/复位,低电平有效,复位时时钟都低outputregclk_25M,/用于AD采样的频率outputregclk_dps9600/用于串口通信的频率);reg1:0cnt_1;reg15:0cnt_2;/2分频always(posedgeclkornegedgerese

37、t_n)beginif(!reset_n)begincnt_1<=2'b0;clk_25M<=1'b0;endelsebeginif(cnt_1=2'd0)beginclk_25M<=1'b1;cnt_1<=cnt_1+2'd1;end/1-21elseif(cnt_1=2'd1)beginclk_25M<=1'd0;cnt_1<=2'b0;end/03-0elsecnt_1<=cnt_1+1'b1;endendalways(posedgeclkornegedgereset_n)b

38、eginif(!reset_n)begincnt_2<=2'b0;clk_dps9600<=1'b0;endelsebeginif(cnt_2=16'd162)beginclk_dps9600<=1'b1;cnt_2<=cnt_2+16'd1;endelseif(cnt_2=16'd325)beginclk_dps9600<=1'b0;cnt_2<=16'd0;endelsecnt_2<=cnt_2+16'd1;endendendmodule/modulead_encon(inpu

39、twr_clk,/写时钟输入inputrd_clk,/读时钟输入inputrst_n,/复位信号,低电平有效outputregwren,/写使能输出outputreg8:0wraddress,/写地址输出outputregrden,/读使能输出outputreg8:0rdaddress,/读地址输出outputregwrsig/串口发送信号输出);/计数器reg10:0cnt;/大计数器reg10:0wr_cnt;/分-读计数器reg10:0rd_cnt;/分-写计数器/计数器写部分always(posedgewr_clkornegedgerst_n)/这部分先按自然时间累增beginif(!

40、rst_n)wr_cnt<=11'd0;elseif(wr_cnt<11'd1024)wr_cnt<=wr_cnt+11'd1;elsewr_cnt<=wr_cnt;end/计数器读部分使写计数器在读计数器533后,完成自加/完成wrsig需要再来个计数器reg7:0wrsig_cnt;regflag;always(posedgerd_clkornegedgerst_n)beginif(!rst_n)beginrd_cnt<=11'd533;wrsig_cnt<=8'd0;endelseif(rd_cnt=11'

41、;d1045)rd_cnt<=rd_cnt;elseif(wrsig_cnt=8'd255)begin继续下一次读,255是一个比较合理的数rd_cnt<=rd_cnt+11'd1;wrsig_cnt<=8'd0;flag<=1'd1;endelsebeginflag<=1'd0;wrsig_cnt<=wrsig_cnt+8'd1;endend/计数器分配always(*)beginif(!rst_n)cnt<=11'd0;elseif(wr_cnt<=11'd533)cnt<

42、=wr_cnt;elsecnt<=rd_cnt;end/写使能always(posedgewr_clkornegedgerst_n)beginif(!rst_n)wren<=1'd0;elseif(cnt<11'd11)/0-10=0wren<=1'b0;elseif(cnt>11'd10&&cnt<11'd523)wren<=1'b1;elseif(cnt>11'd522)/523-=0wren<=1'b0;end/等待读出操作完成后,/11-522=1/读使

43、能always(posedgerd_clkornegedgerst_n)beginif(!rst_n)rden<=1'd0;elseif(cnt<=11'd533)/0-533=0rden<=1'b0;elseif(cnt<11'd1045)/534-1045=1rden<=1'b1;else/1046-=0rden<=1'b0;end/写地址,在写信号激发时,每个时钟下降沿加一,初始定位0,复位后也为0;always(negedgewr_clkornegedgerst_n)beginif(!rst_n)wra

44、ddress<=9'd0;elseif(wren)wraddress<=wraddress+9'd1;elsewraddress<=wraddress;end/读地址和串口发送信号,在读信号激发时,而且falg信号出现时,地址加一,信号为1初始定位0,复位后也为0;always(negedgerd_clkornegedgerst_n)beginif(!rst_n)rdaddress<=9'd0;elseif(rden&&flag)beginrdaddress<=rdaddress+9'd1;wrsig<=1&#

45、39;d1;endelsebeginrdaddress<=rdaddress;wrsig<=1'd0;endendendmodule/moduleram(inputwr_clk,/采集时钟inputrd_clk,/串口通讯时钟inputwren,/写使能inputrden,/读使能input7:0datain,/采集数据入input8:0wraddress,/写地址input8:0rdaddress,/读地址output7:0dataout77reg7:0RAM2*9:0;reg8:0rdaddress_reg;always(posedgewr_clk)beginif(wr

46、en)beginRAMwraddress<=datain;endendalways(posedgerd_clk)beginif(rden)beginrdaddress_reg<=rdaddress;endendassigndataout=RAMrdaddress_reg;endmodule/modulead_uart(inputelk,/时钟inputrst_n,/复位input7:0datain,/数据入inputwrsig,/outputregidle,/是否空闲高为线路忙,低为线路空闲outputtx);regsend;/数据发送什么的,高电平有效regwrsigbuf,wr

47、sigrise;regpresult;/1代表八个数据里面1的个数为奇数,0代表为偶数reg7:0ent;/16时钟一个二进制,1+8+1+1=168parameterparitymode=1'b0;/检测发送命令的上升沿/always(posedgeelk)beginwrsigbuf<=wrsig;/Q(N)与Q(N+1)wrsigrise<=(wrsigbuf)&wrsig;end/启动串口发送程序/always(posedgeclk)beginif(wrsigrise&(idle)/如果发送命令有效,而且线路空闲,那么启动新的数据发送进程send=1'd1;elseif(cnt=16'dl68)/帧数据

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论