




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、EDA课程设计题目:串口控制器设计 班级: 姓名: 学号: 一:串口简介串口是可以在使用一根线发送数据的同时用另一根线接收数据。串口通信协议也可以用于获取远程采集设备的数据。通过RS232以实现计算机之间、计算机与设备之间相互通信,目前仍是通讯领域广泛使用的方法之一。几乎每台计算机都有一两个串行接口,用来与调制解调器、实验室设备、工控设备、POS终端等进行数据传输。RS-232以其方便、经济的实现特点,一直深受工程界的青睐。不论是在电力、工控还是电信、金融交通等诸多行业都有广泛的应用。系统主芯片采用RS-232串口通信控制器,由基本时钟发生电路模块,复位电路模块,波特率选择模块,数据帧格式选择
2、模块,串并转换模块组成。经编译和仿真所设计的程序,在可编程逻辑器件上下载验证,结合FPGA技术高度灵活性与模块化的特点,实现基本RS-232总线通信的功能,以实现串口数据帧结构选择,串并转换,波特率选择等功能。通过软件仿真,得到功能的验证,并进行功能逻辑模块的整合,从而验证设计的可行性与可靠性。本模块的功能是验证实现和PC机进行基本的串口通信的功能。需要在PC机上安装一个串口调试工具来验证程序的功能。程序实现了一个收发一帧10个bit(即无奇偶校验位)的串口控制器,10个bit是1位起始位,8个数据位,1个结束位。串口的波特率由程序中定义的div_par参数决定,更改该参数可以实现相应的波特率
3、。程序当前设定的div_par 的值是0x104,对应的波特率是9600。用一个8倍波特率的时钟将发送或接受每一位bit的周期时间划分为8个时隙以使通信同步.程序的工作过程是:串口处于全双工工作状态,按动SW0,FPGA向PC发送“welcome"字符串(串口调试工具设成按ASCII码接受方式);PC可随时向FPGA发送0-F的十六进制数据,FPGA接受后显示在7段数码管上。二:设计方案。1:接收模块设计串口接收模块针对于接收串行数据进行协议包的解析,实现串行数据输入,并行数据输出的功能,从接收判断的角度,实现了对于串口协议的解析功能。2: 发送模块设计串口发送模块针对于接收并行数据
4、进行协议的组包设计,实现并行数据输入,串行数据输出的功能,从发送的角度,实现了对于串口协议的组合功能。发送模块设计与接收模块类似,依然针对波特率,数据位,校验位,停止位进行控制,实现全双向的串口通信控制功能。三:电路原理图四:软件流程五:实验源程序library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY UART IS PORT ( clk : IN std_logic; rst : IN std_logic; rxd : IN st
5、d_logic; txd : OUT std_logic; en : OUT std_logic_vector(7 downto 0); seg_data : OUT std_logic_vector(7 DOWNTO 0); key_input : IN std_logic ); END UART;ARCHITECTURE arch OF UART IS - /inner reg/ SIGNAL div_reg : std_logic_vector(15 DOWNTO 0); SIGNAL div8_tras_reg : std_logic_vector(2 DOWNTO 0); SIGNA
6、L div8_rec_reg : std_logic_vector(2 DOWNTO 0); SIGNAL state_tras : std_logic_vector(3 DOWNTO 0); SIGNAL state_rec : std_logic_vector(3 DOWNTO 0); SIGNAL clkbaud_tras : std_logic; SIGNAL clkbaud_rec : std_logic; SIGNAL clkbaud8x : std_logic; SIGNAL recstart : std_logic; SIGNAL recstart_tmp : std_logi
7、c; SIGNAL trasstart : std_logic; SIGNAL rxd_reg1 : std_logic; SIGNAL rxd_reg2 : std_logic; SIGNAL txd_reg : std_logic; SIGNAL rxd_buf : std_logic_vector(7 DOWNTO 0); SIGNAL txd_buf : std_logic_vector(7 DOWNTO 0); SIGNAL send_state : std_logic_vector(2 DOWNTO 0);- SIGNAL cnt_delay : std_logic_vector(
8、19 DOWNTO 0);- SIGNAL start_delaycnt : std_logic; SIGNAL key_entry1 : std_logic; SIGNAL key_entry2 : std_logic; -/ CONSTANT div_par : std_logic_vector(15 DOWNTO 0) := "0000000100000100" SIGNAL txd_xhdl3 : std_logic; BEGIN en <="01010101" ;- txd <= txd_xhdl3; txd_xhdl3 <=
9、 txd_reg ; PROCESS(clk,rst) BEGIN IF (NOT rst = 1) THEN cnt_delay <= "00000000000000000000" start_delaycnt <= 0; ELSIF(clkEVENT AND clk=1)THEN IF (start_delaycnt = 1) THEN IF (cnt_delay /= "11000011010100000000") THEN cnt_delay <= cnt_delay + "00000000000000000001&q
10、uot; ELSE cnt_delay <= "00000000000000000000" start_delaycnt <= 0; END IF; ELSE IF (NOT key_input=1) AND (cnt_delay = "00000000000000000000") THEN start_delaycnt <= 1; END IF; END IF; END IF; END PROCESS; PROCESS(clk,rst) BEGIN IF (NOT rst = 1) THEN key_entry1 <= 0; E
11、LSIF(clkEVENT AND clk=1)THEN IF (key_entry2 = 1) THEN key_entry1 <= 0; ELSE IF (cnt_delay = "11000011010100000000") THEN IF (NOT key_input = 1) THEN key_entry1 <= 1; END IF; END IF; END IF; END IF; END PROCESS; PROCESS(clk,rst) BEGIN IF (NOT rst = 1) THEN div_reg <= "00000000
12、00000000" ELSIF(clkEVENT AND clk=1)THEN IF (div_reg = div_par - "0000000000000001") THEN div_reg <= "0000000000000000" ELSE div_reg <= div_reg + "0000000000000001" END IF; END IF; END PROCESS; PROCESS(clk,rst) BEGIN IF (NOT rst = 1) THEN clkbaud8x <= 0; EL
13、SIF(clkEVENT AND clk=1)THEN IF (div_reg = div_par - "0000000000000001") THEN clkbaud8x <= NOT clkbaud8x; END IF; END IF; END PROCESS; PROCESS(clkbaud8x,rst) BEGIN IF (NOT rst = 1) THEN div8_rec_reg <= "000" ELSE IF(clkbaud8xEVENT AND clkbaud8x = 1) THEN IF (recstart = 1) TH
14、EN div8_rec_reg <= div8_rec_reg + "001" END IF; END IF; END IF; END PROCESS; PROCESS(clkbaud8x,rst) BEGIN IF (NOT rst = 1) THEN div8_tras_reg <= "000" ELSE IF(clkbaud8xEVENT AND clkbaud8x = 1) THEN IF (trasstart = 1) THEN div8_tras_reg <= div8_tras_reg + "001"-
15、 END IF; END IF; END IF; END PROCESS; PROCESS(div8_rec_reg) BEGIN IF (div8_rec_reg = "111") THEN clkbaud_rec <= 1; ELSE clkbaud_rec <= 0; END IF; END PROCESS; PROCESS(div8_tras_reg) BEGIN IF (div8_tras_reg = "111") THEN clkbaud_tras <= 1; ELSE clkbaud_tras <= 0; END I
16、F; END PROCESS; PROCESS(clkbaud8x,rst) BEGIN IF (NOT rst = 1) THEN txd_reg <= 1; trasstart <= 0; txd_buf <= "00000000" state_tras <= "0000" send_state <= "000" key_entry2 <= 0; ELSE IF(clkbaud8xEVENT AND clkbaud8x = 1) THEN IF (NOT key_entry2 = 1) THEN
17、 IF (key_entry1 = 1) THEN key_entry2 <= 1; txd_buf <= "01110111" -"w" END IF; ELSE CASE state_tras IS WHEN "0000" => IF (NOT trasstart=1) AND (send_state < "111") ) THEN trasstart <= 1; ELSE IF (send_state < "111") THEN IF (clkbaud_
18、tras = 1) THEN txd_reg <= 0; state_tras <= state_tras + "0001" END IF; ELSE key_entry2 <= 0; state_tras <= "0000" END IF; END IF; WHEN "0001" => - IF (clkbaud_tras = 1) THEN txd_reg <= txd_buf(0); txd_buf(6 DOWNTO 0) <= txd_buf(7 DOWNTO 1); state_tr
19、as <= state_tras + "0001" END IF; WHEN "0010" => IF (clkbaud_tras = 1) THEN txd_reg <= txd_buf(0); txd_buf(6 DOWNTO 0) <= txd_buf(7 DOWNTO 1); state_tras <= state_tras + "0001" END IF; WHEN "0011" => IF (clkbaud_tras = 1) THEN txd_reg <= t
20、xd_buf(0); txd_buf(6 DOWNTO 0) <= txd_buf(7 DOWNTO 1); state_tras <= state_tras + "0001" END IF; WHEN "0100" => IF (clkbaud_tras = 1) THEN txd_reg <= txd_buf(0); txd_buf(6 DOWNTO 0) <= txd_buf(7 DOWNTO 1); state_tras <= state_tras + "0001" END IF; WHEN
21、 "0101" => IF (clkbaud_tras = 1) THEN txd_reg <= txd_buf(0); txd_buf(6 DOWNTO 0) <= txd_buf(7 DOWNTO 1); state_tras <= state_tras + "0001" END IF; WHEN "0110" => IF (clkbaud_tras = 1) THEN txd_reg <= txd_buf(0); txd_buf(6 DOWNTO 0) <= txd_buf(7 DOWN
22、TO 1); state_tras <= state_tras + "0001" END IF; WHEN "0111" => IF (clkbaud_tras = 1) THEN txd_reg <= txd_buf(0); txd_buf(6 DOWNTO 0) <= txd_buf(7 DOWNTO 1); state_tras <= state_tras + "0001" END IF; WHEN "1000" => IF (clkbaud_tras = 1) THEN
23、txd_reg <= txd_buf(0); txd_buf(6 DOWNTO 0) <= txd_buf(7 DOWNTO 1); state_tras <= state_tras + "0001" END IF; WHEN "1001" => IF (clkbaud_tras = 1) THEN txd_reg <= 1; txd_buf <= "01010101" state_tras <= state_tras + "0001" END IF; WHEN "
24、;1111" => IF (clkbaud_tras = 1) THEN state_tras <= state_tras + "0001" send_state <= send_state + "001" trasstart <= 0; CASE send_state IS WHEN "000" => txd_buf <= "01100101" -"e" WHEN "001" => txd_buf <= "
25、01101100"- "l" WHEN "010" => txd_buf <= "01100011" -"c" WHEN "011" => txd_buf <= "01101111"- "o" WHEN "100" => txd_buf <= "01101101" - "m" WHEN "101" => txd_buf <
26、;= "01100101"- "e" WHEN OTHERS => txd_buf <= "00000000" END CASE; END IF; WHEN OTHERS => IF (clkbaud_tras = 1) THEN state_tras <= state_tras + "0001" trasstart <= 1; END IF; END CASE; END IF; END IF; END IF; END PROCESS; PROCESS(clkbaud8x,rst) B
27、EGIN IF (NOT rst = 1) THEN rxd_reg1 <= 0; rxd_reg2 <= 0; rxd_buf <= "00000000" state_rec <= "0000" recstart <= 0; recstart_tmp <= 0; ELSE IF(clkbaud8xEVENT AND clkbaud8x = 1) THEN rxd_reg1 <= rxd; rxd_reg2 <= rxd_reg1; IF (state_rec = "0000") THE
28、N IF (recstart_tmp = 1) THEN recstart <= 1; recstart_tmp <= 0; state_rec <= state_rec + "0001" ELSE IF (NOT rxd_reg1 AND rxd_reg2) = 1) THEN recstart_tmp <= 1; END IF; END IF; ELSE IF (state_rec >= "0001" AND state_rec<="1000") THEN IF (clkbaud_rec = 1
29、) THEN rxd_buf(7) <= rxd_reg2; rxd_buf(6 DOWNTO 0) <= rxd_buf(7 DOWNTO 1); state_rec <= state_rec + "0001" END IF; ELSE IF (state_rec = "1001") THEN IF (clkbaud_rec = 1) THEN state_rec <= "0000" recstart <= 0; END IF; END IF; END IF; END IF; END IF; END I
30、F; END PROCESS; PROCESS(rxd_buf) BEGIN CASE rxd_buf IS WHEN "00110000" => seg_data <= "10101111"- 0 WHEN "00110001" => seg_data <= "10100000"- 1 WHEN "00110010" => seg_data <= "11000111"- 2 WHEN "00110011" =>
31、seg_data <= "11100101" -3 WHEN "00110100" => seg_data <= "11101000" -4 WHEN "00110101" => seg_data <= "01101101"- 5 WHEN "00110110" => seg_data <= "01101111" -6 WHEN "00110111" => seg_data <= &
32、quot;10100001" -7 WHEN "00111000" => seg_data <= "11101111"- 8 WHEN "00111001" => seg_data <= "11101101"- 9 WHEN "01000001" => seg_data <= "11101011" -A WHEN "01000010" => seg_data <= "01101110"- B WHEN
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 蒸压矿渣砖企业制定与实施新质生产力战略研究报告
- 金属护板行业直播电商战略研究报告
- 做餐饮合伙合同标准文本
- 输变电线路绝缘瓷套管企业制定与实施新质生产力战略研究报告
- 2025年-甘肃省建筑安全员知识题库附答案
- 兄弟合作养猪合同样本
- 体育合作合同样本
- 别墅弱电合同样本
- 冲压模具标准合同标准文本
- epc总承合同标准文本
- 2025年营口职业技术学院高职单招(数学)历年真题考点含答案解析
- 江西省八所重点2025届高三下学期4月联考(二模)政治试卷(含答案)
- 2025年03月福建省气象局事业单位笔试历年典型考题(历年真题考点)解题思路附带答案详解
- 2025年青藏铁路集团有限公司招聘(184人)笔试参考题库附带答案详解
- 中国钓鱼行业发展监测及投资战略规划研究报告
- 2025资阳辅警考试题库
- 2025年上海嘉定区江桥镇企业服务有限公司招聘笔试参考题库附带答案详解
- 第一篇 专题三 计算题培优3 带电粒子在交变场和立体空间中的运动-2025高考物理二轮复习
- 学校保洁方案
- 2025年高考语文二轮复习策略讲座
- T-SCSF 0004-2020 海洋牧场海藻场建设技术规范
评论
0/150
提交评论