Alchitry Au V2 FPGA Demo Parte 3 (Moore Finite State Machine)

En este articulo estaremos demonstrando un demo de una maquina de estados finitos tipo Moore para la plataforma Alchitry Au V2 FPGA Development Board (Xilinx Artix 7)

image

La plataforma Alchitry Au V2 FPGA Development Board (Xilinx Artix 7) fue cubierta previamente en la Parte 1 y la Parte 2. Este demo en particular utilizara el Windows PowerShell para desarollar una maquina de estados finitos tipo Moore en el siguiente diagrama desarrollado para un previo demo de la plataforma Lattice ICE40 FPGA Ultraplus Board,

Antes de proceder con este articulo, el primer paso es instalar Vivado en un computadora de Windows. Entonces se incluyen los siguientes “paths” para el ambiente de Windows,

C:\AMDDesignTools\2025.2\Vivado\bin
C:\AMDDesignTools\2025.2\Vivado\doc\eng\man

El siguiente demo incluye los siguientes archivos en el direcotrio del projecto de su seleccion,

build.tcl
program-board.tcl
build-program.tcl
constraints.xdc
top.sv
moore_fsm.sv

El System Verilog HDL para esta maquina de estados finitos se denomino moore_fsm.sv donde los nombres de los estados fueron cambiados a ONE, TWO y THREE de (RED, BLUE, GREEN) para este demo (ya esta plataforma tiene todos LEDs verdes) como se muestra a continuacion,

`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

La entrada que controla las transiciones de los estados fue conectada al boton de Reset en la plataforma Alchitry Au V2 FPGA Development Board (Xilinx Artix 7). Un contador auxiliar disminuye la frecuencia del reloj para propositos de visualizacion solamente, como se muestra en el siguiente archivo System Verilog HDL de este demo 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

Ahora se incluye el siguiente archivo constraints.xdc en el mismo directorio del projecto,

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]}]

Entonces se crea el siguiente archivo que es un “batch file” demonimado build.tcl para este projecto desde el Windows PowerShell,

# 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"

Este archivo batch procesa los 2 archivos listados de System Verilog HDL files para este demo, las restricciones relevantes, solicita el proceso de sintesis para el xc7a35tftg256-3 FPGA/HPS, realiza “place and route” y genera el bitstream llamdo top.bit que sera usado en el siguiente paso para programar la plataforma.

Para ejecutar este archivo “batch” se utiliza Vivado desde el Windows PowerShell de esta forma,

\project> vivado -mode batch -source build.tcl

Este proceso toma tiempo dependiendo del tipo de computadora utilizada para este proposito. Despues de completado este proceso, estamos listos para programar la plataforma Alchitry Au V2 FPGA Development Board (Xilinx Artix 7) con el siguiente archivo “batch” program-board.tcl,

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]

Este archivo fue ejecutado desde el Windows PowerShell de esta manera,

\project> vivado -mode batch -source program-board.tcl

Ambos archivos build.tcl y program-board.tcl se pueden unir en un solo archivo para que automaticamente se realizen estos pasos de construir y programar la plataforma, en este caso denominado 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]

Para usar este archivo “batch”, se emite el siguiente comando,

\project> vivado -mode batch -source build-program.tcl

El previo video muestra la implementacion de la maquina de estados finitos tipo Moore en la plataforma Alchitry Au V2 FPGA. El boton de Reset de entrada fue oprimido en varias ocasiones para demostrar que el estado cambia en base a esa entrada.

Hemos completado el demo de la maquina de estados finitos tipo Moore para la plataforma Alchitry Au V2 FPGA Development Board (Xilinx Artix 7).

La platforma Alchitry Au V2 FPGA es una portatil, expandible y poderosa y esta disponible en DigiKey.

Que tenga un buen dia.

This article is available in english here.

Este articulo esta disponible en ingles aqui.

1 Like