
FPGA开发重点与难点分析(丁维浩).doc
4页FPGA开发重点与难点分析丁维浩一、简介二、Verilog的重点三、自下而上的设计思路四、IP核五、Design Summary与芯片类型六、前仿真与后仿真的区别七、硬件调试的方法八、实例:Turbo decoder一、 简介1.1 FPGA的特点:(Field Programmable Gate Array)(集成上百万门阵列)1.2 两大公司:Altera(Quartus)与Xilinx(ISE) 睿思下载 13.1 13.2 14.1…含破解License1.3 综合工具(Synplify/ Synplify Pro/XST) XST是ISE自带的,对ISE的库元件支持的最好;其它两项为第三方开发,但综合性能最好1.4 仿真工具(ModelSim/ISim) ModelSim是专业的第三方波形仿真软件;ISim是ISE内嵌的波形仿真工具1.5 开发语言:Verilog与VHDL Verilog:语言灵活,与C语言非常接近,不严谨; VHDL:严谨,保证综合的效果,但不灵活,语法比Verilog稍复杂1.6 开发流程: ①写matlab程序并进行多次仿真通过;②在ISE中建立工程,将matlab code转化为Verilog code;③对顶层文件进行综合,使用综合工具Synthesize-XST,综合的作用有二:检查语法错误,相当于C语言的编译;将verilog code映射为ISE元件库支持的门器件(加法器、乘法器、寄存器、RAM、ROM……)后,进而转化为底层支持的网表文件;④进行波形仿真,写测试激励文件(testbench),然后进行功能仿真(前仿真),通过后进行时序仿真(后仿真)⑤进行翻译(Translate)、映射(Map)、布局布线(Place&Route),需要写约束文件(.ucf)对管教进行分配并对时序进行约束;⑥产生可编程文件(.bit或.mcs);⑦连接电路板,下载程序;⑧使用逻辑分析仪观看波形或者使用xilinx自带的逻辑分析仪(chipscope)进行回读,在PC上观看波形。
重点是前四步二、 Verilog的重点2.1 一个文件就是一个模块(module)//后缀名为.v对应.m vhdl的后缀名为.vhd module 模块名(端口名1,…… ,端口名N);//模块名需要与.v文件名相同 input [N-1:0] 输入端口名1;//定义input output属性的同时还需定义位宽 input [1:0] 输入端口名2; …… output [N-1:0] 输出端口名1; output 输出端口名2; …… 按照需要,把一些中间变量和输出变量声明寄存器(reg型)变量,因为默认为wire型写always块进行程序的逻辑运算 always@(posedge clk) //fpga中必须使用时钟触发信号,可以边沿触发,也可以 begin //电平触发,一般都使用边沿触发(posedge或negedge) …… //按照需要,一个.v文件中可以写多个always块(因为并行处理),但需要注 …… //意的是同一信号不能在两个以上的always块中进行赋值,会造成无法综合endendmodule 重点是必须在英文状态下输入,像上面的()以及,和;等等,有些版本的ISE在中文状态下输入会造成ISE软件崩溃!!2.2 阻塞赋值和非阻塞赋值 阻塞赋值: b=a; // c=b必须等到b=a执行完成后再执行! c=b; //第一句阻塞第二句的赋值,非阻塞赋值: b<=a; // b<=a在执行的同时可同时执行c<=b,两者并行执行, c<=b;//第一句不阻塞第二句的赋值,主要用于信号的延时.注:如果一个时钟内需要使用多个赋值语句,且各赋值语句的信号不相关,建议使用非阻塞赋值,这样可减少毛刺;如果用于信号延时,必须使用非阻塞赋值;如果各赋值语句的信号相关,一般使用阻塞赋值,这样不会造成逻辑错误。
2.3 reg型变量和wire型变量 reg型:寄存器变量,可在always块中多次被赋值,也可在initial块中进行初始化,但不可在assign语句中被持续性赋值,而且会占用片子的寄存器资源; wire型:线型变量,不可在always块中被赋值,更不可在initial块中进行初始化,但可以在always块中赋值给其它reg型变量,也可在assign语句中被持续性赋值,不占用片子的资源注:程序中的输出变量默认状态下都被定义为wire型变量,因为这样不会占资源,如果需要把输出变量定义为reg型变量,需要写语句声明;在写testbench测试文件时输入激励信号必须定义为reg型变量,而输出激励信号必须定义为wire型变量;一个模块如果作为底层文件被其它顶层文件调用,在顶层文件中必须把所调用的底层文件的输出信号定义为wire型变量2.4 例化一个.v文件如果作为底层文件被其它顶层文件调用,在顶层文件中需要对所调用的底层文件进行例化格式:底层文件名 例化文件名(.底层端口名1(例化端口名1),…… ,.底层端口名N(例化端口名N))底层端口名与例化端口名可以重名,但一般为了方便调试,名字取的不同。
例化相当于C++中的类和对象 类名 对象名(……)2.5 signed与unsigned这是verilog 2001新增加的关键字,用于区分定义有符号数与无符号数例如:input [7:0] address; // address的范围为0~255 input signed [7:0] address; // address的范围为-128~127注:需要注意有符号的溢出问题!!2.6 复位与reg型变量归零问题2.7 当输入数据位宽较宽时,一定要从数据的中间读入,不要从输入数据的起始位置读入,因为位宽较宽时数据的读入需要一定的过程,若从起始位置读入,很可能读不到!!!当多模块级联时,最好使用posedge和negedge交替使用的办法!!三、 自下而上的设计思路3.1 先写底层文件,每写好一个底层文件,都单独进行综合,然后写测试文件,进行波形仿真,如果波形仿真通过,开始写下一个底层文件……直到把所有的底层文件都写完,并都测试通过,然后写顶层文件,把之前的所有底层文件的输入输出管脚都在顶层文件中加以定义,然后对顶层文件进行综合、写测试文件、进行波形仿真注:单独地只对某一个文件进行综合时,需要点右键“set as Top Module”进行设置。
3.2 nd与rdy信号nd是与输入信号同步拉高的有效使能信号;rdy是与输出信号同步拉高的有效使能信号上一模块的rdy信号作为下一模块的nd信号,彼此间级联,方便测试四、 IP核IP核:Intellectual Property core 分为软核、硬核、固核,现阶段只用软核用的最多的IP核有:RAM、ROM、DCM、Multiplier、Divider、FFT、CORDIC……RAM和ROM IP核的生成过程(用的最多!!)五、 Design Summary与芯片类型5.1 在Design Summary中可以看出设计的项目占用的资源量以及片上资源占用比5.2 Xilinx有好多类型的芯片,像Spartan-3、Spartan-3E、Virtex-5、Virtex-6、Virtex-7等等,主要区别在于不同芯片的内部资源和支持的最高时钟频率其中,实验室开发板上的芯片型号为Virtex6- XC6VLX240T-FF784 中电七所项目中提供的芯片型号为Virtex7-XC7K325T.六、 前仿真和后仿真的区别前仿真:View中选中Simulation,选中Behavioral,即为前仿真,或功能仿真,行为仿真;后仿真:View中选中Simulation,选中Post-Translate 即为后仿真,或时序仿真。
前仿真和后仿真的区别:后仿真加入了器件延时,仿真一次需要较长的时间;前仿真没有加入器件延时,即认为无延时前仿可以看出编写的代码对错,后仿在代码正确的基础上可以看出代码书写的质量比如Turbo译码器的吞吐量(译码速度)与书写的代码质量有密切关系改进方法:并行处理、流水线技术七、 硬件调试的办法硬件调试的过程比较复杂,因为不能像软件(例如Matlab)一样可以一条语句一条语句地执行Debug,一般情况下只能在仿真软件(ISim)中观看变量的波形变化来检验设计的逻辑性是否正确硬件程序的输入数据必须为定点补码形式,且相应的输出也为定点补码形式,用Matlab调试的时候需要进行十进制浮点数与二进制定点补码形式的转化八、 实例Turbo decoder(SF-MAX-LOG-MAP)LTE(13,15) Matlab code。
