RS-232 Transmitter
目录
串行化数据
Verilog描述并仿真
上篇博文讲到了如何产生波特率?(RS232 波特率时钟产生方法?)
下面的内容是构建一个异步发送器:
我们正在构建一个具有固定参数的“异步发送器”:8个数据位,2个停止位,无奇偶校验。
它的工作方式如下:
发送器在FPGA内部获取一个8位数据并将其串行化(从“TxD_start”信号置位时开始)。
在发生传输时断言“忙”信号(在此期间忽略“TxD_start”信号)。
串行化数据
要查看起始位,8个数据位和停止位,状态机似乎是合适的。
reg [3:0] state;
// the state machine starts when "TxD_start" is asserted, but advances when "BaudTick" is asserted (115200 times a second)
always @(posedge clk)
case(state)
4'b0000: if(TxD_start) state <= 4'b0100;
4'b0100: if(BaudTick) state <= 4'b1000; // start
4'b1000: if(BaudTick) state <= 4'b1001; // bit 0
4'b1001: if(BaudTick) state <= 4'b1010; // bit 1
4'b1010: if(BaudTick) state <= 4'b1011; // bit 2
4'b1011: if(BaudTick) state <= 4'b1100; // bit 3
4'b1100: if(BaudTick) state <= 4'b1101; // bit 4
4'b1101: if(BaudTick) state <= 4'b1110; // bit 5
4'b1110: if(BaudTick) state <= 4'b1111; // bit 6
4'b1111: if(BaudTick) state <= 4'b0001; // bit 7
4'b0001: if(BaudTick) state <= 4'b0010; // stop1
4'b0010: if(BaudTick) state <= 4'b0000; // stop2
default: if(BaudTick) state <= 4'b0000;
endcase
现在,我们只需要生成“TxD”输出。
reg muxbit;
always @(state[2:0])
case(state[2:0])
0: muxbit <= TxD_data[0];
1: muxbit <= TxD_data[1];
2: muxbit <= TxD_data[2];
3: muxbit <= TxD_data[3];
4: muxbit <= TxD_data[4];
5: muxbit <= TxD_data[5];
6: muxbit <= TxD_data[6];
7: muxbit <= TxD_data[7];
endcase// combine start, data, and stop bits together
assign TxD = (state<4) | (state[3] & muxbit);
Verilog描述并仿真
Verilog描述:
由于参考链接(https://www.fpga4fun.com/SerialInterface3.html)上的完整代码过于复杂,我自己改成简单的形式,并仿真:
module ays_transmitter(input clk,input TxD_start,input [7:0] TxD_data,output TxD,output TxD_busy);reg [3:0] TxD_state = 0;wire TxD_ready = (TxD_state==0);assign TxD_busy = ~TxD_ready;//Generate Baud Clockwire BitTick;BaudGen u_BaudGen(.clk(clk),.enable(TxD_busy), //generate baud clk only when transmiter data.BaudTick(BitTick));reg [7:0] TxD_shift = 0;always @(posedge clk) beginif(TxD_ready & TxD_start)TxD_shift <= TxD_data;elseif(TxD_state[3] & BitTick)TxD_shift <= (TxD_shift >> 1);case(TxD_state)4'b0000: if(TxD_start) TxD_state <= 4'b0100;4'b0100: if(BitTick) TxD_state <= 4'b1000; // start bit4'b1000: if(BitTick) TxD_state <= 4'b1001; // bit 04'b1001: if(BitTick) TxD_state <= 4'b1010; // bit 14'b1010: if(BitTick) TxD_state <= 4'b1011; // bit 24'b1011: if(BitTick) TxD_state <= 4'b1100; // bit 34'b1100: if(BitTick) TxD_state <= 4'b1101; // bit 44'b1101: if(BitTick) TxD_state <= 4'b1110; // bit 54'b1110: if(BitTick) TxD_state <= 4'b1111; // bit 64'b1111: if(BitTick) TxD_state <= 4'b0010; // bit 74'b0010: if(BitTick) TxD_state <= 4'b0011; // stop14'b0011: if(BitTick) TxD_state <= 4'b0000; // stop2default: if(BitTick) TxD_state <= 4'b0000;endcaseendassign TxD = (TxD_state<4) | (TxD_state[3] & TxD_shift[0]); // put together the start, data and stop bitsendmodule
BaudGen模块:
module BaudGen(input clk,input enable,output BaudTick);parameter ClkFrequency = 25000000; // 25MHzparameter Baud = 115200;parameter Ratio = ClkFrequency/Baud;parameter BaudGeneratorAccWidth = 16;parameter BaudGeneratorInc = (1<<BaudGeneratorAccWidth)/Ratio;reg [BaudGeneratorAccWidth:0] BaudGeneratorAcc = 0;always @(posedge clk)if(enable)BaudGeneratorAcc <= BaudGeneratorAcc[BaudGeneratorAccWidth-1:0] + BaudGeneratorInc;elseBaudGeneratorAcc <= BaudGeneratorInc;assign BaudTick = BaudGeneratorAcc[BaudGeneratorAccWidth];endmodule
测试模块:
`timescale 1ns / 1ps
//
// Create Date: 2019/05/26 16:06:48
// Design Name:
// Module Name: ays_transmitter_tb
//module ays_transmitter_tb();reg clk;reg TxD_start;reg [7:0] TxD_data;wire TxD;wire TxD_busy;initial beginclk = 0;forever#20 clk = ~clk;endinitial beginTxD_start = 0;TxD_data = 8'b10010101;#50TxD_start = 1;endays_transmitter u_ays_transmitter(.clk(clk),.TxD_start(TxD_start),.TxD_data(TxD_data),.TxD(TxD),.TxD_busy(TxD_busy));endmodule
仿真波形图:
从上图可以看出,每一个波特时钟发送一bit数据:从低到高位发送10101001,之后发送两个结束位1.
下面这幅图是显示下一次发送前的空闲期,TxD_busy为低。之后又进入了下一帧数据的发送。
参考链接:
https://www.fpga4fun.com/SerialInterface3.html
RS-232 Transmitter相关推荐
- 2021-07-14 串口 、并口、接口划分(UART、RS232、RS422、RS485、TTL、USB)
文章目录 前言 一.串口是什么? 二.并口是什么? 三.各接口的划分? 1.UART 2.USB 3.各式各样电气接口标准 1.RS232(全双工) 2.RS485(半双工) 3.RS422(全双工) ...
- x-bov16 firmware android,NW-BM85-000
NW-BM85-000 [手机]小罗 [电话] [传真]0592-6034581 [QQ]2636645006 201712月4日,王诗龄在微博晒出自己设计的海报,并且兴奋地表示:"我设 ...
- RFC1662_PPP in HDLC-like Framing_HDLC协议
Network Working Group W. Simpson, Editor Request for Comments: 1662 ...
- KS103超声波测距模块
max232:电平转换芯片,将电脑的RS-232标准串口(高+12V,低-12V)转换为(高+5V,低0V). 电脑串口(RS -232) => 单片机串口(TTL串口) SIPEX SP323 ...
- Linux下集群技术应用概述
原文作者:技术成就梦想 原文链接: http://ixdba.blog.51cto.com/2895551/566802 一. 集群的定义 集群是一组协同工作的服务集合,用来提供比单一服务更稳定.更高 ...
- 南非的5DT数据手套使用说明
数据手套-5 Ultra/数据手套-14 Ultra 5DT 数据手套-Ultra数据手套的设计目的是为了满足现代动作捕捉和动画制作等专业人士的严格要求.它提供了舒适,易于使用,小型要素和多种应用的驱 ...
- 基于python的界面自动化测试-基于Python语言的自动化测试系统的设计与实现
黄建军+李宥谋+刘婧+周欢 摘 要: 通过分析现代工业生产对自动化测试系统的要求,提出一种基于面向对象的编程语言Python构建的自动化测试系统.利用Python语言的高效.灵活和简洁等特点,结合Py ...
- C#中串口通信编程 收藏
C#中串口通信编程 收藏 本文将介绍如何在.NET平台下使用C#创建串口通信程序,.NET 2.0提供了串口通信的功能,其命名 空间是System.IO.Ports.这个新的框架不但可以访问计算机上的 ...
- 32个最热CPLD-FPGA论坛
1. OPENCORES.ORG 这里提供非常多,非常好的PLD了内核,8051内核就可以在里面找到. 进入后,选择project或者由http//www.opencores.org/browse.c ...
- 单片机c语言应用100例第3版课后答案,单片机C语言应用100例(第3版)(含光盘1张)...
基 础 篇 第1章 单片机概述及实验器材介绍2 1.1 单片机概述2 1.1.1 单片机的定义.分类与内部组成2 1.1.2 单片机应用系统的结构及其工作过程5 1.1.3 单片机的应用6 1.2 单 ...
最新文章
- 不愧是摸鱼高手Python matplotlib 绘制频谱图都会,能怪老板不管
- 掌握Angular2的服务(service)
- 【FI】-【AM】跨工厂/事业部/利润中心的固定资产调拨
- re.search中与正则表达式*结合使用的注意事项
- Java中如何获得集合变量的集合中的类型参数
- c#时分秒毫秒微妙_你真的清楚DateTime in C#吗?
- python客户价值分析_航空公司客户价值分析实例
- 综合项目:Keepalived+Redis+Haproxy实现主从热备、负载均衡、秒级切换
- X波段雷达对海探测试验与数据获取
- 运行Puttygen.exe生成密钥
- 基于Labview的简易计算器设计
- mysql限制小数位_mysql-控制小数位数
- JDE(Towards Real-Time Multi-Object Tracking)代码测试——小白必看
- BZOJ 1216 优先队列
- 洗衣机程序c语言代码大全,全自动洗衣机控制器设计的单片机代码
- 大漠插件最新版7.2248
- 苹果手机怎么设置时间24小时制_手机资讯:无法激活 iMessage 等问题及解决办法汇总...
- 语音芯片c语言程序,语音芯片pm50 在430单片机上的C语言编程
- Anaconda的卸载及安装(图文详解)
- css 平移到某个位置_Html基本的动画效果(平移,旋转)
热门文章
- selenium webdriver之eclipse java开发环境搭建
- S3C2440 SDRAM内存驱动 .
- [转]Webkit内核探究【2】——Webkit CSS实现
- cadence高速电路设计 光盘_嘉定区高速复印机租赁费用
- linux从源码编译软件,linux软件包管理——源码包编译安装
- css调整表格在屏幕上的位置
- python中的path是什么_python中的os.path.splitext是干什么用的
- 禁止java更新_禁止:禁止对'replicas','template'和'updateStrategy'以外的字段的statefulset规范进行更新...
- 微信小程序打开红包的css_山海经攻略(微信小程序现金红包提现游戏)
- linux验证文件的完整性,linux中校验文件完整性(md5,sha1)(示例代码)