前言
本次分享的是 2023 年全国大学生电子设计竞赛 H 题(信号分离装置)的 FPGA+STM32 协同设计方案。题目要求从混合信号 C 中解调出原始的两路波形 A'和 B'。除了增益为 1 的加法器部分外,核心处理逻辑均由 FPGA 与 STM32 配合完成。
题目背景
系统需从信号发生器输出的两路波形 A 和 B 经加法器生成信号 C,任务是从 C 中还原出 A'和 B'。由于重构波形与原信号时钟不同步,存在相位漂移风险,因此需要引入锁相机制。

系统架构
整体数据流向如下: C 信号 → 高速 ADC → FPGA → FIFO → 串口 → STM32 → FFT 识别 → 串口回传 → DDS 重构 → 锁相环 → 高速 DAC → A', B'
通信链路设计
FPGA 与 STM32 之间的数据交互是系统的神经中枢。考虑到采样率(1MHz)与串口波特率(115200)的差异,我们采用了异步 FIFO 进行跨时钟域缓冲。
1. FPGA 端 FIFO 与串口收发
写入速率匹配 ADC 采样频率 1MHz,读取速率适配串口发送 12.5KHz。这里以 AX7035B 开发板为例,状态机控制 FIFO 的读写使能。
assign ad9238_clk_ch0 = clk_1M;
wire wr_en, rd_en, full, empty;
reg [7:0] w_data;
localparam W_IDLE = 1, W_FIFO = 2;
reg[2:0] write_state, next_write_state;
always@(posedge clk_1M or negedge rst) begin
if(rst == 1'b0) write_state <= W_IDLE;
else write_state <= next_write_state;
end
always@(*) begin
case(write_state)
W_IDLE: if(empty == 1'b1) next_write_state <= W_FIFO;
else next_write_state <= W_IDLE;
W_FIFO: if(full == 1'b1) next_write_state <= W_IDLE;
else next_write_state <= W_FIFO;
default: next_write_state <= W_IDLE;
endcase
end
assign wr_en = (next_write_state == W_FIFO) ? 1'b1 : 1'b0;
串口发送模块采用标准 UART 协议,注意 tx_valid 信号的时序对齐,避免丢包。
uart_tx#(.CLK_FRE(50), .BAUD_RATE(115200)) uart_tx(
.clk(clk), .rst_n(rst), .tx_data(tx_data),
.tx_data_valid(tx_valid), .tx_pin(tx_pin)
);


