zl程序教程

您现在的位置是:首页 >  后端

当前栏目

学fpga(先自顶而下设计,再自下而上集成)

集成 设计 FPGA
2023-09-27 14:27:10 时间

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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开发上面,相信会有很多意外的收获。