当前位置: 首页 > news >正文

36.UART(通用异步收发传输器)-RS232(3)

(1)串口发送模块visio视图:

(2)串口发送模块Verilog代码:

/*
常见波特率: 4800、9600、14400、115200
在系统时钟为50MHz时,对应计数为:   
(1/4800)    * 10^9 /20 -1 = 10416     
(1/9600)    * 10^9 /20 -1 = 5207
(1/14400)   * 10^9 /20 -1 = 3471
(1/115200)  * 10^9 /20 -1 = 433 
*/module rs232_tx
(input   [16:0]  baud_set        ,input           clk             ,input           reset_n         ,input   [7:0]   tx_data         ,input           tx_start        ,output   reg    tx              ,output   reg    tx_done            );reg [15:0]      BAUD_MCNT       ;reg [7:0]       r_tx_data       ;reg             en_baud_cnt     ;reg [15:0]      baud_cnt        ;reg [3:0]       bit_cnt         ;//波特最大计数设计always@(posedge clk)begincase(baud_set)17'd4800    :BAUD_MCNT <= 16'd10416;17'd9600    :BAUD_MCNT <= 16'd5207;17'd14400   :BAUD_MCNT <= 16'd3471;17'd115200  :BAUD_MCNT <= 16'd433;default     :BAUD_MCNT <= 16'd5207;      //当输入baud_set为其他值时,一律当成9600处理。endcaseend//输入信号同步化处理always@(posedge clk)if(tx_start)r_tx_data <= tx_data;elser_tx_data <= r_tx_data;//波特率计数器使能信号设计always@(posedge clk or negedge reset_n)if(!reset_n)en_baud_cnt <= 1'd0;else if(tx_start)en_baud_cnt <= 1'd1;else if((bit_cnt == 4'd9)&&(baud_cnt == BAUD_MCNT))en_baud_cnt <= 1'd0;else en_baud_cnt <= en_baud_cnt;//波特率计数器模块设计always@(posedge clk or negedge reset_n)if(!reset_n)baud_cnt <= 16'd0;else if(!en_baud_cnt)baud_cnt <= 16'd0;else if(baud_cnt == BAUD_MCNT)baud_cnt <= 16'd0;else baud_cnt <= baud_cnt + 16'd1;//位计数器模块设计always@(posedge clk or negedge reset_n)if(!reset_n)    bit_cnt <= 4'd0;else if((baud_cnt == BAUD_MCNT) && (bit_cnt == 4'd9))bit_cnt <= 4'd0;else if(baud_cnt == BAUD_MCNT)bit_cnt <= bit_cnt + 4'd1;else bit_cnt <= bit_cnt;//tx输出序列机设计always@(posedge clk or negedge reset_n)if(!reset_n)tx <= 1'd1;else if(!en_baud_cnt)tx <= 1'd1;else if(baud_cnt == 16'd1)begincase(bit_cnt)4'd0:   tx <= 1'd0;4'd1:   tx <= r_tx_data[0];4'd2:   tx <= r_tx_data[1];4'd3:   tx <= r_tx_data[2];4'd4:   tx <= r_tx_data[3];4'd5:   tx <= r_tx_data[4];4'd6:   tx <= r_tx_data[5];4'd7:   tx <= r_tx_data[6];4'd8:   tx <= r_tx_data[7];4'd9:   tx <= 1'd1;default:tx <= 1'd1;endcaseendelse tx <= tx;//tx_done信号设计always@(posedge clk or negedge reset_n)if(!reset_n)tx_done <= 1'd0;else if((baud_cnt == BAUD_MCNT) && (bit_cnt == 4'd9))tx_done <= 1'd1;else tx_done <= 1'd0;endmodule

(3)串口发送模块仿真代码:

`timescale 1ns / 1psmodule rs232_tx_tb;reg     [16:0]      baud_set    ; 
reg                 clk         ;     
reg                 reset_n     ;
reg     [7:0]       tx_data     ;  
reg                 tx_start    ;wire                tx          ;
wire                tx_done     ;initial clk = 1'd1;
always #10 clk = ~clk;initial beginbaud_set <= 17'd9600;reset_n <= 1'd0;tx_data <= 1'd0;tx_start <= 1'd0;#21;reset_n <= 1'd1;#40;@(posedge clk);//输入数据0tx_data <= 8'd0;tx_start <= 1'd1;#20;tx_start <= 1'd0;#(5208 * 20 * 10);//输入数据1tx_data <= 8'd1;tx_start <= 1'd1;#20;tx_start <= 1'd0;#(5208 * 20 * 10);//输入数据2tx_data <= 8'd2;tx_start <= 1'd1;#20;tx_start <= 1'd0;#(5208 * 20 * 10);//输入数据3tx_data <= 8'd3;tx_start <= 1'd1;#20;tx_start <= 1'd0;#(5208 * 20 * 10);//输入数据4tx_data <= 8'd4;tx_start <= 1'd1;#20;tx_start <= 1'd0;#(5208 * 20 * 10);//输入数据5tx_data <= 8'd5;tx_start <= 1'd1;#20;tx_start <= 1'd0;#(5208 * 20 * 10);//输入数据6tx_data <= 8'd6;tx_start <= 1'd1;#20;tx_start <= 1'd0;#(5208 * 20 * 10);//输入数据7tx_data <= 8'd7;tx_start <= 1'd1;#20;tx_start <= 1'd0;#(5208 * 20 * 10);$stop;
endrs232_tx rs232_tx_inst
(.baud_set       ( baud_set)        ,.clk            ( clk     )        ,.reset_n        ( reset_n )        ,.tx_data        ( tx_data )        ,.tx_start       ( tx_start)        ,.tx             ( tx      )        ,.tx_done        ( tx_done )           );endmodule

(4)仿真波形:

同时,可以看见,tx一开始被赋予了高电平,在波特计数器计数为1,起始位时被拉低。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 游戏视频是后期配音好还是边录边配 游戏视频怎么剪辑制作才能火 视频剪辑免费软件
  • 用Python爬虫能实现什么?得到什么?
  • 微信小程序密码 显示隐藏 真机兼容问题
  • [AI 大模型] 百度 文心一言
  • 【学习笔记】无人机(UAV)在3GPP系统中的增强支持(八)-通过无人机进行无线接入
  • 【信息收集】域名信息收集
  • 接口测试框架基于模板自动生成测试用例!
  • 前端时间格式传入后端负载里面没有东西
  • c++包管理器
  • 使用Python和MediaPipe实现手势控制音量(Win/Mac)
  • socket编程(2) -- TCP通信
  • 【Linux】进程的基本概念(以及进程地址空间的初步了解)
  • GCN-LSTM实现时空预测
  • Mybatis拦截器介绍及其应用
  • ROM修改进阶教程------深度解析小米设备锁机型不解锁bl 刷写特殊类固件的步骤
  • 【391天】每日项目总结系列128(2018.03.03)
  • Gradle 5.0 正式版发布
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • leetcode388. Longest Absolute File Path
  • Mysql5.6主从复制
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 类orAPI - 收藏集 - 掘金
  • 面试总结JavaScript篇
  • 如何在GitHub上创建个人博客
  • 使用common-codec进行md5加密
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 栈实现走出迷宫(C++)
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • MPAndroidChart 教程:Y轴 YAxis
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (Git) gitignore基础使用
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (四)React组件、useState、组件样式
  • (四十一)大数据实战——spark的yarn模式生产环境部署
  • (转) ns2/nam与nam实现相关的文件
  • (转)h264中avc和flv数据的解析
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .NET Core 中插件式开发实现
  • .Net Web项目创建比较不错的参考文章
  • .net8.0与halcon编程环境构建
  • .NET8使用VS2022打包Docker镜像
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • [ solr入门 ] - 利用solrJ进行检索