16路串口光纤通信FPGA项目实现指南 - 第二部分(下)
五、核心控制逻辑实现(接收部分)
5.4 数据接收控制逻辑
// 接收数据寄存逻辑
reg rs422_rx_valid; // 接收数据有效信号
reg [15:0] rs422_rx_data; // 接收数据寄存器
// 在Aurora用户时钟域下同步接收数据
always @ (posedge user_clk_i or posedge rst) begin
if(rst) begin
rs422_rx_valid <= 1'b0; // 复位时清零
rs422_rx_data <= 16'b0;
end else if(CHANNEL_UP) begin
rs422_rx_valid <= rx_tvalid_i; // Aurora接收数据有效信号
rs422_rx_data <= rx_tdata_i; // Aurora接收数据
end else begin
rs422_rx_valid <= 1'b0;
rs422_rx_data <= 16'b0;
end
end
语法说明:
always @ (posedge clk or posedge rst)
:时钟上升沿或复位时触发。rx_tvalid_i
/rx_tdata_i
:Aurora AXI-Stream接收接口信号。
5.5 接收FIFO与串口发送输出
// 接收FIFO实例化,实现跨时钟域缓存
// user_clk_i为写时钟,proc_clk为读时钟
wire rs422_rx_empty;
wire rs422_rx_fifo_prog_empty;
reg rs422_rx_rd_en;
wire [15:0] uart_tx_dout;
aurora_rs422_rx_fifo inst_rs422_rx_fifo (
.rst(rst),
.wr_clk(user_clk_i),
.rd_clk(proc_clk),
.din(rs422_rx_data),
.wr_en(rs422_rx_valid),
.rd_en(rs422_rx_rd_en),
.dout(uart_tx_dout),
.full(),
.empty(rs422_rx_empty),
.prog_empty(rs422_rx_fifo_prog_empty)
);
// 接收FIFO读控制状态机
reg rd_state;
always@(posedge proc_clk or posedge rst) begin
if(rst) begin
rd_state <= 1'b0;
rs422_rx_rd_en <= 1'b0;
end else if(channel_up_reg) begin
case(rd_state)
1'b0 : begin
if(rs422_rx_fifo_prog_empty == 1'b0) begin
rd_state <= 1'b1;
rs422_rx_rd_en <= 1'b1;
end else begin
rd_state <= 1'b0;
rs422_rx_rd_en <= 1'b0;
end
end
1'b1 : begin
rd_state <= 1'b1;
rs422_rx_rd_en <= 1'b1;
end
endcase
end else begin
rd_state <= 1'b0;
rs422_rx_rd_en <= 1'b0;
end
end
// 串口发送数据输出控制
always@(posedge proc_clk or posedge rst) begin
if(rst) begin
uart_tx <= 16'hffff; // 复位时输出高电平(空闲)
end else if(channel_up_reg) begin
uart_tx <= uart_tx_dout; // 输出FIFO读出的数据
end else
uart_tx <= 16'hffff; // 通道未建立时输出高电平
end
语法说明:
aurora_rs422_rx_fifo
:接收FIFO,跨时钟域缓存。rd_en
/wr_en
:读/写使能。uart_tx
:最终输出到串口的发送数据。
六、系统集成与调试功能
6.1 ILA调试核配置
# ILA调试核0配置 - 用于调试Aurora通信
create_debug_core u_ila_0 ila
set_property C_DATA_DEPTH 1024 [get_debug_cores u_ila_0]
# 连接关键信号作为探针
connect_debug_port u_ila_0/clk [get_nets user_clk_i]
connect_debug_port u_ila_0/probe0 [get_nets rx_tdata_i]
connect_debug_port u_ila_0/probe1 [get_nets tx_tdata_i]
connect_debug_port u_ila_0/probe2 [get_nets CHANNEL_UP]
语法说明:
create_debug_core
:创建ILA调试核。connect_debug_port
:连接信号到ILA探针。
6.2 ILA调试核1配置
# ILA调试核1配置 - 用于调试串口和LED控制
create_debug_core u_ila_1 ila
set_property C_DATA_DEPTH 1024 [get_debug_cores u_ila_1]
connect_debug_port u_ila_1/clk [get_nets clk_50m]
connect_debug_port u_ila_1/probe0 [get_nets uart_rx_led_flag]
connect_debug_port u_ila_1/probe1 [get_nets uart_tx_led_flag]
connect_debug_port u_ila_1/probe2 [get_nets rst_cnt]
七、项目特点与技术创新
7.1 技术特点总结
- 模块化设计:顶层、Aurora接口、控制、FIFO等分工明确
- IP核复用:时钟、FIFO、Aurora等全部用Xilinx官方IP
- 16路并行:所有串口和LED完全并行处理
- 边沿检测+状态机:高效检测信号变化,智能LED闪烁
- 时钟域同步:FIFO跨时钟域,数据安全可靠
7.2 关键技术实现
- 边沿检测算法:二级寄存器+异或判断,精确捕捉信号变化
- 状态机设计:两状态自动切换,逻辑清晰
- FIFO跨时钟域同步:防止亚稳态,保证数据完整性
7.3 应用价值与扩展性
- 工业通信、数据采集、远程监控等场景
- 可扩展串口数量、协议类型、功能模块
八、项目总结
本项目实现了16路RS422串口光纤通信,具备高速、可靠、可视化、易调试等特点,适合工业和科研场景。设计采用模块化、IP核复用、并行处理、智能状态指示等现代FPGA开发最佳实践。
文档结束,感谢阅读!