Verilog 实现 UART TX 发送器

news/2024/11/28 15:57:00/

目录

1、简述

2、设计

3、实现

4、测试


 

1、简述

上一节描述了 Verilog 的 UART RX 过程,相对于 RX,传送数据就稍微简单一些,不需要进行线上数据的采样;

发送数据需要考虑的几点:

1、内部数据位并行,发送的时候为 tx 串行,那么就需要考虑到传送的时候的 busy 信号,并进行数据的并行转串行;

2、同样需要根据串口的配置来进行发送数据的计数

3、需要根据波特率来进行发送有效的计数

 

2、设计

那么根据需求进行设计如下:

1、来自 PLL 的时钟和 Locked 为模块提供 Clock 和复位信号;

2、波特率发生器根据配置的波特率来进行计数的控制;

3、当 tx_en 信号来的时候,进行来自 FIFO 的并行数据锁定,并拉高 busy;

4、根据传送的配置(数据位、校验位、停止位)来进行发送数据的计数;

5、状态机根据发送数据的计数和波特率有效信号,来进行状态转换,并将数据发送出去;

 

3、实现

Verilog 代码设计为(此处的波特率发生器仅仅为了仿真需要,counter 设置成为了 10,实际情况需计算,同时为了简化,数据位为8,没有校验位,停止位为1):

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date:    17:49:03 12/08/2019 
// Design Name: 
// Module Name:    uart_tx 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 
//
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
//
module uart_tx(input clk,input rst_n,input tx_en,input [7:0] data,output reg busy,output reg tx);parameter BAUD_MAX       = 20;parameter START_VALUE    = 1'b0;parameter STOP_VALUE     = 1'b1;parameter START_BIT      = 1;parameter DATA_BIT       = 8;parameter STOP_BIT       = 1;// State Machine Definationparameter IDLE  =   3'b001;parameter SAMP  =   3'b010;parameter TRAS  =   3'b100;reg [2:0] current_state, next_state;always @ (posedge clk or negedge rst_n)if(!rst_n)current_state <= IDLE;elsecurrent_state <= next_state;// Statereg sent_finished;always @ (current_state or tx_en or sent_finished)beginnext_state = 3'bx;case(current_state)IDLE : beginif (tx_en) next_state = SAMP;else       next_state = IDLE;endSAMP : beginif (tx_en) next_state = TRAS;else       next_state = IDLE;endTRAS : beginif (!tx_en) next_state = IDLE;else if (sent_finished) next_state = IDLE;else next_state = TRAS;enddefault : next_state = IDLE;endcaseendreg [9:0] data_samp;reg [4:0] baud_cnt;reg [3:0] sent_cnt;always @ (posedge clk or negedge rst_n)if (!rst_n) begindata_samp <= 10'bx;busy <= 1'b0;tx <= 1'b1;baud_cnt <= 5'b0;sent_finished <= 1'b0;sent_cnt <= 1'b0;endelse begincase (next_state)IDLE : begindata_samp <= 10'bx;busy <= 1'b0;tx <= 1'b1;baud_cnt <= 5'b0;sent_finished <= 1'b0;sent_cnt <= 1'b0;endSAMP : begin//data_samp <= {1'b1, data[0],data[1],data[2],data[3],data[4],data[5],data[6], data[7], 1'b0};data_samp <= {1'b1, data[7:0], 1'b0};busy <= 1'b1;tx <= 1'b1;baud_cnt <= 5'b0;sent_finished <= 1'b0;sent_cnt <= 1'b0;endTRAS : beginif (baud_cnt == BAUD_MAX) beginbaud_cnt <= 5'b0;if (sent_cnt == 4'd10) begindata_samp <= 10'bx;busy <= 1'b0;tx <= 1'b1;sent_finished <= 1'b1;sent_cnt <= 1'b0;endelse begindata_samp <= data_samp;busy <= 1'b1;tx <= data_samp[sent_cnt];sent_finished <= 1'b0;sent_cnt <= sent_cnt + 1'b1;endendelse beginbaud_cnt <= baud_cnt + 1'b1;endendendcaseend
endmodule

 

 

4、测试

testbench:

`timescale 1ns / 1ps// Company: 
// Engineer:
//
// Create Date:   19:28:59 12/08/2019
// Design Name:   uart_tx
// Module Name:   G:/FPGA/Spartan_6/ise_project/sp6_stephen/sp6_stephen_pro/source_code/uart_tx_tb.v
// Project Name:  sp6_stephen_pro
// Target Device:  
// Tool versions:  
// Description: 
//
// Verilog Test Fixture created by ISE for module: uart_tx
//
// Dependencies:
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// module uart_tx_tb;// Inputsreg clk;reg rst_n;reg tx_en;reg [7:0] data;// Outputswire busy;wire tx;// Instantiate the Unit Under Test (UUT)uart_tx uut (.clk(clk), .rst_n(rst_n), .tx_en(tx_en), .data(data), .busy(busy), .tx(tx));
always #1 clk = ~clk;initial begin// Initialize Inputsclk = 0;rst_n = 0;tx_en = 0;data = 0;// Wait 100 ns for global reset to finish#100;// Add stimulus hererst_n = 1;data = 8'b1010_1010;#100 tx_en = 1'b1;#500 data = 8'b0101_0101;endendmodule

 


http://www.ppmy.cn/news/274413.html

相关文章

Network 之三 Ethernet(以太网)物理介质(10Base、100Base-T、100Base-TX等)介绍

在搞网络这一块的时候&#xff0c;看到了 100Base-T、100Base-TX 等这些东西&#xff0c;在 IEEE802.3 中&#xff0c;也到处是这些词。大体了解了一下&#xff0c;下面是正文。 以太网采用 CSMA/CD&#xff08;Carrier Sense Multiple Access/Collision Detection&#xff0c;…

以太网详解(二)-物理介质(100base-TX等)介绍

转载原文&#xff1a;https://blog.csdn.net/ZCShouCSDN/article/details/80208596 在搞网络这一块的时候&#xff0c;看到了100Base-T、100Base-TX等这些东西&#xff0c;在IEEE802.3中&#xff0c;也到处是这些词。大体了解了一下&#xff0c;下面是正文&#xff1a; 以太网…

100BASE-TX / 100BASE-T4/100BASE-FX

IEEE标准共有以下几种:10BASE-5&#xff1a;粗缆。最大传输距离500米&#xff0c;使用AUI连接器连接或使用收发器电缆和收发器(MAU)进行连接。10BASE-2&#xff1a;细缆。实际传输距离为185米&#xff0c;使用BNC连接器(T型和N型)。10BASE-T&#xff1a;双绞线。传输距离100米&…

计算机网络base,计算机网络中的术语100Base-TX/FX指的是什么?

100BASE&#xff0d;TX 是5类UTP 采用4B5B编码传输 100base-4 100base-FX都属于100BASE&#xff0d;T 100BASE-TX 说明 100BASE-TX 是 IEEE 802.3u 标准&#xff0c;它制定了在五类无屏蔽双绞线(UTP)或屏蔽双绞线(STP)上速率达 100Mbps 的快速以太网信令标准。 作为 IEEE 802.…

关于1000BASE-T1 1000BASE-TX和100BASE-T1

关于1000BASE-T1 1000BASE-TX和100BASE-T1 100BASE-T1 The 100BASE-T1 Physical Layer supports standard media access controller (MAC) interfaces via the MII。Each copper port supports a single balanced twisted-pair link segment connection up to 15 m in length…

centos7 部署 Redis

从源安装Redis 一、安装Redis1.1 下载源文件1.2 编译源文件1.2.1 解压文件1.2.2 编译Redis 1.2.3 安装Redis1.2.4 启动 Redis 二、Redis设置2.1 缓存设置2.2 redis 环境优化2.3 安全设置 一、安装Redis 1.1 下载源文件 使用下列命令获取最新版的稳定Redis wget https://down…

shell的uniq命令

uniq 命令用于检查及删除文本文件中重复出现的行列&#xff0c;一般与 sort 命令结合使用。 uniq 可检查文本文件中重复出现的行列。 命令语法&#xff1a; uniq [-c/d/D/u/i] [-f Fields] [-s N] [-w N] [InFile] [OutFile] 参数解释&#xff1a; -c: 在每列旁边显示该行…

腾讯云服务器SA3实例AMD处理器CPU网络带宽性能详解

腾讯云AMD服务器SA3实例CPU采用2.55GHz主频的AMD EPYCTM Milan处理器&#xff0c;睿频3.5GHz&#xff0c;搭载最新一代八通道DDR4&#xff0c;内存计算性能稳定&#xff0c;默认网络优化&#xff0c;最高内网收发能力达1900万pps&#xff0c;最高内网带宽可支持100Gbps。腾讯云…