本帖最后由 lcq5070 于 2009-9-20 21:08 编辑
//三段式状态机三分频(占空比1/3)实现
//代码如下:
module div_fsm3(clk,rst_n,div3);
input clk,rst_n;
output div3;
reg div3;
parameter[1:0] S0=2'd0,
S1=2'd1,
S2=2'd2;
reg[1:0] current_state;
reg[1:0] next_state;
//第一个进程,同步时序always模块,格式化描述次态寄存器迁移到现态寄存器
always @ (posedge clk or negedge rst_n) //异步复位
begin
if(!rst_n)
current_state <= S0;
else
current_state <= next_state; //注意,使用的是非阻塞赋值
end
//第二个进程,组合逻辑always模块,描述状态转移条件判断
always @ (current_state) //电平触发
begin
next_state = S0; //要初始化,使得系统复位后能进入正确的状态
case(current_state)
S0:begin
next_state=S1;
end
S1:begin
next_state=S2;
end
S2:begin
next_state=S0;
end
endcase
end
//第三个进程,同步时序always模块,格式化描述次态寄存器输出
always @ (posedge clk)
begin
case(next_state)
S0:div3 <= 1'b0; //注意是非阻塞逻辑
S1:div3 <= 1'b0;
S2:div3 <= 1'b1;
default:div3 <= 0;
endcase
end
endmodule |