串行接口是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件。
在FPGA入门阶段,UART通讯协议是必学的知识,因为很多模块都是使用UART协议进行传输的,详细的这里我就不再多做介绍了,先贴上我的代码模板再慢慢做解释。
协议发送原理:
在串口通信中波特率表示每秒能传输的数据位,9600就是每秒能传输9600位,1word=2byte、1byte=8bit,这里的9600位指的是9600bit。
每个开发板上都有它的系统时钟,初级阶段本人用的是basys2开发板,对于入门的种子选手是个不错的开端,此款开发板的系统时钟是50MHZ,我们假定波特率是9600bit/s传输,那么传输1bit就需要50M/9600个时钟周期。
依次推理,每传输1bit需要 **“系统时钟/波特率”**个时钟周期。
先来关于字节的发送,代码如下:
//-------1字节数据的发送-------
module uart_tx(
input clk,
input rst_n,
input cnt_start, //发送使能
input [7:0]tx_data,
output reg tx,
output reg tx_done //传输一个字节完成标志
);
reg [12:0]cnt_bps;
parameter bps_t = 13'd5207; //传输1bit所需计数值
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt_bps <= 13'd0;
else if(cnt_bps == bps_t)
cnt_bps <= 13'd0;
else if(cnt_start)
cnt_bps <= cnt_bps + 1'b1;
else
cnt_bps &