【 声明:版权所有,欢迎转载,请勿用于商业用途。
联系信箱: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开发上面,相信会有很多意外的收获。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)