239|1

51

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

【microchip PolarFire SoC FPGA 套件】简单uart的实现 [复制链接]

在进行 UART 模块功能测评时,首先需要搭建测试环境。硬件方面通过usb转ttl连接开发板的 TX、RX、GND 引脚至电脑 USB 接口,使用 USB Type-C 线供电并确保 J47 跳线默认连接 USB Type-C 端口。使用串口助手进行测试。
UART 模块由 TX、RX 和 TOP 三个独立模块组成。
TX 模块负责将并行数据转换为串行数据发送。代码中通过参数化设计,支持 115200bps 的波特率,时钟频率为 50_000_000Hz。它采用状态机实现数据发送流程,定义了五个状态:TX_IDLE(空闲状态)、TX_START(起始位发送状态)、TX_DATA(数据位发送状态)、TX_STOP(停止位发送状态)和 TX_CLEAN(清理状态)。

在空闲状态下,若 tx_en 信号有效,则将待发送的并行数据 tx_data 存入 tx_shift_reg,并进入起始位发送状态,将 tx 信号拉低表示起始位。在起始位和数据位发送状态中,通过 tx_baud_cnt 计数器对时钟进行计数,当计数值达到 BAUD_DIV(时钟频率与波特率的比值)时,进行相应的状态转换和数据移位操作。在停止位发送状态,将 tx 信号拉高,发送停止位。最后在清理状态将 tx_done 信号置高,表示发送完成,并回到空闲状态。
module uart_tx #(
parameter BAUD_RATE = 115200,
parameter CLK_FREQ = 50_000_000
) (
input wire clk,
input wire rst_n,
input wire [7:0] tx_data,
input wire tx_en,
output reg tx,
output reg tx_done
);
localparam BAUD_DIV = CLK_FREQ / BAUD_RATE;
localparam [2:0]
TX_IDLE = 3'b000,
TX_START = 3'b001,
TX_DATA = 3'b010,
TX_STOP = 3'b011,
TX_CLEAN = 3'b100;
reg [2:0] tx_state;
reg [15:0] tx_baud_cnt;
reg [3:0] tx_bit_cnt;
reg [7:0] tx_shift_reg;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
tx_state <= TX_IDLE;
tx_baud_cnt <= 0;
tx_bit_cnt <= 0;
tx_shift_reg <= 0;
tx <= 1'b1;
tx_done <= 0;
end else begin
case (tx_state)
TX_IDLE: begin
tx_done <= 0;
if (tx_en) begin
tx_shift_reg <= tx_data;
tx_bit_cnt <= 0;
tx_baud_cnt <= 0;
tx_state <= TX_START;
tx <= 0;
end
end
TX_START: begin
if (tx_baud_cnt == BAUD_DIV - 1) begin
tx_baud_cnt <= 0;
tx_state <= TX_DATA;
end else begin
tx_baud_cnt <= tx_baud_cnt + 1;
end
end
TX_DATA: begin
if (tx_baud_cnt == BAUD_DIV - 1) begin
tx <= tx_shift_reg[0];
tx_shift_reg <= tx_shift_reg >> 1;
tx_baud_cnt <= 0;
if (tx_bit_cnt == 7) begin
tx_bit_cnt <= 0;
tx_state <= TX_STOP;
end else begin
tx_bit_cnt <= tx_bit_cnt + 1;
end
end else begin
tx_baud_cnt <= tx_baud_cnt + 1;
end
end
TX_STOP: begin
tx <= 1;
if (tx_baud_cnt == BAUD_DIV - 1) begin
tx_state <= TX_CLEAN;
tx_baud_cnt <= 0;
end else begin
tx_baud_cnt <= tx_baud_cnt + 1;
end
end
TX_CLEAN: begin
tx_done <= 1;
tx_state <= TX_IDLE;
end
default: tx_state <= TX_IDLE;
endcase
end
end
endmodule
RX 模块将串行数据转换为并行数据接收。同样采用参数化设计,支持 115200bps 波特率和 50_000_000Hz 时钟频率。使用状态机实现接收流程,定义了五个状态:RX_IDLE(空闲状态)、RX_START(起始位检测状态)、RX_DATA(数据位接收状态)、RX_STOP(停止位接收状态)和 RX_CLEAN(清理状态)。

在空闲状态下,若检测到 rx 信号变低(起始位),则将 rx_baud_cnt 计数器初始化为 BAUD_DIV / 2,进入起始位检测状态。在起始位检测状态中,若在中间时刻 rx 信号仍为低,则确认起始位有效,进入数据位接收状态。在数据位接收状态,通过 rx_baud_cnt 计数器计数,当计数值为 0 时,将 rx 信号的值存入 rx_shift_reg 相应位。在停止位接收状态,若计数完成,则将 rx_shift_reg 的值赋给 rx_data,并将 rx_done 信号置高,表示接收完成,最后进入清理状态回到空闲状态。
module uart_rx #(
parameter BAUD_RATE = 115200,
parameter CLK_FREQ = 50_000_000
) (
input wire clk,
input wire rst_n,
input wire rx,
output reg [7:0] rx_data,
output reg rx_done
);
localparam BAUD_DIV = CLK_FREQ / BAUD_RATE;
localparam [2:0]
RX_IDLE = 3'b000,
RX_START = 3'b001,
RX_DATA = 3'b010,
RX_STOP = 3'b011,
RX_CLEAN = 3'b100;
reg [2:0] rx_state;
reg [15:0] rx_baud_cnt;
reg [3:0] rx_bit_cnt;
reg [7:0] rx_shift_reg;
reg rx_sync;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
rx_sync <= 1;
end else begin
rx_sync <= rx;
end
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
rx_state <= RX_IDLE;
rx_baud_cnt <= 0;
rx_bit_cnt <= 0;
rx_shift_reg <= 0;
rx_data <= 0;
rx_done <= 0;
end else begin
case (rx_state)
RX_IDLE: begin
rx_done <= 0;
if (!rx_sync) begin
rx_baud_cnt <= BAUD_DIV / 2;
rx_state <= RX_START;
end
end
RX_START: begin
if (rx_baud_cnt == 0) begin
if (!rx_sync) begin
rx_baud_cnt <= BAUD_DIV - 1;
rx_state <= RX_DATA;
rx_bit_cnt <= 0;
end else begin
rx_state <= RX_IDLE;
end
end else begin
rx_baud_cnt <= rx_baud_cnt - 1;
end
end
RX_DATA: begin
if (rx_baud_cnt == 0) begin
rx_shift_reg[rx_bit_cnt] <= rx_sync;
rx_baud_cnt <= BAUD_DIV - 1;
if (rx_bit_cnt == 7) begin
rx_state <= RX_STOP;
end else begin
rx_bit_cnt <= rx_bit_cnt + 1;
end
end else begin
rx_baud_cnt <= rx_baud_cnt - 1;
end
end
RX_STOP: begin
if (rx_baud_cnt == 0) begin
rx_data <= rx_shift_reg;
rx_done <= 1;
rx_state <= RX_CLEAN;
end else begin
rx_baud_cnt <= rx_baud_cnt - 1;
end
end
RX_CLEAN: begin
rx_state <= RX_IDLE;
end
default: rx_state <= RX_IDLE;
endcase
end
end
endmodule
TOP 模块整合了 TX 和 RX 模块,实现双向通信控制。它支持中断或轮询模式,通过关键信号 TXD、TX_EN、TX_DONE、RXD、RX_VALID 和 RX_OVERFLOW 进行通信控制。在代码中,当 rx_done 信号有效时,将接收到的并行数据 rx_data 赋值给 tx_data_reg,同时使能 tx_en 信号,触发 TX 模块将接收到的数据原样发送回去,实现双向通信
module top_uart (
input wire clk,
input wire rst_n,
input wire rx,
output wire tx
);
wire [7:0] rx_data;
wire rx_done;
wire tx_done;
wire tx_en;
reg [7:0] tx_data_reg;
// 当接收到数据完成时,将接收到的数据赋值给发送数据寄存器
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
tx_data_reg <= 8'b0;
end else if (rx_done) begin
tx_data_reg <= rx_data;
end
end
// 当接收到数据完成时,使能发送模块
assign tx_en = rx_done;
uart_tx #(
.BAUD_RATE(115200),
.CLK_FREQ(50_000_000)
) uart_tx_inst (
.clk(clk),
.rst_n(rst_n),
.tx_data(tx_data_reg),
.tx_en(tx_en),
.tx(tx),
.tx_done(tx_done)
);
uart_rx #(
.BAUD_RATE(115200),
.CLK_FREQ(50_000_000)
) uart_rx_inst (
.clk(clk),
.rst_n(rst_n),
.rx(rx),
.rx_data(rx_data),
.rx_done(rx_done)
);
endmodule
对于引脚的设置,参照手册如下:
硬件连接完成后,打开串口工具选择正确的 COM 端口,设置波特率为 115200bps、数据位 8 位、停止位 1 位、无校验及无流控。功能测试时,通过 TOP 模块发送预设数据 “test”,串口工具正确显示发送的数据且 TX_DONE 信号在发送完成后置高,验证了 TX 功能;通过串口工具发送数据 “Test RX”,TOP 模块成功接收数据且 RX_VALID 信号有效,验证了 RX 功能;双向通信测试中,TOP 模块与串口工具间数据传输无误,双向通信正常。
本次测评结果表明,UART 模块实现了基本的 TX、RX 功能,支持双向通信,在标准波特率下稳定运行,但高速传输时需优化硬件或软件配置。后续可通过添加 CRC 校验、扩展 FIFO 深度或采用中断驱动机制提升模块的可靠性和吞吐量。

查看本帖全部内容,请登录或者注册
此帖出自FPGA/CPLD论坛

最新回复

收集的资料很全面,值得学习学习,收藏了,谢谢提供资料  详情 回复 发表于 4 天前
点赞 关注
 

回复
举报

29

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
收集的资料很全面,值得学习学习,收藏了,谢谢提供资料
此帖出自FPGA/CPLD论坛
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播报名| TI 面向楼宇和工厂自动化行业的毫米波雷达解决方案
【内容简介】TI 60GHz IWRL6432和 IWRL1432毫米波雷达传感器如何帮助解决楼宇和工厂自动化应用中的感应难题
【直播时间】5月28日(周三)上午10:00
【直播礼品】小米双肩包、contigo水杯、胶囊伞、安克充电器

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 12

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表