《基于vhdl的fpga串口通信dkcg.docx》由会员分享,可在线阅读,更多相关《基于vhdl的fpga串口通信dkcg.docx(21页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、- 本本模块的的功能是是验证实实现和PPC机进进行基本本的串口口通信的的功能。需需要在-PCC机上安安装一个个串口调调试工具具来验证证程序的的功能。- 程程序实现现了一个个收发一一帧100个biit(即即无奇偶偶校验位位)的串串口控-制器器,100个biit是11位起始始位,88个数据据位,11个结束束-位。串串口的波波特律由由程序中中定义的的divv_paar参数数决定,更更改该参参数可以以实-现相相应的波波特率。程程序当前前设定的的divv_paar 的的值是00x1004,对对应的波波特率是是-96600。用用一个88倍波特特率的时时钟将发发送或接接受每一一位biit的周周期时间间-划分
2、分为8个个时隙以以使通信信同步.-程序序的工作作过程是是:串口口处于全全双工工工作状态态,按动动keyy2,CCPLDD向PCC发送皐皐elccomee-字符符串(串串口调试试工具设设成按AASCIII码接接受方式式);PPC可随随时向CCPLDD发送00-F的的十六进进制-数据据,CPPLD接接受后显显示在77段数码码管上。librraryy IEEEE;use IEEEE.SSTD_LOGGIC_11664.AALL;use IEEEE.SSTD_LOGGIC_ARIITH.ALLL;use IEEEE.SSTD_LOGGIC_UNSSIGNNED.ALLL; ENTIITY UARRT
3、IIS PPORTT ( cclk : INN sttd_llogiic; rrst : INN sttd_llogiic; rrxd : INN sttd_llogiic; -串行行数据接接收端 ttxd : OUUT sstd_loggic; -串行数数据发送送端 een : OUUT sstd_loggic_vecctorr(7 dowwntoo 0); - 数数码管使使能 sseg_datta : OUUT sstd_loggic_vecctorr(7 DOWWNTOO 0); -数码码管数据据 kkey_inpput : INN sttd_llogiic -按按键输入入 ); END
4、 UARRT;ARCHHITEECTUURE arcch OOF UUARTT ISS -/innnerr reeg/ SSIGNNAL divv_reeg : sttd_llogiic_vvecttor(15 DOWWNTOO 0);-分频计计数器,分分频值由由波特率率决定。分分频后得得到频率率8倍波波特率的的时钟 SSIGNNAL divv8_ttrass_reeg : sttd_llogiic_vvecttor(2 DDOWNNTO 0);-该该寄存器器的计数数值对应应发送时时当前位位于的时时隙数 SSIGNNAL divv8_rrec_regg : sttd_llogiic_vvect
5、tor(2 DDOWNNTO 0); -寄存存器的计计数值对对应接收收时当前前位于的的时隙数数 SSIGNNAL staate_traas : sttd_llogiic_vvecttor(3 DDOWNNTO 0); - 发发送状态态寄存器器 SSIGNNAL staate_recc : sttd_llogiic_vvecttor(3 DDOWNNTO 0); - 接受受状态寄寄存器 SSIGNNAL clkkbauud_ttrass : sttd_llogiic; -以以波特率率为频率率的发送送使能信信号 SSIGNNAL clkkbauud_rrec : sttd_llogiic; -以以
6、波特率率为频率率的接受受使能信信号 SSIGNNAL clkkbauud8xx : sttd_llogiic; -以以8倍波波特率为为频率的的时钟,它它的作用用是将发发送或接接受一个个bitt的时钟钟周期分分为8个个时隙 SSIGNNAL reccstaart : sttd_llogiic; - 开始发发送标志志 SSIGNNAL reccstaart_tmpp : sttd_llogiic; -开开始接受受标志 SSIGNNAL traassttartt : sttd_llogiic; SSIGNNAL rxdd_reeg1 : sttd_llogiic; -接接收寄存存器1 SSIGNNA
7、L rxdd_reeg2 : sttd_llogiic; -接接收寄存存器2,因因为接收收数据为为异步信信号,故故用两级级缓存 SSIGNNAL txdd_reeg : sttd_llogiic; -发发送寄存存器 SSIGNNAL rxdd_buuf : sttd_llogiic_vvecttor(7 DDOWNNTO 0);-接接受数据据缓存 SSIGNNAL txdd_buuf : sttd_llogiic_vvecttor(7 DDOWNNTO 0);-发发送数据据缓存 SSIGNNAL sennd_sstatte : sttd_llogiic_vvecttor(2 DDOWNNTO
8、0);-每每次按键键给PCC发送Wellcomme字字符串,这这是发送送状态寄寄存器 SSIGNNAL cntt_deelayy : sttd_llogiic_vvecttor(19 DOWWNTOO 0);-延时去去抖计数数器 SSIGNNAL staart_dellayccnt : sttd_llogiic; -开始延延时计数数标志 SSIGNNAL keyy_enntryy1 : sttd_llogiic; -确定有有键按下下曛? SSIGNNAL keyy_enntryy2 : sttd_llogiic; -确定有有键按下下标志 -/ CCONSSTANNT divv_paar : s
9、ttd_llogiic_vvecttor(15 DOWWNTOO 0) := 0000000000100000001000; -分频频参数,其其值由对对应的波波特率计计算而得得,按此此参数分分频的时时钟频率率是波倍倍特率的的8倍,此此处值对对应96600的的波特率率,即分分频出的的时钟频频率是996000*8 SSIGNNAL txdd_xhhdl33 : sttd_llogiic; BEGIIN een =00101101001 ;-7段数数码管使使能信号号赋值 ttxd = txdd_xhhdl33; ttxd_xhddl3 = txdd_reeg ; PPROCCESSS(cllk,rr
10、st) BBEGIIN IIF (NOTT rsst = 11) THEEN ccnt_dellay = 000000000000000000000000000; sstarrt_ddelaaycnnt = 0; EELSIIF(cclkEVEENT ANDD cllk=1)THEEN IIF (staart_dellayccnt = 1) THHEN IIF (cntt_deelayy /= 111000001110110100000000000) THHEN ccnt_dellay = cntt_deelayy + 000000000000000000000000011; EELSEE c
11、cnt_dellay = 000000000000000000000000000; sstarrt_ddelaaycnnt = 0; EEND IF; EELSEE IIF (NOOT kkey_inpput=1) AAND (cnnt_ddelaay = 000000000000000000000000000) TTHENN sstarrt_ddelaaycnnt = 1; EEND IF; EEND IF; EEND IF; EEND PROOCESSS; PPROCCESSS(cllk,rrst) BBEGIIN IIF (NOTT rsst = 11) THEEN kkey_enttr
12、y11 = 00; EELSIIF(cclkEVEENT ANDD cllk=1)THEEN IIF (keyy_enntryy2 = 11) THEEN kkey_enttry11 = 00; EELSEE IIF (cntt_deelayy = 111000001110100100000000000) THEEN IIF (NOTT keey_iinpuut = 11) THEEN kkey_enttry11 = 11; EEND IF; EEND IF; EEND IF; EEND IF; EEND PROOCESSS; PPROCCESSS(cllk,rrst) BBEGIIN IIF
13、 (NOTT rsst = 11) THEEN ddiv_regg = 0000000000000000000000; EELSIIF(cclkEVEENT ANDD cllk=1)THEEN IIF (divv_reeg = diiv_ppar - 000000000000000000001) THHEN ddiv_regg = 0000000000000000000000; EELSEE ddiv_regg = diiv_rreg + 000000000000000000001; EEND IF; EEND IF; EEND PROOCESSS; PPROCCESSS(cllk,rrst)
14、 -分频频得到88倍波特特率的时时钟 BBEGIIN IIF (NOTT rsst = 11) THEEN cclkbbaudd8x = 0; EELSIIF(cclkEVEENT ANDD cllk=1)THEEN IIF (divv_reeg = diiv_ppar - 000000000000000000001) THHEN cclkbbaudd8x = NOTT cllkbaaud88x; EEND IF; EEND IF; EEND PROOCESSS; PPROCCESSS(cllkbaaud88x,rrst) BBEGIIN IIF (NOTT rsst = 11) THEEN
15、ddiv88_reec_rreg = 0000; EELSEE IFF(cllkbaaud88xEEVENNT AAND clkkbauud8xx = 1) TTHENN IIF (reccstaart = 1) THHEN -接收开开始标志志 ddiv88_reec_rreg = divv8_rrec_regg + 0001;-接接收开始始后,时时隙数在在8倍波波特率的的时钟下下加1循循环 EEND IF; ENDD IFF; EEND IF; EEND PROOCESSS; PPROCCESSS(cllkbaaud88x,rrst) BBEGIIN IIF (NOTT rsst = 11)
16、 THEEN ddiv88_trras_regg = 0000; EELSEE IFF(cllkbaaud88xEEVENNT AAND clkkbauud8xx = 1) TTHENN IIF (traassttartt = 1) TTHENN ddiv88_trras_regg = diiv8_traas_rreg + 0011;-发送送开始后后,时隙隙数在88倍波特特率的时时钟下加加1循环环 EEND IF; ENDD IFF; EEND IF; EEND PROOCESSS; PPROCCESSS(diiv8_recc_reeg) BBEGIIN IIF (divv8_rrec_reg
17、g = 1111) THHEN cclkbbaudd_reec = 1; -在第第7个时时隙,接接收鼓苄苄藕庞行行荽蛉? EELSEE cclkbbaudd_reec = 0; EEND IF; EEND PROOCESSS; PPROCCESSS(diiv8_traas_rreg) BBEGIIN IIF (divv8_ttrass_reeg = 1111) TTHENN cclkbbaudd_trras = 1; -在在第7个个时隙,发发送使能能信号有有效,将将数据发发出 EELSEE cclkbbaudd_trras = 0; EEND IF; EEND PROOCESSS; PPROC
18、CESSS(cllkbaaud88x,rrst) BBEGIIN IIF (NOTT rsst = 11) THEEN ttxd_regg = 11; ttrassstaart = 0; ttxd_buff = 00000000000; sstatte_ttrass = 000000; ssendd_sttatee = 0000; kkey_enttry22 = 00; EELSEE IFF(cllkbaaud88xEEVENNT AAND clkkbauud8xx = 1) TTHENN IIF (NOTT keey_eentrry2 = 1) THHEN IIF (keyy_enntryy
19、1 = 11) THEEN kkey_enttry22 = 11; ttxd_buff -发发送起始始位 IIF (NOOT ttrassstaart=1) AAND (seend_staate 1111) ) TTHENN ttrassstaart = 1; EELSEE IIF (sennd_sstatte 1111) TTHENN IIF (clkkbauud_ttrass = 1) TTHENN ttxd_regg = 00; sstatte_ttrass = sttatee_trras + 00001; EEND IF; EELSEE kkey_enttry22 = 00; ssta
20、tte_ttrass -发送送第1位位 IIF (clkkbauud_ttrass = 1) TTHENN ttxd_regg = txxd_bbuf(0); ttxd_buff(6 DOWWNTOO 0) = txxd_bbuf(7 DDOWNNTO 1); sstatte_ttrass -发发送第22位 IIF (clkkbauud_ttrass = 1) TTHENN ttxd_regg = txxd_bbuf(0); ttxd_buff(6 DOWWNTOO 0) = txxd_bbuf(7 DDOWNNTO 1); staate_traas -发发送第33位 IIF (clkkbau
21、ud_ttrass = 1) TTHENN ttxd_regg = txxd_bbuf(0); txdd_buuf(66 DOOWNTTO 00) = ttxd_buff(7 DOWWNTOO 1); sstatte_ttrass -发送送第4位位 IIF (clkkbauud_ttrass = 1) TTHENN ttxd_regg = txxd_bbuf(0); ttxd_buff(6 DOWWNTOO 0) = txxd_bbuf(7 DDOWNNTO 1); sstatte_ttrass -发送送第5位位 IIF (clkkbauud_ttrass = 1) TTHENN ttxd_r
22、egg = txxd_bbuf(0); ttxd_buff(6 DOWWNTOO 0) = txxd_bbuf(7 DDOWNNTO 1); sstatte_ttrass -发送送第6位位 IIF (clkkbauud_ttrass = 1) TTHENN ttxd_regg = txxd_bbuf(0); ttxd_buff(6 DOWWNTOO 0) = txxd_bbuf(7 DDOWNNTO 1); sstatte_ttrass -发送送第7位位 IIF (clkkbauud_ttrass = 1) TTHENN ttxd_regg = txxd_bbuf(0); ttxd_buff(
23、6 DOWWNTOO 0) = txxd_bbuf(7 DDOWNNTO 1); sstatte_ttrass -发发送第88位 IIF (clkkbauud_ttrass = 1) TTHENN ttxd_regg = txxd_bbuf(0); ttxd_buff(6 DOWWNTOO 0) = txxd_bbuf(7 DDOWNNTO 1); sstatte_ttrass -发发送停止止位 IIF (clkkbauud_ttrass = 1) TTHENN ttxd_regg = 11; ttxd_buff = 00101101001; sstatte_ttrass IIF (clkkbauud_ttrass = 1) TTHENN sstatte_ttrass = sttatee_trras + 00001; ssendd_sttatee = seend_staate + 0011; ttrassstaart ttxd_buff ttxd_buff ttxd_buff ttxd_buff ttxd_buff ttxd_buff ttxd_buff IIF (clkkbauud_ttrass = 1) TTHENN sstatte_ttrass = sttatee_trras + 0000
限制150内