FPGA学习笔记(1)——单通道PWM输出与Modelsim仿真

- [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             :          18713597390@163.com
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<h_time-1时,PWM输出高,当CNT>h_time-1时,PWM输出低。
第六步 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             :          18713597390@163.com
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灯可以正常闪烁。也算是入门了。
在这里插入图片描述

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值