----本模块的功能是验证实现和PC机进行基本的串口通信的功能。需要在--PC机上安装一个串口调试工具来验证程序的功能。--程序实现了一个收发一帧10个bit(即无奇偶校验位)的串口控--制器,10个bit是1位起始位,8个数据位,1个结束--位。串口的波特律由程序中定义的div_par参数决定,更改该参数可以实--现相应的波特率。程序当前设定的div_par的值是0x104,对应的波特率是--9600。用一个8倍波特率的时钟将发送或接受每一位bit的周期时间--划分为8个时隙以使通信同步.--程序的工作过程是:串口处于全双工工作状态,按动key2,CPLD向PC发送皐elcome--字符串(串口调试工具设成按ASCII码接受方式);PC可随时向CPLD发送0-F的十六进制--数据,CPLD接受后显示在7段数码管上。libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYUARTISPORT(clk:INstd_logic;rst:INstd_logic;rxd:INstd_logic;--串行数据接收端txd:OUTstd_logic;--串行数据发送端en:OUTstd_logic_vector(7downto0);--数码管使能seg_data:OUTstd_logic_vector(7DOWNTO0);--数码管数据key_input:INstd_logic--按键输入);ENDUART;ARCHITECTUREarchOFUARTIS--//////////////////innerreg////////////////////SIGNALdiv_reg:std_logic_vector(15DOWNTO0);--分频计数器,分频值由波特率决定。分频后得到频率8倍波特率的时钟SIGNALdiv8_tras_reg:std_logic_vector(2DOWNTO0);--该寄存器的计数值对应发送时当前位于的时隙数SIGNALdiv8_rec_reg:std_logic_vector(2DOWNTO0);--寄存器的计数值对应接收时当前位于的时隙数SIGNALstate_tras:std_logic_vector(3DOWNTO0);--发送状态寄存器SIGNALstate_rec:std_logic_vector(3DOWNTO0);--接受状态寄存器SIGNALclkbaud_tras:std_logic;--以波特率为频率的发送使能信号SIGNALclkbaud_rec:std_logic;--以波特率为频率的接受使能信号SIGNALclkbaud8x:std_logic;--以8倍波特率为频率的时钟,它的作用是将发送或接受一个bit的时钟周期分为8个时隙SIGNALrecstart:std_logic;--开始发送标志SIGNALrecstart_tmp:std_logic;--开始接受标志SIGNALtrasstart:std_logic;SIGNALrxd_reg1:std_logic;--接收寄存器1SIGNALrxd_reg2:std_logic;--接收寄存器2,因为接收数据为异步信号,故用两级缓存SIGNALtxd_reg:std_logic;--发送寄存器SIGNALrxd_buf:std_logic_vector(7DOWNTO0);--接受数据缓存SIGNALtxd_buf:std_logic_vector(7DOWNTO0);--发送数据缓存SIGNALsend_state:std_logic_vector(2DOWNTO0);--每次按键给PC发送Welcome字符串,这是发送状态寄存器SIGNALcnt_delay:std_logic_vector(19DOWNTO0);--延时去抖计数器SIGNALstart_delaycnt:std_logic;--开始延时计数标志SIGNALkey_entry1:std_logic;--确定有键按下曛?SIGNALkey_entry2:std_logic;--确定有键按下标志--//////////////////////////////////////////////CONSTANTdiv_par:std_logic_vector(15DOWNTO0):=0000000100000100;--分频参数,其值由对应的波特率计算而得,按此参数分频的时钟频率是波倍特率的8倍,此处值对应9600的波特率,即分频出的时钟频率是9600*8SIGNALtxd_xhdl3:std_logic;BEGINen=01010101;--7段数码管使能信号赋值txd=txd_xhdl3;txd_xhdl3=txd_reg;PROCESS(clk,rst)BEGINIF(NOTrst='1')THENcnt_delay=00000000000000000000;start_delaycnt='0';ELSIF(clk'EVENTANDclk='1')THENIF(start_delaycnt='1')THENIF(cnt_delay/=11000011010100000000)THENcnt_delay=cnt_delay+00000000000000000001;ELSEcnt_delay=00000000000000000000;start_delaycnt='0';ENDIF;ELSEIF((NOTkey_input='1')AND(cnt_delay=00000000000000000000))THENstart_delaycnt='1';ENDIF;ENDIF;ENDIF;ENDPROCESS;PROCESS(clk,rst)BEGINIF(NOTrst='1')THENkey_entry1='0';ELSIF(clk'EVENTANDclk='1')THENIF(key_entry2='1')THENkey_entry1='0';ELSEIF(cnt_delay=11000011010100000000)THENIF(NOTkey_input='1')THENkey_entry1='1';ENDIF;ENDIF;ENDIF;ENDIF;ENDPROCESS;PROCESS(clk,rst)BEGINIF(NOTrst='1')THENdiv_reg=0000000000000000;ELSIF(clk'EVENTANDclk='1')THENIF(div_reg=div_par-0000000000000001)THENdiv_reg=0000000000000000;ELSEdiv_reg=div_reg+0000000000000001;ENDIF;ENDIF;ENDPROCESS;PROCESS(clk,rst)--分频得到8倍波特率的时钟BEGINIF(NOTrst='1')THENclkbaud8x='0';ELSIF(clk'EVENTANDclk='1')THENIF(div_reg=div_par-0000000000000001)THENclkbaud8x=NOTclkbaud8x;ENDIF;ENDIF;ENDPROCESS;PROCESS(clkbaud8x,rst)BEGINIF(NOTrst='1')THENdiv8_rec_reg=000;ELSEIF(clkbaud8x'EVENTANDclkbaud8x='1')THENIF(recstart='1')THEN--接收开始标志div8_rec_reg=div8_rec_reg+001;--接收开始后,时隙数在8倍波特率的时钟下加1循环ENDIF;ENDIF;ENDIF;ENDPROCESS;PROCESS(clkbaud8x,rst)BEGINIF(NOTrst='1')THENdiv8_tras_reg=000;ELSEIF(clkbaud8x'EVENTANDclkbaud8x='1')THENIF(trasstart='1')THENdiv8_tras_reg=div8_tras_reg+001;--发送开始后,时隙数在8倍波特率的时钟下加1循环ENDIF;ENDIF;ENDIF;ENDPROCESS;PROCESS(div8_rec_reg)BEGINIF(div8_rec_reg=111)THENclkbaud_rec='1';---在第7个时隙,接收鼓苄藕庞行В?ELSEclkbaud_rec='0';ENDIF;ENDPROCESS;PROCESS(div8_tras_reg)BEGINIF(div8_tras_reg=111)THENclkbaud_tras='1';--在第7个时隙,发送使能信号有效,将数据发出ELSEclkbaud_tras='0';ENDIF;ENDPROCESS;PROCESS(clkbaud8x,rst)BEGINIF(NOTrst='1')THENtxd_reg='1';trasstart='0';txd_buf=00000000;state_tras=0000;send_state=000;key_entry2='0';ELSEIF(clkbaud8x'EVENTANDclkbaud8x='1')THENIF(NOTkey_entry2='1')THENIF(key_entry1='1')THENkey_entry2='1';txd_buf=01110111;--wENDIF;ELSECASEstate_trasISWHEN0000=--发送起始位IF((NOTtrasstart='1')AND(send_state111))THENtrasstart='1';ELSEIF(send_state111)THENIF(clkbaud_tras='1')THENtxd_reg='0';state_tras=state_tras+0001;ENDIF;ELSEkey_entry2='0';state_tras=0000;ENDIF;ENDIF;WHEN0001=--发送第1位IF(clkbaud_tras='1')THENtxd_reg=txd_buf(0);txd_buf(6DOWNTO0)=txd_buf(7DOWNTO1);state_tras=state_tras+0001;ENDIF;WHEN0010=--发送第2位IF(clkbaud_tras='1')THENtxd_reg=txd_buf(0);txd_buf(6DOWNTO0)=txd_buf(7DOWNTO1);state_tras=state_tras+0001;ENDIF;WHEN0011=--发送第3位IF(clkbaud_tras='1')THENtxd_reg=txd_buf(0);txd_buf(6DOWNTO0)=txd_buf(7DOWNTO1);state_tras=state_tras+0001;ENDIF;WHEN0100=--发送第4位IF(clkbaud_tras='1')THENtxd_reg=txd_buf(0);txd_buf(6DOWNTO0)=txd_buf(7DOWNTO1);state_tras=state_tras+0001;ENDIF;WHEN0101=--发送第5位IF(clkbaud_tras='1')THENtxd_reg=txd_buf(0);txd_buf(6DOWNTO0)=txd_buf(7DOWNTO1);state_tras=state_tras+0001;ENDIF;WHEN0110=--发送第6位IF(clkbaud