学fpga(先自顶而下设计,再自下而上集成)
Posted 费晓行
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学fpga(先自顶而下设计,再自下而上集成)相关的知识,希望对你有一定的参考价值。
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
前面讨论一下led流水灯的显示、按键的触发这两个模块。等真正做一个项目的时候,应该怎么处理呢?一般先按照自顶而下的方法进行需求切分,然后把每一个子模块做好了之后,再进自下而上的集成处理。
考虑到之前讨论的流水灯和按键,可以假设有这么一个需求。当按键按下的时候,流水灯开始运行。当按键再次按下的时候,流水灯结束。等第三次按键按下的时候,流水灯再次开始循环。
初次拿到这个需求的时候,第一步要做的就是确认功能和输入、输出。
等完成了第一步之后,下面要做的就是进行模块切分。模块切分需要依赖于自己的经验。这个有点类似于做数学题。一开始拿到的题目总是很难的,我们要做得就是把这个问题变成一个一个学过得知识点,这些知识点就是过去积累的经验。因为我们学过led流水灯这些,所以很自然地拆分成两个模块。
有了这一步模块得拆分之后,当然后面就是key模块、led模块的实现了。等到实现之后,需要对key模块、led模块进行分别测试,测试之后就可以开始自底向上的整合了。verilog上面,就是把各个模块进行例化,拼凑在一起,比如像这样,
module input_led(clk, rst, key, led)
input clk;
input rst;
input key;
output led;
wire clk;
wire rst;
wire key;
reg[3:0] led;
wire flag;
key_module key_module(
.clk(clk),
.rst(rst),
.key(key),
.flag(flag)
);
led_module led_module(
.clk(clk),
.rst(rst),
.flag(flag),
.led(led)
);
endmodule;
关于这部分,其实和c语言里面的main函数很相。同样是这一个需求,大家可以思考一下,是不是也是这么一个流程。先进行模块拆分,每一个模块用不同的函数完成,等模块测试之后,再进行模块集成整合,等到确认没有问题了,就可以说功能开发成功了。
void input_module()
return;
void led_module()
return;
int main()
while(1)
input_module();
led_module();
return 0;
在运行机理上面,fpga和c编程可能差别蛮大。但是开发流程上面,两者有很大的相似性。有c语言编程经验的同学,完全可以把这个经验方便地移植到fpga开发上面,相信会有很多意外的收获。
以上是关于学fpga(先自顶而下设计,再自下而上集成)的主要内容,如果未能解决你的问题,请参考以下文章