如何使用RS-232发射器和接收器?

举报
李锐博恩 发表于 2021/07/15 03:30:23 2021/07/15
【摘要】 目录 前言 设计一 设计二(回环) 设计二(回环)测试 前言 前面讲到了波特率的产生,发射器以及接收器: RS232 波特率时钟产生方法? RS-232 Transmitter RS-232 Receiver 如何把这些模块链接起来,实现一些功能呢? 这篇博文就是干这个事情的。 参考链接:https://www.fpga4fun.com/Serial...

目录

前言

设计一

设计二(回环)

设计二(回环)测试


前言

前面讲到了波特率的产生,发射器以及接收器:

RS232 波特率时钟产生方法?

RS-232 Transmitter

RS-232 Receiver

如何把这些模块链接起来,实现一些功能呢?

这篇博文就是干这个事情的。

参考链接:https://www.fpga4fun.com/SerialInterface5.html

原文提供的思路已经很不错了。

我之前也写过一篇有发射器和接收器构成的一个RS232回环实验:

UART的回环实例


设计一

好了进入正题:

这种设计允许从PC控制一些FPGA引脚(通过PC的串行端口)。

它在FPGA上创建8个输出(名为“GPout”的端口)。 GPout由FPGA接收的任何字符更新。
FPGA上还有8个输入(名为“GPin”的端口)。 每次FPGA接收到字符时都会发送GPin。
GP输出可用于从PC远程控制任何东西,可能是LED或咖啡机......

给出Verilog描述:


  
  1. module serialGPIO(
  2. input clk,
  3. input RxD,
  4. output TxD,
  5. output reg [7:0] GPout, // general purpose outputs
  6. input [7:0] GPin // general purpose inputs
  7. );
  8. wire RxD_data_ready;
  9. wire TxD_busy;
  10. wire [7:0] RxD_data;
  11. asy_receiver RX(.clk(clk), .RxD(RxD), .RxD_data_ready(RxD_data_ready), .RxD_data(RxD_data));
  12. always @(posedge clk) if(RxD_data_ready) GPout <= RxD_data;
  13. asy_transmitter TX(.clk(clk), .TxD(TxD), .TxD_start(RxD_data_ready), .TxD_data(GPin), .TxD_busy(TxD_busy));
  14. endmodule

调用的模块代码就不在粘贴一遍了,去其他博文里面找。

这里给出RTL原理图,以便看出原理,以及这些模块是如何连接的:

从这幅原理图可以看出RX与TX之间的连接关系,RX接收外部的串行输入,当接收完毕后,RXD_data_ready有效,作为后面同步寄存器的使能,延迟一拍后,通过GPout输出。

同时TX模块接收一个8位数据GPin,开始发送信号也为RxD_data_ready,也就是说,当RX模块接收完数据后,Tx就开始发送GPin。


设计二(回环)

如果将RxD_data直接作为TX的输入,则形成一个RS232回环:


  
  1. module serialGPIO(
  2. input clk,
  3. input RxD,
  4. output TxD
  5. // output reg [7:0] GPout, // general purpose outputs
  6. // input [7:0] GPin // general purpose inputs
  7. );
  8. wire RxD_data_ready;
  9. wire TxD_busy;
  10. wire [7:0] RxD_data;
  11. asy_receiver RX(.clk(clk), .RxD(RxD), .RxD_data_ready(RxD_data_ready), .RxD_data(RxD_data));
  12. //always @(posedge clk) if(RxD_data_ready) GPout <= RxD_data;
  13. asy_transmitter TX(.clk(clk), .TxD(TxD), .TxD_start(RxD_data_ready), .TxD_data(RxD_data), .TxD_busy(TxD_busy));
  14. endmodule

RTL原理图为:


话说链接是连接了,但是能不能正常工作呢?

第一步,写个测试代码验证一下呗。

设计二(回环)测试

测试代码很简单,直接用之前的 RS232 Receiver 


  
  1. `timescale 1ns / 1ps
  2. module serialGPIO_tb(
  3. );
  4. reg clk;
  5. reg RxD;
  6. //wire RxD_data_ready;
  7. //wire [7 : 0] RxD_data; // data received, valid only (for one clock cycle) when RxD_data_ready is asserted
  8. wire TxD;
  9. parameter DATA0 = 10'b1101001010; //从低位开始发送
  10. // parameter DATA1 = 10'b1010011010;
  11. reg [9:0] data_in;
  12. integer i;
  13. initial begin
  14. clk = 0;
  15. forever
  16. #20 clk = ~clk;
  17. end
  18. initial begin
  19. data_in = DATA0;
  20. for(i = 0; i < 9; i = i + 1) begin
  21. #8700
  22. RxD = data_in[i];
  23. end
  24. #26100
  25. for(i = 0; i < 9; i = i + 1) begin
  26. #8700
  27. RxD = data_in[i];
  28. end
  29. //#10000 $stop;
  30. end
  31. serialGPIO u_serialGPIO(
  32. .clk(clk),
  33. .RxD(RxD),
  34. .TxD(TxD)
  35. );
  36. endmodule

仿真效果很满意:

 

RxD_data_ready有效时,接收完毕,于此同时TxD_start有效,开始发送数据。

 


最后设计一的仿真自己做吧。

 

 

 

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/90612047

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。