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

35.UART(通用异步收发传输器)-RS232(2)

(1)RS232接收模块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_rx
(input [16:0]    baud_set    ,input           clk         ,input           reset_n     ,input           rx          ,input           rx_start    ,output reg[7:0] rx_data     ,output reg      rx_done     );reg [15:0]      BAUD_MCNT   ;reg             rx_reg0     ;reg             rx_reg1     ;reg             rx_reg2     ;reg             en_baud_cnt ;reg [15:0]      baud_cnt    ;reg [3:0]       bit_cnt     ;reg [7:0]       r_rx_data   ;wire            nedge       ;wire            w_rx_done   ;//波特最大计数设计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)beginrx_reg0 <= rx;rx_reg1 <= rx_reg0;end//下降沿设计always@(posedge clk)rx_reg2 <= rx_reg1;assign nedge = (rx_reg2) && (!rx_reg1);//波特率计数使能信号设计 always@(posedge clk or negedge reset_n)if(!reset_n)en_baud_cnt <= 1'd0;else if(!rx_start)en_baud_cnt <= 1'd0;else if(nedge)en_baud_cnt <= 1'd1;else if((bit_cnt == 4'd0) && (baud_cnt == BAUD_MCNT/2)&&(rx_reg2))      //防止起始位只是一个抖动en_baud_cnt <= 1'd0;else if((bit_cnt == 4'd9) && (baud_cnt == BAUD_MCNT/2))en_baud_cnt <= 1'd1;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;//rx_data设计always@(posedge clk or negedge reset_n)if(!reset_n)r_rx_data <= 8'd0;else if(baud_cnt == BAUD_MCNT/2)begincase(bit_cnt)4'd1: r_rx_data[0] <= rx_reg2;4'd2: r_rx_data[1] <= rx_reg2;4'd3: r_rx_data[2] <= rx_reg2;4'd4: r_rx_data[3] <= rx_reg2;4'd5: r_rx_data[4] <= rx_reg2;4'd6: r_rx_data[5] <= rx_reg2;4'd7: r_rx_data[6] <= rx_reg2;4'd8: r_rx_data[7] <= rx_reg2;default:r_rx_data <= r_rx_data;endcaseendelse r_rx_data <= r_rx_data;always@(posedge clk or negedge reset_n)if(!reset_n)rx_data <= 8'd0;else if(w_rx_done)rx_data <= r_rx_data;else    rx_data <= rx_data;//w_rx_done和rx_done信号设计assign w_rx_done = (bit_cnt == 4'd9) && (baud_cnt == BAUD_MCNT/2) ;always@(posedge clk or negedge reset_n)if(!reset_n)rx_done <= 1'd0;else rx_done <= w_rx_done;endmodule

(3)仿真文件代码:

`timescale 1ns / 1psmodule rs232_tx_tb;reg   [16:0]        baud_set    ;
reg                 clk         ;
reg                 reset_n     ;
reg                 rx          ;
reg                 rx_start    ;wire [7:0]          rx_data     ;
wire                rx_done     ;initial clk = 1'd1;always #10 clk = ~clk;initial begin baud_set <= 17'd9600;rx_start <= 1'd0;#200;rx_start <= 1'd1;reset_n <= 1'd0;rx      <= 1'd1;#15;reset_n <= 1'd1;@(posedge clk)set_bit(8'd1 );set_bit(8'd3 );set_bit(8'd7 );set_bit(8'd15);$stop;endrs232_rx    rs232_rx_inst
(.baud_set    ( baud_set )     ,.clk         ( clk      )     ,.reset_n     ( reset_n  )     ,.rx          ( rx       )     ,.rx_start    ( rx_start )     ,.rx_data     ( rx_data  )     ,.rx_done     ( rx_done  )     );task   set_bit(input [7:0]data
);integer i;for(i=0;i<10;i=i+1)begincase(i)0: rx <= 1'd0;1: rx <= data[0];2: rx <= data[1];3: rx <= data[2];4: rx <= data[3];5: rx <= data[4];6: rx <= data[5];7: rx <= data[6];8: rx <= data[7];9: rx <= 1'd1;endcase#(5208 * 20);        end
endtaskendmodule

(4)仿真波形:

相关文章:

  • 大模型时代,还需要跨端framework吗?
  • Elasticsearch-多边形范围查询(8.x)
  • Msql数据库之DDL(数据定义语言)的相关操作
  • Android11 设置一个默认密码 万能密码
  • 算法训练营day72
  • html超文本传输协议
  • 【Python】numpy:构建数组、数组属性、更改数组形状或维度、数组拷贝、数组合并、数组拆分、删除数组、数组保存到文件
  • python数据预处理工作记录
  • C++ Primer:3.6 多维数组
  • 人工智能前沿讲座——融合知识的自然语言处理
  • 用python写一个爬虫,爬取google中关于蛇的照片
  • OpenLayers学习笔记-点位聚合
  • python爬虫豆瓣电影TOP250
  • FakeNewsGPT4:通过知识增强的大规模视觉语言模型推进多模态假新闻检测
  • Python和C++骨髓细胞进化解析数学模型
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 07.Android之多媒体问题
  • create-react-app项目添加less配置
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • extract-text-webpack-plugin用法
  • Java到底能干嘛?
  • Logstash 参考指南(目录)
  • MQ框架的比较
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • Vue 2.3、2.4 知识点小结
  • 代理模式
  • 分布式事物理论与实践
  • 排序算法之--选择排序
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​如何使用QGIS制作三维建筑
  • ‌U盘闪一下就没了?‌如何有效恢复数据
  • # Apache SeaTunnel 究竟是什么?
  • #{} 和 ${}区别
  • #1014 : Trie树
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (Charles)如何抓取手机http的报文
  • (floyd+补集) poj 3275
  • (Java入门)抽象类,接口,内部类
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (简单) HDU 2612 Find a way,BFS。
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (四)c52学习之旅-流水LED灯
  • (四)鸿鹄云架构一服务注册中心
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (一)u-boot-nand.bin的下载
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite