彩灯控制器实验

实验目的

(1) 掌握用状态机设计控制器的方法;

(2) 学会使用HDL语言描述有限状态机。

参考设计

参考设计用状态机设计了一个简单的彩灯控制器,虚拟面板效果如图 1

image
图 1. 彩灯控制器参考设计的运行效果

彩灯的移动方向由开关Direction控制,当Direction=0时LED由外向内移动,Directionr=1时LED由内向外移动。

状态图如图 2所示。

彩灯控制器状态图
图 2. 彩灯控制器参考设计的状态图

状态转移条件已在图上给出,输出是LED的花型oPattern,各个状态下的输出值见下表。

STATE0 STATE1 STATE2 STATE3

oPattern

10000001

01000010

00100100

00011000

例 1给出了该彩灯控制器的设计代码。理解设计代码,学会使用HDL语言描述有限状态机。

例 1. 彩灯控制器参考设计的代码
/****** Replace input ports with internal signals *******/
wire reset =  PB[0];
wire direction = S[8];

/************* The logic of this experiment *************/
wire clk;
/* 对10MHz系统时钟进行分频,使用分频后的时钟作为移位寄存器的时钟。
   分频系数为10M,输出的clkout的频率为1Hz。 */
ClockDivider #(.RATIO(10000000)) divider_inst(.ClkIn(CLOCK), .Reset(reset), .ClkOut(clk));

// Finite State Machine
logic [7:0] pattern;
enum bit [3:0] {
    STATE0   = 4'b0001,
    STATE1   = 4'b0010,
    STATE2   = 4'b0100,
    STATE3   = 4'b1000
} state, next_state;

always_ff @(posedge clk, posedge reset)
begin
	if (reset)
		state <= STATE0;
	else
		state <= next_state;
end

always_comb
begin : set_next_state
    case (state)
    STATE0: begin
        if (direction==0)
            next_state = STATE1;
        else 
            next_state = STATE3;
        end
    STATE1: begin
        if (direction==0)
            next_state = STATE2;
        else 
            next_state = STATE0;
        end
    STATE2: begin
        if (direction==0)
            next_state = STATE3;
        else 
            next_state = STATE1;
        end
    STATE3: begin
        if (direction==0) 
            next_state = STATE0;
        else 
            next_state = STATE2;
        end
    endcase 
end : set_next_state

always_comb
begin : set_outputs
    case (state)
    STATE0: begin
        pattern = 8'b1000_0001;
        end
    STATE1: begin
        pattern = 8'b0100_0010;
        end
    STATE2: begin
        pattern = 8'b0010_0100;
        end
    STATE3: begin
        pattern = 8'b0001_1000;
        end
    endcase
end : set_outputs

/***** Internal signals assignment to output ports ******/
assign L[7:0] = pattern;

实验任务

  1. 设计自己的彩灯控制器方案,控制LED灯实现一种或多种演示花型。设计的演示花型要有规律,视觉效果好,有一定的复杂度。设计虚拟面板展示彩灯效果,可使用最多36个LED,两种颜色,结合背景图摆放为有创意的图案。

  2. 用状态机的方法实现自己的彩灯控制器。

先画状态图再写Verilog代码,采用3段式结构描述状态机。