2026年,AI开始渗入硬件描述语言。我试了一件之前总要花一整个下午的事:在不翻阅寄存器手册、不手画状态转移图的前提下,用Claude Code写一个UART通信 + 协议解析 + PWM控制的FPGA模块。整个过程更像个真实测试,看看AI到底能给芯片设计帮上多少忙。
引言:Verilog 开发者那些重复的低级错误
做FPGA,串口模块算是入门级。但自己从头写,计数位宽搞错、状态机跳转漏条件、复位极性反着来——这些错误每次至少消耗半小时。Claude Code在软件生成上很猛,但时序逻辑它懂吗?阻塞非阻塞赋值的区别它能分清吗?我拿了一个实际项目,试试它的成色。
项目:从串口到LED的链路
目标很简单:在Xilinx Artix-7上做一个智能呼吸灯控制器。
- 用UART(115200波特率)收上位机指令。
- 解析一个简单包:0xAA(头)+ [PWM亮度值] + 0x55(尾)。
- 根据亮度值控制LED。
- 还要给出ModelSim/Vivado仿真激励。
工具:VS Code + Claude Code插件 + Vivado 2017.4。
开发过程
波特率发生器和UART RX
算分频系数总是烦人。我直接描述需求:
'我需要一个Verilog模块
uart_rx。输入时钟50MHz,波特率115200。需要处理亚稳态(双触发器同步),过采样保证稳定。输出rx_data_valid和rx_data[7:0]。'
Claude Code瞬间返回代码,而且做对了两件事:
- 参数化:
parameter CLK_FREQ,parameter BAUD_RATE,内部算出CLKS_PER_BIT = CLK_FREQ / BAUD_RATE。 - 自动补上两级同步寄存器
r_rx_d1、r_rx_d2,新手最容易忽略这个。
// 同步处理逻辑
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
r_rx_d1 <= 1'b1;
r_rx_d2 <= 1'b1;
end else begin
r_rx_d1 <= rx_in;
r_rx_d2 <= r_rx_d1; // 同步处理
end
end
省掉了按计算器的10分钟。
让AI写三段式状态机
协议解析是核心,要处理帧头帧尾判断,还得管理状态。
Prompt:
'编写一个名为
cmd_parser的模块。接收rx_data和rx_valid。实现三段式状态机:IDLE -> WAIT_HEAD(检测 0xAA) -> WAIT_DATA -> WAIT_TAIL(检测 0x55) -> UPDATE。只有完整收完一包后才更新输出led_pwm_duty。'
生成的状态机逻辑相当清晰,用 localparam 定义状态,风格参考了教科书:
// FSM 逻辑
localparam IDLE = 3'd0;
localparam CHECK_HEAD = 3'd1;
localparam GET_DATA = 3'd2;
// ...
always @(*) begin
next_state = current_state;
case (current_state)
IDLE: begin
if (rx_valid && rx_data == 8'hAA) next_state = GET_DATA;
end
GET_DATA: begin
if (rx_valid) next_state = CHECK_TAIL;
end
// ...
// Claude 甚至处理了异常回退逻辑,如果不符合协议直接回 IDLE
endcase
end
有一点需要纠正:最初生成的复位是高电平有效,但我板子是低电平复位。我补了一句:'所有复位逻辑改成 negedge rst_n。' 它在几秒内完成全局替换。


