Alchitry Au V2 FPGA 演示(第三部分:摩尔有限状态机)

在本文中,我们将演示如何在 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 发售