本文主要是介绍FPGA状态机 clk_divider_3_fsm,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
此图仅供参考,程序中3个always@语句,分别完成激励方程、转换方程和输出方程的功能。
Verilog程序
module clk_divider_3_fsm (
input sys_clk,
input sys_rst_n,
output reg clk_divider_3 //输出时钟信号3分频
);
//parameter
parameter S0 = 3'b001;
parameter S1 = 3'b010;
parameter S2 = 3'b100;
//reg
reg [2:0] curr_st;
reg [2:0] next_st;
//**************always@分别激励方程、转换方程和输出方程**********************//
//激励方程----输入端的信号,类似于D端
always@(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
curr_st<=S0;
else
curr_st<=next_st;
end
//转换方程----输出端的信号,类似于Q端
always@(*) begin
case(curr_st)
S0: next_st = S1;
S1: next_st = S2;
S2: next_st = S0;
default : next_st = S0;
endcase
end
//输出方程----,类似于Z端
always@(posedge sys_clk or negedge sys_rst_n) begin //输出时钟3分频信号
if(!sys_rst_n)
clk_divider_3<=1'b0;
else if ( (curr_st==S0) | (curr_st==S1) ) //2个时钟周期高电平
clk_divider_3<=1'b1;
else if ( curr_st==S2 ) //1个时钟周期低电平
clk_divider_3<=1'b0;
else
; //空语句
end
endmodule
SignaltapII仿真结果
仿真数据
仿真设置
致谢
感谢正点原子,欢迎购买开拓者开发板学习。
淘宝店铺:http://openedv.taobao.com 技术论坛:www.openedv.com
这篇关于FPGA状态机 clk_divider_3_fsm的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!