【点滴积累FPGA】C语言里的状态机和HDL语言里的状态机
要做一个程序,首先要有思路和步骤,然后再实现.而无论是采用c语言还是pascal以及其他都是这思路和步骤的描述.同样,做为已经数字电路系统的设计,采用verilog和vhdl进行描述也是等效的,就是把你的关于电路结构的描述告诉综合器.所以我在这里只讨论思路,而不去在乎具体是那种硬件描述语言的实现.我们做的大多数的计算机的程序都是串性执行的,而硬件描述语言的最大不同是采用了并行执行的方法.而这里要说的有限状态机器则是在思路上将并行转为串性的有效方法.
看一下一个简单的c语言程序 :
#define STATE_IDLE 0X00
#define STATE_1 OX01
#define STATE_20X02
#define STATE_30X04
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_24'b0100
#define STATE_34'b1000
always @(posedge clk or posedge rst);
reg 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 someother thingext.
end
end
end
分别对应上面分析c语言程序段落的四个特性,
1,这实际也是一个死循环,是在每一个时钟周期到来的时候执行一次.
2,也有多个状态,是有输入和当前状态决定的.
3,用判断语句分支下一个状态和输出
4,在rst的上升边缘对state变量进行了初始化.
硬件状态机和单指令流机器上运行的状态相比,处理速度快以外,还可以在一个硬件芯片里面配制多个状态机,之间的通过定义wire联系起来,对一个状态机来说,其它状态机的输出可以当作一个普通的输入,和管脚输入不加区别.
有了这些知道思想,在编程的时候可以可以分两部分来设计硬件状态机,
1,首先考虑对外的接口,这要有全局的思想,要求把一个工作分成几个部分来运行并且个部分之间要有序联系,相互制约.这有点类似于工业控制上多处理器系统的设计和构造.
2.内部逻辑的实现.首先要清楚的划分几个状态,再确定转化的条件.要是比较复杂的状态机可以做出状态图.如果能把状态土做的很细微,那么编程的过程也就是一个将图形描述的逻辑用硬件语言描述出来而已.
在数字电路设计中,无论三段还是两段,无论那种都可以用类似与串性语言的有限状态机描述出来,并能很好的工作.
另外还有如何分配工作粒度和提高状态机的工作频率以及如何静态验证状态机的正确性,都是很值得思考的.以后再讨论吧. 顶起来,【点滴积累FPGA】系列很不错,都是楼主原创,再接再砺!! 在 VerilogHDL/VHDL 的代码中,只有声明了时钟沿触发的,才会生成用触发器实现的时序电路。
如果没有声明时钟沿触发,则生成组合逻辑电路。 mark 楼主写的很不错,学习了! 顶楼主,特意把楼主以前的帖子也搜出来看了一遍 细心探究 会算法思想的人是强大的
页:
[1]