FPGA与CPU编程有很大不同,但在编程思想上基本上可以借鉴C语言编程。对于FPGA的不同功能块,相互之间时并行执行的,互不干扰;但现实中,实现一个较小的完整的功能块,必然是顺序操作的。
先介绍下主流设计方式。FPGA主要包含三种设计方式:面向状态的设计,面向活动的设计和面向结构的设计。
1)面向状态的设计是以状态机为代表的设计方式,即通过控制信号和时序信号触发状态机进行状态的迁移。状态机的设计是FPGA开发中必不可少的环节。
2)面向活动的设计是以数据流和流程图为代表的设计方式。尤其是在传输系统、实时算法设计中,常使用基于数据流的设计方式。常见的数据流的操作方式包括数据的寄存器同步缓冲、数据传递、数据运算与流水设计、数据的存取等。
3)面向结构的设计常用于较大的系统设计中,用于描述模块与模块、单元与单元之间互联关系,主要包括数据信号与控制信号。根据不同的层次描述,主要可以分为系统及描述、寄存器级结构描述、门级结构描述等。
对比在C语言中,状态机代表不同的情况,活动代表单个模块,结构对应于整个系统中的不同模块。根据C语言顶层设计思想,将系统根据不同功能分为不同功能模块,用不同的函数组成一个功能模块,而函数内部变量用于数据操作。
结构、活动、状态并没有明显的区分,可以认为同一系统功能的不同层次切分。
在实现一个小功能的时候,可以采用状态机进行不同步骤的跳转执行。但如果整个功能流程比较复制时,状态机的跳转太过繁琐,混乱。
推荐使用类似与C语言的基于仿顺序操作的用法模板。
always@(posedge CLK or negedge RSTn)
beging
if(!RSTn)
begin
i<=4'd0;
rLED<=4'b0000;
end
else
case(i)
0:beginrLED<=4'b0001;i<=i+1'b1;end
1:if(Timer==T10MS)i<=i+1'b1;end
2:beginrLED<=4'b0010;i<=i+1'b1;end
3:if(Timer==T10MS)i<=i+1'b1;end
4:beginrLED<=4'b0100;i<=i+1'b1;end
5:if(Timer==T10MS)i<=i+1'b1;end
6:beginrLED<=4'b1000;i<=i+1'b1;end
7:if(Timer==T10MS)i<=4'd0;end
endcase
end
总结之下,这个用法可以伸缩的范围非常之大。除外,它所带来的好处也非常之多:
� 提供了VerilogHDL语言顺序操作的支持。
� 提高了模块的表达能力。
� 提供了仿顺序操作·建模的结构基础。