- [1 ] 前言
本人学生党一枚,因个人兴趣爱好以及导师的项目需求等原因,半年前便开始着手学习FPGA。但因种种原因,时至3天前才得以真正拿出黑金的AX309——xilinx spartan6系列芯片的开发板从零开始学习FPGA。先前,通过师兄的建议,买了两本入门必备的参考书籍,夏宇闻的《Verilog数字系统设计教程 第四版》和韩彬的《FPGA设计技巧与案例开发详解》。
从半年前到现在,夏宇闻的那本书我断断续续的只看了前面一些基础部分:模块的结构、数据类型、条件语句、循环语句等,算是对Verilog的基本语法有初步的了解,打算在后期程序的编写过程中不断地翻书,查书逐步学习,逐步强化。书都看烂了也不如通过实际操作来提升自己的能力快。总的来说有C语言的基础,Verilog还是很容易上手的,流水灯的例程、按键的例程也能轻易的看懂。代码风格与工程经验借鉴可以参照韩彬的那本书,这是一本很不错的书籍,强烈推荐,针对Altera FPGA的,虽然我用的是xilinx的。
- [ 2] 正式动手
3天前开始拿出珍藏已久的AX309开发板,在装好了ISE和Modelsim软件后开始照着黑金给的PDF教程逐步建立工程、代码ctrl+c、ctrl+v、编译、引脚定义、仿真、下载、流水灯开始流水了。总之照着教程来一切很顺利,但可悲的是,一套行云流水的操作后大脑却是一片空白,啥都没记住。
今天决定自己从头开始,动手写一个单通道PWM输出的程序,从参考别人的程序自己重现(Notepad++先写好程序)到建立工程到仿真再到下载验证。一共走了3遍,才算抛弃了PDF教程,记熟了流程。为了防止我这间歇性失忆的大脑在关键时刻短路,我把简历工程到仿真的过程记录下来。
- [ 3] 工程建立
第一步打开ISE软件,选择界面左上角File→New Project 。
第二步 建立工程文件夹,参照箭头指示来填写内容,文件夹及文件名称最好不要出现中文。
第三步 开发板数据配置。可根据自己的开发板进行选择填写。
第四步 建立源文档 Project→New source
选择Verilog Moudle,填写源程序文件名称,然后next→next→Finish,中间的引脚配置可以先不管,后期修改。
第五步 工程建立完成后把Notepad++写好的代码复制过来(参考https://blog.csdn.net/whik1194/article/details/89371599#comments)。代码如下: 头文件是用了韩彬老师书里所整理的。
/*------------------------------------------------------------------
\\\|///
\\ - - //
( @ @ )
+-------------------------oOOo-(_)-oOOo----------------------------+
CONFIDENTIAL IN CONFIDENCE
This confidential and proprietary software may be only used as authorized
by a licensing agreement from Zhang (****).
In the event of publication,the following notice is applicable:
Copyright(C)2019-2020 Zhang Corporation
The entire notice above must be reproduced on all authorized copies.
Author : Zhang
Technology blogs :
Email Address : [email protected]
Filename : Counter_Design.v
Data : 2019-8-5
Description : generate one channel pwm
Modification :
Data By Version Change Description
=====================================================================
19/8/5 Zhang 1.0 Original
---------------------------------------------------------------------
| Oooo
+-------------------------oooO--( )--------------------------------+
( ) ) /
\ ( (_/
\_)
-------------------------------------------------------------------*/
`timescale 1ns / 1ps
module pwm_test(
input clk, //systerm clock 50MHz
input rst_n, //reset key
output reg pwm //two channel pwm output
);
parameter period = 6'd50; //pwm_period = 50MHz/period 5Hz 0.2s
parameter h_time = 6'd25; //duty cycle = h_time/period 0.1s 50%鍗犵┖姣
reg [5:0] CNT; //counter
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
CNT <= 0;
else if(CNT >= (period - 1'd1) )
CNT <= 0;
else
CNT <= CNT + 1'd1;
end
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
pwm <= 0;
else //rst_n = 1
begin
if(CNT <= (h_time - 1))
pwm <= 1;
else
pwm <= 0;
end
end
endmodule
period用来设置方波信号频率,频率=50MHz / period,例如5MHz频率的方波信号,此时period应为10; h_time用来设置高电平时间。占空比=h_time/period*100%。
通过CNT来计数,当CNT
第六步 UCF管脚约束
ISE 的 UCF 文件主要是完成管脚的约束,时钟的约束, 以及组的约束。这里我们需要对pwm_output.v 程序中的输入输出端口分配到 FPGA 的真实管脚上, 这需要准备一个 FPGA 的引脚绑定
文件.ucf 并添加到工程中:新建一个空白文件 File->New, 选择 Text File。
在这个 Text 文件中添加以下的引脚定义,完成后另存为 pwm_output.ucf 文件。
把 pwm_output.ucf 文件添加到工程中,点击 Project→Add source, 添加后如下图所示:
最后进行编译即可.虽然使用ISE自带的Xilinx PlanAhead 14.7也可以进行引脚配置,但因为我刚开始学,配置过程总是出问题,所以就仿照历程里的UCF文件来照猫画虎了,不知道后期功能比较复杂的程序还能不能通过这种方式来进行引脚约束。大家可以根据自己的实际情况来选择。
- [4 ]Modelsim仿真
曾与多个会FPGA的同学沟通过,韩彬的书里面也强烈建议过,Modelsim仿真是很重要的一个过程,任何一个程序都要先通过仿真来进行验证。ISE与Modelsim的联合仿真虽然很方便,但是为了能使用Modelsim独立仿真,方便以后使用其他开发软件也可以得心应手,所以我还是从建立Modelsim仿真工程开始。
仿真工程的建立,我是利用Modelsim自己根据.V文件来生成testbench代码的功能来进行的。过程如下:
第一步:建立空白testbench代码窗口 File→New→Source→Verilog,
点击代码窗口的空白区,然后选择Source→Show Language Templates,然后就会弹出下图方格内的内容。
第二步:建立工程,将pwm_output.v文件导入。File→New→Project。
填写工程信息
添加已存在的Verilog程序文件。把pwm_output.v文件添加进来。
添加成功后进行编译
第四步:自动生成testbench程序框架,双击Create Testbench,选择对应的pwm_output.v文件
由于我之前建立过相关工程,所以这部直接跳过,不用在意。正常情况下不会出现这一步。
生成的代码框架如图,需要自己进行修改添加。
对模板进行修改补充后的testbench代码如下
/*------------------------------------------------------------------
\\\|///
\\ - - //
( @ @ )
+-------------------------oOOo-(_)-oOOo----------------------------+
CONFIDENTIAL IN CONFIDENCE
This confidential and proprietary software may be only used as authorized
by a licensing agreement from Zhang (****).
In the event of publication,the following notice is applicable:
Copyright(C)2019-2020 Zhang Corporation
The entire notice above must be reproduced on all authorized copies.
Author : Zhang
Technology blogs :
Email Address : [email protected]
Filename : Counter_Design.v
Data : 2019-8-5
Description : generate one channel pwm testbench
Modification :
Data By Version Change Description
=====================================================================
19/8/5 Zhang 1.0 Original
---------------------------------------------------------------------
| Oooo
+-------------------------oooO--( )--------------------------------+
( ) ) /
\ ( (_/
\_)
-------------------------------------------------------------------*/
`timescale 1ns / 1ps
module pwm_output_tb ;
parameter period = 7'b0110010 ;
parameter h_time = 7'b0011001 ;
wire pwm ;
reg clk ;
reg rst_n ;
initial
begin
clk = 0;
#10
rst_n = 0;
#10
rst_n = 1;
end
pwm_test #(period, h_time)
DUT (
.pwm (pwm ) ,
.clk (clk ) ,
.rst_n (rst_n ) );
always #10 clk =~ clk;
endmodule
这里要注意,在modelsim自动生成的激励文件里,pwm_test #(period, h_time)这里要注意period和h_time的前后顺序,要保证和.v源程序里面的定义顺序一致。
第五步:对激励文件代码继续编译
第六步进行仿真
中间以后几步没有截图,就是添加wave,输入仿真时间等步骤。
波形输出正确,最后的的程序也修改了方波频率,下载到了开发板内,LED灯可以正常闪烁。也算是入门了。