您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > 基于VHDL语言串口控制器课程设计
EDA课程设计题目:串口控制器设计班级:姓名:学号:一:串口简介串口是可以在使用一根线发送数据的同时用另一根线接收数据。串口通信协议也可以用于获取远程采集设备的数据。通过RS-232以实现计算机之间、计算机与设备之间相互通信,目前仍是通讯领域广泛使用的方法之一。几乎每台计算机都有一两个串行接口,用来与调制解调器、实验室设备、工控设备、POS终端等进行数据传输。RS-232以其方便、经济的实现特点,一直深受工程界的青睐。不论是在电力、工控还是电信、金融交通等诸多行业都有广泛的应用。系统主芯片采用RS-232串口通信控制器,由基本时钟发生电路模块,复位电路模块,波特率选择模块,数据帧格式选择模块,串并转换模块组成。经编译和仿真所设计的程序,在可编程逻辑器件上下载验证,结合FPGA技术高度灵活性与模块化的特点,实现基本RS-232总线通信的功能,以实现串口数据帧结构选择,串并转换,波特率选择等功能。通过软件仿真,得到功能的验证,并进行功能逻辑模块的整合,从而验证设计的可行性与可靠性。本模块的功能是验证实现和PC机进行基本的串口通信的功能。需要在PC机上安装一个串口调试工具来验证程序的功能。程序实现了一个收发一帧10个bit(即无奇偶校验位)的串口控制器,10个bit是1位起始位,8个数据位,1个结束位。串口的波特率由程序中定义的div_par参数决定,更改该参数可以实现相应的波特率。程序当前设定的div_par的值是0x104,对应的波特率是9600。用一个8倍波特率的时钟将发送或接受每一位bit的周期时间划分为8个时隙以使通信同步.程序的工作过程是:串口处于全双工工作状态,按动SW0,FPGA向PC发送“welcome字符串(串口调试工具设成按ASCII码接受方式);PC可随时向FPGA发送0-F的十六进制数据,FPGA接受后显示在7段数码管上。二:设计方案。1:接收模块设计串口接收模块针对于接收串行数据进行协议包的解析,实现串行数据输入,并行数据输出的功能,从接收判断的角度,实现了对于串口协议的解析功能。2:发送模块设计串口发送模块针对于接收并行数据进行协议的组包设计,实现并行数据输入,串行数据输出的功能,从发送的角度,实现了对于串口协议的组合功能。发送模块设计与接收模块类似,依然针对波特率,数据位,校验位,停止位进行控制,实现全双向的串口通信控制功能。三:电路原理图四:软件流程五:实验源程序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);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;SIGNALrecstart:std_logic;SIGNALrecstart_tmp:std_logic;SIGNALtrasstart:std_logic;SIGNALrxd_reg1:std_logic;SIGNALrxd_reg2:std_logic;SIGNALtxd_reg:std_logic;SIGNALrxd_buf:std_logic_vector(7DOWNTO0);SIGNALtxd_buf:std_logic_vector(7DOWNTO0);SIGNALsend_state:std_logic_vector(2DOWNTO0);-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;SIGNALtxd_xhdl3:std_logic;BEGINen=01010101;-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)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’)THENdiv8_rec_reg=div8_rec_reg+001;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;-ENDIF;ENDIF;ENDIF;ENDPROCESS;PROCESS(div8_rec_reg)BEGINIF(div8_rec_reg=111)THENclkbaud_rec=’1’;ELSEclkbaud_rec=’0’;ENDIF;ENDPROCESS;PROCESS(div8_tras_reg)BEGINIF(div8_tras_reg=111)THENclkbaud_tras=’1’;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=-IF(clkbaud_tras=’1’)THENtxd_reg=txd_buf(0);txd_buf(6DOWNTO0)=txd_buf(7DOWNTO1);state_tras=state_tras+0001;ENDIF;WHEN0010=IF(clkbaud_tras=’1’)THENtxd_reg=txd_buf(0);txd_buf(6DOWNTO0)=txd_buf(7DOWNTO1);state_tras=state_tras+0001;ENDIF;WHEN0011=IF(clkbaud_tras=’1’)THENtxd_reg=txd_buf(0);txd_buf(6DOWNTO0)=txd_buf(7DOWNTO1);state_tras=state_tras+0001;ENDIF;WHEN0100=IF(clkbaud_tras=’1’)THENtxd_reg=txd_buf(0);txd_buf(6DOWNTO0)=txd_buf(7DOWNTO1);state_tras=state_tras+0001;ENDIF;WHEN0101=IF(clkbaud_tras=’1’)THENtxd_reg=txd_buf(0);txd_buf(6DOWNTO0)=txd_buf(7DOWNTO1
本文标题:基于VHDL语言串口控制器课程设计
链接地址:https://www.777doc.com/doc-2535273 .html