彩灯控制器实验
参考设计
参考设计用状态机设计了一个简单的彩灯控制器,虚拟面板效果如图 1。
图 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;