fpga 一月学习记录

fpga 一月学习记录

4月初,导师突然接了一个fpga开发的项目,把我和另一个同学叫过来,让我们速成,学习了2个星期Verilog语法,了解了一下vivado的使用,虽然最终项目因故中止,但是一个月的fpga学习也值得记录一下。我的主要工作内容是实现一个数据接口转换,具体因为没有下板成功就不说了,主要是调用两个ip核,并在中间加入一个FIFO(其实也是一个IP核),配置好就可以了。本篇主要记录fpga开发的流程,不涉及具体工作。

一 初识fpga

我对fpga的理解是一块可定制芯片,通过设计将片子上的可用资源(与非门、触发器等等)按照需求完成指定的功能。要进行fpga的开发,要有一定时序的概念(我学过的相关课程只有本科上的数电),要能理解寄存器为何在时钟沿发生变换,还有保持时间、建立时间等等概念。接下来就要从开发软件上手了,我一开始用的quartus + modelsim,后面发现要用的IP核(这里插一句,IP不是指网络地址,是Intellectual Property,可以理解为封装好的函数)是Xilinx公司的,就及时转换到vivado了。

module ms7_generate(clk, rst_n, en, ms7, r7);

parameter INIT = 7'b000_0001;

input clk, rst_n;
input en;
output ms7;
output reg [6:0] r7;

assign ms7 = r7[0];

always @ (posedge clk or negedge rst_n)begin
    if(!rst_n)
        r7 <= INIT;
    else if(en)begin
        r7[0] <= r7[1];
        r7[1] <= r7[2];
        r7[2] <= r7[3];
        r7[3] <= r7[4];
        r7[4] <= r7[5];
        r7[5] <= r7[6];
        r7[6] <= r7[0] ^ r7[4];
    end
    else
        r7 <= r7;
end

endmodule	

以上面这个简单的模块为例,module是Verilog开发最基本的单元,一个module会指定输入输出,相当于函数。awlays是非常重要的一个语句,代表只要满足条件就执行动作,并且是“always”。reg/wire是最常见的两种类型,我疑惑了很久,wire可以理解为是一根线,它的值随输入可以实时变化,而reg是一个触发器,其值只能在时钟沿到来时才能变化。input、output对于模块而言,不指定的话都默认是wire类型,input只能是wire类型,output可以为wire或reg。可以这样理解:对于input来说,想要对模块进行输入需有一个线(wire)“伸入”模块内部。让我疑惑很久的是在写testbench文件时(在将模块写好后,需要验证所设计的模块功能是否正常,需要一个测试文件,在测试文件中,需要指定输入信号的状态,进而观测输出信号),常常对输入信号设置为reg类型(和input只能是wire矛盾),我的理解是:在模块内部input是wire类型(也就是说input信号是以wire类型进入模块的),当指定输入信号为reg类型后,例化模块(例化module相当于调用函数,指定input/output)时,将一个reg类型放在input接口上,本质是在这个reg上接了一根wire。当然这些只是我的感性认识,帮助理解的,可能并不严谨。设计好模块,编写测试文件,执行仿真就可以看到输入输出波形了。

二 IP核的使用

在IP catalog中搜索需要的IP核,双击添加,依据不同功能IP核的特性进行一定的设置(参考官方手册,很详细),设置完成后,IP将添加到资源目录,例化IP核需要知道设置后的IP核输入输出接口,可以在source>IP sources>打开IP核子目录>instantiation Template>下的veo文件,可以复制例化接口模板,方便调用。

IP核一般会有一个example design,我花了很多时间学习example design,对于复杂的IP,可以直接在example design上进行更改,可能会更方便,简单的IP直接例化即可(像我这次用到的FIFO IP核)。

三 仿真

vivado一共有5种仿真,一般验证功能使用第一步功能仿真即可,综合后仿真是将设计转换成了fpga上的资源进行仿真,实现(implementation)后仿真是将设计布局布线到具体的芯片上进行仿真。完整的fpga设计除了功能模块设计外,还有两个重要的部分,一个是引脚约束,一个是时序约束,在设计中以xdc文件发挥作用。引脚约束就是在选择具体的芯片后,需要对你的top module的输入输出映射到物理芯片的管脚上,需要看器件的使用说明,比如时钟信号必须接入专门的管脚,我这次使用的是一个开发板,上面不止有fpga芯片,还有外围的模块,板子上有晶振,是用来产生时钟信号的,那就必须查阅手册看那个管脚是晶振的输出口。我这次的工作其实只完成了功能仿真,所以对引脚约束、时序约束了解还远远不够。

四 测试

虽然只用了一天的开发板,还是了解了一下测试的流程,对于只有一块板子,没有输入信号源也没有测试工具如何进行测试我一开始是很疑惑的,所以我先在网上找了一个led闪烁的简单例程(能看灯闪......)分配好引脚后,生成bitstream文件,通过jtag写入开发板,灯就按照程序设计进行闪烁,证明整个流程没有问题,接下来就考虑验证我自己的设计了。首先需要时钟信号,通过时钟ip核,将晶振的时钟输入通过分频倍频可以得到想要的时钟,另一个重要的是怎么观测信号,使用vivado自带的一个ila ip核,同样通过那根下载线可以在电脑上看到开发板内部波形,这一步我还没实施,项目就结束了。

五 总结

短暂的fpga学习目前告一段落了,其实每次在进行一个操作的时候,我都很怀疑是不是符合规范,这就是自行摸索的烦恼吧。

posted @   zmqb  阅读(44)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
点击右上角即可分享
微信分享提示