UART : Universal Asynchronous Receiver/Transmitter : 异步收发传输器; 分为2个PART(发送 和接收);-------------学习笔记(一) Alex.Lee
**********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
PART I 发送部分
本实验是以波特率为9600,为例来讲述UART;
首先,先介绍下串口的发送机制( 如图一 )
图一
即 UART 的发送(TX)机制,一般分为5个状态,即空闲位、 起始位、发送数据位、校验、停止位;
空闲(Idle):TX空闲时为High Level status;
起始(Start):TX 从高跳变到低电平,标志着下一个Bit将传送有效的数据;
数据(Data): TX将根据发送寄存器里的数据值,依次发送;(【注】:在传送的数据顺序为 First LSB ,Last MSB,先低位,后高位;)数据一般为7或8bit;
校验( Check): TX 发送完数据位后,可使用校验位来使传送的数据更加准确,即使用 奇偶校验; 也可以不使用校验;
停止(Stop): 发送停止位,即TX发送一 个BIt 的高电平,标志本次数据传送结束;一般用 帧错误检测 (Frame error:传送一帧数据是否出错);
发送机制的过程可概括 为:
Step 1 : 在空闲时TX为High Level ,当要发送数据时,则将pull down TX 线 作为 发送起始位标志,即TX 发送一个Bit 位的低电平。
Step 2 : 发送完起始位后,将进入发送数据, TX 将从接收缓冲器中依次从最低位 到最高位取出数据并在时钟周期到来时发送;一般数据位为8位即 1Byte。
Step 3 : 发送完一帧数据后,为了确保数据的准确传输,一般会使一个bit位 用 于奇偶校验,来判断数据是否出错。
Step 4 ::最后将发送一个bit的高电平作为发送停止位的标志,同时表明一帧数据传输完成。
CODE :
`timescale 1ns / 1ps
module Uart_tx(clk,rst_n,wrig,datain,tx,idle);
input clk;
input rst_n;
input wrig;
input [7:0]datain;
output tx;
output idle;
reg tx, idle;
reg send;
reg result;
reg[7:0] timer;
reg tx_temp,tx_raising;
parameter poritymode = 1'b0;
always@(posedge clk) // raise edge valid
begin
tx_temp <= wrig;
tx_raising <= wrig & (~tx_temp);
end
always@(posedge clk)
begin
if(tx_raising &&(~idle))
begin
send <= 1'b1;
end
else if(timer == 8'd168)
begin
send <= 1'b0;
end
end
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
tx <= 1'b0;
idle <= 1'b0;
timer <= 8'd0;
result <= 1'b0;
end
else if(send