解析常用串行总线——UART协议(下)

2. 接收模块 (uart_rx):
module uart_rx (
clk_40k, //clock signal, 40khz
rst_n, //reset signal, active low
bit_in, //the input serial bit,
dout_vld,//the output valid signal, active high,the dout is valid when this signal is high.
dout //received data, 8 bit width
);
input bit_in;
input clk_40k;
input rst_n;
output reg dout_vld;
output reg [7:0] dout;
reg rx_flag;
reg [6:0] cnt;
reg [5:0] rx_cnt;
reg [7:0] dout_temp;
//rx_flag: 接收过程rx_flag始终拉高
always @ (posedge clk_40k)
begin
if(~rst_n)
rx_flag <= 1'b0;else if(bit_in == 1'b0)
rx_flag <= 1'b1;else if(rx_cnt == 6'd9)
rx_flag <= 1'b0;end
//cnt: 接收数据计数,clk_40k分频至1k波特率对接收数据进行计数
always @ (posedge clk_40k)
begin
if(~rst_n)
cnt <= 7'b0;else if(rx_flag == 1'b1 && cnt != 7'd39)
cnt <= cnt + 1'b1;else if(rx_flag == 1'b0 || cnt == 7'd39)
cnt <= 7'b0;end
always @ (posedge clk_40k)
begin
if(~rst_n)
rx_cnt <= 6'b0;else if(rx_flag == 1'b1 && cnt == 7'd39)
rx_cnt <= rx_cnt + 1'b1;else if(rx_flag == 1'b0)
rx_cnt <= 6'b0;end
//dout_temp: 将串行接收数据转换还原为8bit数据
always @ (posedge clk_40k)
begin
if(~rst_n)
dout_temp <= 8'b0;else if(rx_flag == 1'b1 && cnt == 7'd39)
begin
dout_temp[7] <= bit_in;dout_temp[6:0] <= dout_temp[7:1];end
end
//dout_vld: 传输完成标识,8bit数据传输结束拉高
always @ (posedge clk_40k)
begin
if(~rst_n)
dout_vld <= 1'b0;else if(rx_cnt == 6'd9 && cnt == 7'b0)
begin
dout <= dout_temp;dout_vld <= 1'b1;end
else
dout_vld <= 1'b0;end
endmodule
3. testbench(tb):
`timescale 1us/1us
module tb();
reg clk_40k;
reg rst_n;
reg [7:0] din;
reg send_start;
wire bit_out;
wire bit_in;
wire dout_vld;
wire [7:0] dout;
assign bit_in = bit_out;
uart_tx i_uart_tx(
.clk_40k (clk_40k ),
.rst_n (rst_n ),
.din (din ),
.send_start (send_start),
.bit_out (bit_out )
);
uart_rx i_uart_rx(
.clk_40k (clk_40k ),
.rst_n (rst_n ),
.bit_in (bit_in ),
.dout_vld (dout_vld ),
.dout (dout )
);
initial
begin
rst_n = 1'b0;#10rst_n = 1'b1;end
initial
begin
clk_40k = 1'b0;forever#1clk_40k = ~clk_40k;end
initial
begin
send_start = 1'b0;din = 8'd0;foreverbegin #1000 din = $random()%256; send_start = 1'b1; #2 send_start = 1'b0;endend
endmodule
4. 仿真结果 :
按照testbench对uart收发端进行仿真,仿真结果如图:
系统时钟和传输速率通常不一致,clk_40k为高频系统时钟,利用计数器分频实现1k波特率;复位信号rst_n低电平有效,正常传输时始终处于高电平。开始传输时send_start信号拉高,传输结束时dout_vld信号拉高;输入数据din在传输结束后在输出数据dout体现出来,传输时延为1个数据长度。04
uart的优缺点
4.1 uart协议优点
通信只需要两条数据线;无需时钟信号;有奇偶校验位,方便通信的差错检查;只需要接收端和发送端设置好数据包结构,即可稳定通信。4.2 uart协议缺点
数据帧最大支持9位数据;不支持多主机或多从机的主从系统。

放大器定义、分类和选择使用
耐世特推出模块化齿条式电动助力转向系统
4G时代标配:多模多频LTE基带芯片
可穿戴心电图补片可助力心房颤动的诊断
电磁干扰滤波器的作用是什么?
解析常用串行总线——UART协议(下)
PFC升压预变换电路
气体质量流量控制器在燃汽轮机氢气质量流量和控制中的技术方案
LED圆柱屏的特点有哪些
ios10.3.2最新消息:苹果ios10.3.2正式版修复BUG有功,ios10.3.3正式版半路截胡,该不该升?
微波消解仪市场广阔 企业应加速布局
区块链技术未来10-15年的发展指向标
5G竞争,网络建设先行!中国移动决心在5G时代争先
S3C2440的中断寄存器的分类及中断的过程分析
可调电源幅值、频率的陀螺电机
逆变器OEM/ODM生产厂家哪家好
无线对讲机日常使用中的常见问题及正确的操作方法经验分享(下)
使用oprofile对软件做profiling
SDCardUtils封装类应用:设备信息获取实现方法
带你快速了解国内首个加密级数字资产交易平台正式上线!