远程FPGA虚拟实验平台用SystemVerilog HDL实现彩灯控制器
前言:本次实验要交一个jvp,一个rbf,一个sv,主要是靠自己画一个好看的jvp来展示实验内容,代码没什么大用处。代码我给了两套:五角星和时钟,五角星就是十个灯版本的简易彩灯,时钟是带了个进位的不标准彩灯,五角星的jvp在原理里给了,自提。
原理
实验材料
材料给的彩灯控制器是一个三段式的状态机,即:
状态转换,包括复位和其他特殊状态,对state进行控制;
状态计算,对next_state进行控制;
输出逻辑,根据state来输出。
实验要求我们写三段的。而实验材料的具体状态图还是看慕课吧。
wire reset = PB[0];
wire clk; // = PB[1];
wire direction = S[8];
/************* The logic of this experiment *************/
/* 对10MHz系统时钟进行分频,使用分频后的时钟作为移位寄存器的时钟。
分频系数为10M,输出的clkout的频率为1Hz。 */
ClockDivider #(.RATIO(10000000)) divider_inst(.ClkIn(CLOCK), .Reset(reset), .ClkOut(clk));
// Finite State Machine
wire [7:0] pattern;
enum bit [3:0] {
//枚举,state和next_state能有的四种状态
STATE0 = 4'b0001,//用ont hot编码表示的状态,一串里就一个有效的一种编码,表示少还行,多了很长
STATE1 = 4'b0010,
STATE2 = 4'b0100,
STATE3 = 4'b1000
} state, next_state;
always_ff @(posedge clk, posedge reset)//1.状态转换
begin
if (reset)//复位,一个状态机得有个好的初始状态
state <= STATE0;
else
state <= next_state;
end
always_comb//2.次态计算,这边用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;