查看: 894|回复: 0
打印 上一主题 下一主题

【点滴积累FPGA】C语言里的状态机和HDL语言里的状态机

[复制链接]
跳转到指定楼层
沙发
发表于 2016-3-29 12:31:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
要做一个程序,首先要有思路和步骤,然后再实现.而无论是采用c语言还是pascal以及其他都是这思路和步骤的描述.同样,做为已经数字电路系统的设计,采用verilog和vhdl进行描述也是等效的,就是把你的关于电路结构的描述告诉综合器.所以我在这里只讨论思路,而不去在乎具体是那种硬件描述语言的实现.

我们做的大多数的计算机的程序都是串性执行的,而硬件描述语言的最大不同是采用了并行执行的方法.而这里要说的有限状态机器则是在思路上将并行转为串性的有效方法.

看一下一个简单的c语言程序 :
#define STATE_IDLE 0X00
#define STATE_1   OX01
#define STATE_2  0X02
#define STATE_3  0X04
static u8_t state = STATE_IDLE;
state_machine()
{
while(1){
if (state==STATE_IDLE)
{
if (getchar()=='1')
state = STATE_0X01;
}
else if (state==STATE_1)
{
if (getchar() =='2')
{
//check some input
//and output something
}}}}
认真看看上面的程序代码就可以总结出下面的几点特性:
1,这是一个死循环
2,这个程序有多个状态,下一个状态总是有当前的状态以及当前的输入所确定的.
3,每一次循环最多有一个条件if成立,执行完了条件的执行体以后就开始了下一轮的循环.
4,状态标志state要有个最初的赋值.

这种程序状态机设计方法在c语言类串性编程语言中有一定的应用,但是更多的是在硬件编程序上得到了应用.这是由于上面分析的特性决定的.

同样我们再仿照上面的c语言代码写一个verilog实现状态机的代码.

#define STATE_IDLE 4'b0000
#define STATE_1   4'b0010
#define STATE_2  4'b0100
#define STATE_3  4'b1000

always @(posedge clk or posedge rst);
reg [3:0] state ;
begin
if (rst)begin
state = 0;
//and do some other initiations
end ;
else if (state==STATE_1)
begin
if (input ==1)//illustate some conditions
begin
state=STATE_2;
end
else if ()//some other conditions
begin
//state = STATE_3;
//and do some  other thing  ext.
end
end
end

分别对应上面分析c语言程序段落的四个特性,
1,这实际也是一个死循环,是在每一个时钟周期到来的时候执行一次.
2,也有多个状态,是有输入和当前状态决定的.
3,用判断语句分支下一个状态和输出
4,在rst的上升边缘对state变量进行了初始化.

硬件状态机和单指令流机器上运行的状态相比,处理速度快以外,还可以在一个硬件芯片里面配制多个状态机,之间的通过定义wire联系起来,对一个状态机来说,其它状态机的输出可以当作一个普通的输入,和管脚输入不加区别.


有了这些知道思想,在编程的时候可以可以分两部分来设计硬件状态机,

1,首先考虑对外的接口,这要有全局的思想,要求把一个工作分成几个部分来运行并且个部分之间要有序联系,相互制约.这有点类似于工业控制上多处理器系统的设计和构造.

2.内部逻辑的实现.首先要清楚的划分几个状态,再确定转化的条件.要是比较复杂的状态机可以做出状态图.如果能把状态土做的很细微,那么编程的过程也就是一个将图形描述的逻辑用硬件语言描述出来而已.

在数字电路设计中,无论三段还是两段,无论那种都可以用类似与串性语言的有限状态机描述出来,并能很好的工作.

另外还有如何分配工作粒度和提高状态机的工作频率以及如何静态验证状态机的正确性,都是很值得思考的.以后再讨论吧.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表