状态机学习笔记——样板<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
 e="Times New Roman">Uart的接收端程序,但状态机总是有很多自己无法解决的警告,想想自己也没正经学过状态机,不如就此机会深入的学习一下状态机。以下是我在学习《Verilog数字系统设计教程》时做的总结。
对于一般的综合工具而言,可以借助于工具自动综合成电路结构的 Verilog模块风格非常有限(怪不得,我以前写的很多程序都调不通)。
对于状态机来说,较为经典的样板如下:
always @ (posedge Clock)
if(!Reset)
begin
state <= Idle;;
/*组合逻辑输出*/
end
else
begin
case(state)
Idle:
if(A)
begin
state <= Start;
/*组合逻辑输出*/
end
else
begin
state <= Idle;
/*组合逻辑输出*/
end
Start:
if(!A)
state <= Stop;
else
state <= Start;
Stop:
if(A)
begin
state <= Clear;
/*组合逻辑输出*/
end
else
begin
state <= Stop;
/*组合逻辑输出*/
end
Clear:
if(!A)
begin
state <= Idle;
/*组合逻辑输出*/
end
else
begin
state <= Clear;
/*组合逻辑输出*/
end
default: state <= 4'bxxxx;
endcase
end
endmodule
在《Verilog数字系统设计教程》这本书中,还介绍了状态机的其他写法,感兴趣的朋友可以去读读有关章节。
在我们为状态编码时,有两种编码方式:①Gray(格雷)码;②独热码。
比如上述的几个状态,用Gray码表示如下:
parameter Idle = 2'b00,
Start = 2'b01,
Stop = 2'b10,
Clear = 2'b11;
用独热码表示如下:
parameter Idle = 4'b1000,
Start = 4'b0100,
Stop = 4'b0010,
Clear = 4'b0001;
虽然使用独热码多了两个触发器,但所用的组合电路可以省一些,因而使电路的速度和可靠性上有明显的提高(组合逻辑电路存在竞争冒险现象),而总的单元数并无显著的增加。
顺便说一件生活中的事,今天吃午饭时,一位60多岁的老人坐到我的旁边,并和我拉起了家常。我们谈了很多有关学校制度上的事,也问了我一些学校的考研情况。我尝试的问了一下他的身份,他只说自己刚来这所学校,是来为大家服务的。但我感觉这位老人不是普通人,下午到学校网站一查发现这位老人竟是我们学校新来的副校长!大热天,60多岁的老人,天天去学生食堂趁着吃饭的功夫和学生交流情感,这样的校长哪里去找。如果将来能碰到这样的老板,那真是三生有幸。
文章评论(0条评论)
登录后参与讨论