在本文中,我们将演示如何在 Alchitry Au V2 FPGA 开发板 (Xilinx Artix 7) 上实现一个摩尔有限状态机 (Moore Finite State Machine)。
关于该开发板的基础知识已在第一部分和第二部分中介绍。
本次演示将使用 Windows PowerShell 进行开发。该状态机逻辑基于之前在 Lattice iCE40 FPGA UltraPlus 板卡上演示过的状态转移图:
开发环境准备
在开始之前,请确保已在 Windows 计算机上安装 Vivado。然后将以下路径添加到 Windows 环境变量中:
C:\AMDDesignTools\2025.2\Vivado\bin
C:\AMDDesignTools\2025.2\Vivado\doc\eng\man
项目文件清单
请在您的项目目录中准备以下文件:
build.tcl
program-board.tcl
build-program.tcl
constraints.xdc
top.sv
moore_fsm.sv
代码实现
状态机的 SystemVerilog HDL 文件名为 moore_fsm.sv。由于 Alchitry Au V2 板载 LED 均为绿色,我们将原先 demo 中的状态名(红、蓝、绿)更改为 ONE、TWO 和 THREE。
moore_fsm.sv 代码:
`timescale 1ns / 1ps
//Digikey Coffee Cup SystemVerilog HDL Moore State Machine
module Moore(
input logic clk,
input logic reset,
input logic next,
output logic led2, led1, led0
);
typedef enum logic [1:0] {ONE, TWO, THREE} statetype;
statetype state, nextstate;
// state register
always_ff @(posedge clk, posedge reset)
if (reset)
state <= ONE;
else
state <= nextstate;
// next state logic
always_comb
case (state)
ONE: if (next) nextstate = TWO;
else nextstate = ONE;
TWO: if (next) nextstate = THREE;
else nextstate = TWO;
THREE: if (next) nextstate = ONE;
else nextstate = THREE;
default: nextstate = ONE;
endcase
// output logic
assign led0 = ~(state == ONE & state != TWO & state != THREE);
assign led1 = ~(state != ONE & state != TWO & state == THREE);
assign led2 = ~(state != ONE & state == TWO & state != THREE);
endmodule
在顶层文件 top.sv 中,状态转移由板载 Reset 按钮控制。为了便于肉眼观察,我们使用了一个辅助计数器进行分频:
top.sv 代码:
//Digikey Coffee Cup SystemVerilog HDL Moore State Machine
module top(input rst_n, input clk, output[7:0] led);
Moore fsm_sm1(.clk(counter[23]),.reset(1'b0), .next(rst_n), .led2(led[2]), .led1(led[1]), .led0(led[0]));
//Auxiliary counter to divide the clock to be used in the Moore State Machine Demo
reg [23:0] counter;
initial begin
counter = 0;
end
always_ff @(posedge clk)
begin
counter <= counter + 1;
end
endmodule
将以下引脚映射关系保存至 (constraints.xdc)文件夹中:
set_property PACKAGE_PIN N14 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
set_property PACKAGE_PIN P6 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
set_property PACKAGE_PIN K13 [get_ports {led[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}]
set_property PACKAGE_PIN K12 [get_ports {led[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[1]}]
set_property PACKAGE_PIN L14 [get_ports {led[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[2]}]
set_property PACKAGE_PIN L13 [get_ports {led[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[3]}]
set_property PACKAGE_PIN M16 [get_ports {led[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[4]}]
set_property PACKAGE_PIN M14 [get_ports {led[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[5]}]
set_property PACKAGE_PIN M12 [get_ports {led[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[6]}]
set_property PACKAGE_PIN N16 [get_ports {led[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[7]}]
,我们需要创建一个名为 build.tcl 的批处理文件,以便在 Windows PowerShell 中完成项目的构建(Assembling):
# Digikey Coffee Cup SystemVerilog HDL Moore State Machine Batch File
# read design sources (add one line for each file)
read_verilog -sv "top.sv"
read_verilog -sv "moore_fsm.sv"
# read constraints
read_xdc "constraints.xdc"
# synth
synth_design -top "top" -part "xc7a35tftg256-3"
# place and route
opt_design
place_design
route_design
# write bitstream
write_bitstream -force "top.bit"
该脚本会读取演示项目中的 SystemVerilog HDL 文件以及相关的项目约束,随后对 xc7a35tftg256-3 FPGA 执行综合流程,完成布局布线,并最终生成名为 top.bit 的比特流文件。这个比特流文件将在下一步中用于对开发板进行编程。
若要执行此构建脚本,请在 Windows PowerShell 中向 Vivado 发送以下命令:
\project> vivado -mode batch -source build.tcl
处理时间的长短取决于计算机的性能。构建完成后,我们即可准备使用以下 program-board.tcl 文件为 Alchitry Au V2 FPGA 开发板 (Xilinx Artix 7) 进行编程(烧录):
open_hw_manager
connect_hw_server
current_hw_target
open_hw_target
set_property PROGRAM.FILE top.bit [current_hw_device]
program_hw_devices [current_hw_device]
在 Windows PowerShell 中执行如下命令:
\project> vivado -mode batch -source program-board.tcl
此操作将完成对 Alchitry Au V2 FPGA 开发板的编程。
此外,为了实现全自动构建和编程,可以将 build.tcl 和 program-board.tcl 合并为一个名为 build-program.tcl 的脚本:
# Digikey Coffee Cup Build and Program Batch File
# read design sources (add one line for each file)
read_verilog -sv "top.sv"
read_verilog -sv "moore_fsm.sv"
# read constraints
read_xdc "constraints.xdc"
# synth
synth_design -top "top" -part "xc7a35tftg256-3"
# place and route
opt_design
place_design
route_design
# write bitstream
write_bitstream -force "top.bit"
# program
open_hw_manager
connect_hw_server
current_hw_target
open_hw_target
set_property PROGRAM.FILE top.bit [current_hw_device]
program_hw_devices [current_hw_device]
运行该统一脚本,请使用以下命令:
\project> vivado -mode batch -source build-program.tcl
随附的视频展示了 Alchitry Au V2 FPGA 上摩尔有限状态机的运行效果:当 Reset 按钮被按下和释放时,绿色 LED 输出随之发生状态切换。
至此,在 Alchitry Au V2 FPGA 开发板上实现的摩尔有限状态机演示全部结束。
Alchitry Au V2 FPGA 是一款便携、可扩展且功能强大的开发板,现已在 DigiKey 发售

