《异步串行通信的实现包含源程序.docxVIP

《异步串行通信的实现包含源程序.docx

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《异步串行通信的实现包含源程序

1、基本知识:1、-- 异步串行通信数据帧格式如下:起始位为 ‘0’,停止位为1-2位‘1’;奇偶校验位为可选 ,数据为5-8位可选。2、波特率指的是每秒钟发送的字符(一位数据位)的个数,1B=1b/s。如波特率为9600B,那么发送一个数据位所需要的时间为1/9600 s; 发送/接收时钟的频率与波特率的关系为: 发送/接收时钟的频率 = n x发送/接收波特率。其中n = 1 、16、64;我们在这里取n = 16 ;即对每一位数据都采样16次。2、功能实现-- 本模块的功能是验证实现和PC机进行基本的串口通信的功能。需要在PC机上安装一个串口调试工具来验证程序的功能。程序实现了一个收发一帧10个bit(即无奇偶校验位)的串口控制器,10个bit是1位起始位,8个数据位,1个结束位。程序分为三个模块:时钟分频模块,接收数据模块,发送数据模块。具体程序代码为:library IEEE;use IEEE.STD_LOGIC_1164.ALL;-- Uncomment the following library declaration if using-- arithmetic functions with Signed or Unsigned values--use IEEE.NUMERIC_STD.ALL;-- Uncomment the following library declaration if instantiating-- any Xilinx primitives in this code.--library UNISIM;--use UNISIM.VComponents.all;entity uart is port( CLK50M : in std_logic; reset : in std_logic; uart_tx : out std_logic; uart_rx : in std_logic );end uart;architecture Behavioral of uart is signal div_clk50M :std_logic; ----分频后的时钟信号signal rx_data : std_logic_vector(7 downto 0); --- 接收数据缓存signal tx_data : std_logic_vector(7 downto 0); ----发送数据缓存signal data_buf: std_logic_vector(7 downto 0); --- 接收数据存储type state_rx is (rx_idle,rx_start,rx_sample,rx_stop); ---接收状态机signal rx_state : state_rx := rx_idle; type state_tx is (tx_idle,tx_start,tx_send,tx_stop); --发送状态机signal tx_state : state_tx := tx_idle;signal send_enable : std_logic :=0;begin--- --------CLK_Div module---------------------Bauds = 9600B clk=50M division factor = 50M/(9600x16)=325--------------------------------------------- CLK_DIV: process(CLK50M,reset) variable div_count : integer :=0; -----分频系数变量 begin if(reset=1) then div_clk50M =0; div_count :=0; elsif(rising_edge(CLK50M)) then if div_count=325 then div_clk50M = 0; div_count :=0; elsif div_count=162 then div_count := div_count + 1; div_clk50M = 1; else div_count :=0; div_clk50M = 0;end if; end if; end process CLK_DIV; -----------------------------------------------------------DATA Receive module------------DATA_R : process(div_c

文档评论(0)

yingxiaorong28 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档