FPGA实验一简单分频器的设计.docx
- 文档编号:30735361
- 上传时间:2023-08-20
- 格式:DOCX
- 页数:22
- 大小:2.77MB
FPGA实验一简单分频器的设计.docx
《FPGA实验一简单分频器的设计.docx》由会员分享,可在线阅读,更多相关《FPGA实验一简单分频器的设计.docx(22页珍藏版)》请在冰豆网上搜索。
FPGA实验一简单分频器的设计
专业:
__电子信息工程__
姓名:
_____陈华杰_____
学号:
______
日期:
___星期五上午___
地点:
应电楼303桌号2组
实验报告
课程名称:
_____FPGA实验______指导老师:
__竺红卫/陈宏__成绩:
__________________
实验名称:
___实验一:
简单分频器的设计____实验类型:
_FPGA实验_同组学生姓名:
__
一、实验目的和要求(必填)
1.熟悉XilinxISE软件,学会设计、仿真、综合和下载;
2.熟悉实验板电路设定频率的方法。
二、实验内容和原理(必填)
实验内容:
根据实验板上晶振的输入频率50MHz,如果直接用这么高的时钟频率来驱动LED的闪烁,人眼将无法分辨。
因此本实验着重介绍如何通过分频计数器的方式将50MHz的输入频率降低为人眼可分辨的频率(10Hz以下),并在实验板的LED0~LED7上显示出来。
LED照片如下图:
实验原理:
实验板在滑动开关的上面有8个独立的贴片LED。
LED一端接地,另一端通过390欧的限流电阻接到Spartan-3E上。
要点亮一个LED,向相应的控制位置输出高电位。
三、主要仪器设备(必填)
1.电脑一台;
2.实验板一块,XilinxSpartan-3E;
3.实验板电源一只;
4.实验板连接电脑的下载线一根。
四、实验步骤和现象
1.新建Project和VerilogModule
打开电脑桌面上的XilinxISE14.1软件,选择project→newproject建立新项目,输入project
name。
核对选择Spartan3E和XC3S500E和FG320的封装形式。
跳出下面的选择框。
选择NewSource,并在下面的选择框中选VerilogModule,填写刚才的newprojectname。
跳出下面的选择框。
点击NEXT。
输入文件名,跳出下面的选择框。
点击NEXT。
跳出下面的选择框。
点击FINISH。
2.建立约束文件
选中SourceforProject窗口中的test1.v文件,在Processes进程窗口中双击CreateNewSource。
进入NewSource对话框,选择ImplementationConstraintsFile,并键入FileName“test1”和
Location(路径),Next.
选择NEXT,出现下面的对话框,选择FINISH。
在Processes进程窗口中点开UserConstraints,进行时序约束和引脚约束。
时序约束可不设
定,这里着重介绍引脚约束。
然后将文件保存。
3.输入代码
点击.v文件名,并双击,打开代码输入界面。
输入代码(例程):
`timescale1ns/1ns
modulerace(rst_n,clk,led_d0,led_d1,led_d2,led_d3,led_d4,led_d5,led_d6,led_d7);
inputrst_n;
inputclk;outputled_d0;//VX-SP3e开发板上位号为D0的LED
outputled_d1;//VX-SP3e开发板上位号为D1的LED
outputled_d2;//VX-SP3e开发板上位号为D2的LED
outputled_d3;//VX-SP3e开发板上位号为D3的LED
outputled_d4;//VX-SP3e开发板上位号为D4的LED
outputled_d5;//VX-SP3e开发板上位号为D5的LED
outputled_d6;//VX-SP3e开发板上位号为D6的LED
outputled_d7;//VX-SP3e开发板上位号为D7的LED
//---------------------------------------------------------------------------
//clk使用的是输入频率为50MHz的时钟,cnt各位的频率将如
//cnt[23]=2.98Hz;cnt[24]=1.49Hz;cnt[25]=0.745Hz。
//如果希望走马灯使用其他频率闪烁,修改cnt的位宽即可
//---------------------------------------------------------------------------
reg[22:
0]cnt;
always@(posedgeclk)
if(rst_n)cnt<=23'd0;
elsecnt<=cnt+1'b1;
//带复位键的位宽为23位的分频计数器,以降低闪烁频率
reg[7:
0]led;
always@(posedgeclk)
if(rst_n)
led<=8'b00000001;//按键复位
elseif((cnt==23'h7fffff)&&(led==8'b10000000))
led<=8'b00000001;//循环一周后开始下一周的循环
elseif(cnt==23'h7fffff)
led<=led<<1;//左移一位,右端补零
//---------------------------------------------------------------------------
//四个LED都使用了上拉,默认为1,所以走马灯可以使用取反来实现。
//---------------------------------------------------------------------------
assignled_d2=~led[2];
assignled_d4=~led[4];
assignled_d3=~led[3];
assignled_d5=~led[5];
assignled_d0=~led[0];
assignled_d1=~led[1];
assignled_d6=~led[6];
assignled_d7=~led[7];
endmodule
将文件保存。
4.综合,执行和生存配置文件
双击Processes进程窗口中的Synthesize-XST,对设计进行综合。
若出现ERROR,则检查程序文件,进行修改,重新综合。
成功会出现绿色的“√”。
成功后将文件保存。
双击Processes进程窗口中的ImplementDesign
右击GenerateProgrammingFile,打开Properties。
在StartupOptions选项中将FPGAStart-UpClock选择下拉选项中的JTAGClock,OK。
双击GenerateProgrammingFile生成bit文件。
5.接入实验板,下载程序
连接实验板并打开电源。
双击ConfigueProgrammingFile,创建PROM配置文件.mcs文件,选择OK。
跳出界面,双击BOUNDARYSCAN
在右边空白处,鼠标右键,选择InitializeChain.
跳出界面。
选择bit文件,选择OPEN。
出现下面的界面,选择NO。
出现下面的界面,选择BYPASS。
出现下面的界面,选择BYPASS。
出现下面的界面,选择OK。
点击XilinxFPGA右键,选择PROGRAM。
出现下面的界面即可。
其中,RESET是右下角的SW0
6.例程实验现象
初始时刻右边7个LED亮,左边第一个LED灭。
以约6秒为周期,LED灭灯的位置依次从左向右循环移动。
五、思考题
1.若要LED实现周期为2秒的闪烁,分频计数器应该如何改写。
默认LED状态为灭,灯亮的位置移动。
答:
LED移动频率为0.5Hz。
50MHz÷0.5Hz=108,10810=5F5E10016,二进制位位数为27。
再考虑到走马灯的状态与例程相反。
将例程作如下改动:
1)cnt的位宽改为27;
2)cnt转折周期改为27’h5F5E100;
3)最后的assign语句中,寄存器变量led在赋值前不取反。
修改后的程序如下:
`timescale1ns/1ns
modulerace(rst_n,clk,led_d0,led_d1,led_d2,led_d3,led_d4,led_d5,led_d6,led_d7);
inputrst_n;
inputclk;outputled_d0;//VX-SP3e开发板上位号为D0的LED
outputled_d1;//VX-SP3e开发板上位号为D1的LED
outputled_d2;//VX-SP3e开发板上位号为D2的LED
outputled_d3;//VX-SP3e开发板上位号为D3的LED
outputled_d4;//VX-SP3e开发板上位号为D4的LED
outputled_d5;//VX-SP3e开发板上位号为D5的LED
outputled_d6;//VX-SP3e开发板上位号为D6的LED
outputled_d7;//VX-SP3e开发板上位号为D7的LED
//---------------------------------------------------------------------------
//clk使用的是输入频率为50MHz的时钟,cnt各位的频率将如
//cnt[23]=2.98Hz;cnt[24]=1.49Hz;cnt[25]=0.745Hz。
//如果希望走马灯使用其他频率闪烁,修改cnt的位宽即可
//---------------------------------------------------------------------------
reg[26:
0]cnt;
always@(posedgeclk)
if(rst_n)cnt<=27'd0;
elsecnt<=cnt+1'b1;
reg[7:
0]led;
always@(posedgeclk)
if(rst_n)
led<=8'b00000001;//按键复位
elseif((cnt==27’h5F5E100)&&(led==8'b10000000))
led<=8'b00000001;//循环一周后开始下一周的循环
elseif(cnt==27’h5F5E100)
led<=led<<1;//左移一位,右端补零
//---------------------------------------------------------------------------
//四个LED都使用了上拉,默认为1,所以走马灯可以使用取反来实现。
//---------------------------------------------------------------------------
assignled_d2=led[2];
assignled_d4=led[4];
assignled_d3=led[3];
assignled_d5=led[5];
assignled_d0=led[0];
assignled_d1=led[1];
assignled_d6=led[6];
assignled_d7=led[7];
endmodule
2.设计4个灯同时走的走马灯实验,变化周期是10秒。
默认LED状态为灭,灯亮的位置移动。
答:
LED移动频率为0.1Hz。
50MHz÷0.1Hz=5×108,5×10810=1DCD650016,二进制位位数为29。
再考虑到走马灯的状态与例程相反。
将例程作如下改动:
1)cnt的位宽改为29;
2)cnt转折周期改为29’h1DCD6500;
3)将LED的点亮状态改成4个同时亮,并且在循环一周后逐步开始下一周的循环时,使用枚举的方式编程;
4)最后的assign语句中,寄存器变量led在赋值前不取反。
修改后的程序如下:
`timescale1ns/1ns
modulerace(rst_n,clk,led_d0,led_d1,led_d2,led_d3,led_d4,led_d5,led_d6,led_d7);
inputrst_n;
inputclk;outputled_d0;//VX-SP3e开发板上位号为D0的LED
outputled_d1;//VX-SP3e开发板上位号为D1的LED
outputled_d2;//VX-SP3e开发板上位号为D2的LED
outputled_d3;//VX-SP3e开发板上位号为D3的LED
outputled_d4;//VX-SP3e开发板上位号为D4的LED
outputled_d5;//VX-SP3e开发板上位号为D5的LED
outputled_d6;//VX-SP3e开发板上位号为D6的LED
outputled_d7;//VX-SP3e开发板上位号为D7的LED
//---------------------------------------------------------------------------
//clk使用的是输入频率为50MHz的时钟,cnt各位的频率将如
//cnt[23]=2.98Hz;cnt[24]=1.49Hz;cnt[25]=0.745Hz。
//如果希望走马灯使用其他频率闪烁,修改cnt的位宽即可
//---------------------------------------------------------------------------
reg[28:
0]cnt;
always@(posedgeclk)
if(rst_n)cnt<=29'd0;
elsecnt<=cnt+1'b1;
reg[7:
0]led;
always@(posedgeclk)
if(rst_n)
led<=8'b00001111;//按键复位
elseif((cnt==29’h1DCD6500)&&(led==8'b11110000))
led<=8'b11100001;
elseif((cnt==29’h1DCD6500)&&(led==8'b11100001))
led<=8'b11000011;
elseif((cnt==29’h1DCD6500)&&(led==8'b11000011))
led<=8'b10000111;
elseif((cnt==29’h1DCD6500)&&(led==8'b10000111))
led<=8'b00001111;
elseif(cnt==29’h1DCD6500)
led<=led<<1;//左移一位,右端补零
//---------------------------------------------------------------------------
//四个LED都使用了上拉,默认为1,所以走马灯可以使用取反来实现。
//---------------------------------------------------------------------------
assignled_d2=led[2];
assignled_d4=led[4];
assignled_d3=led[3];
assignled_d5=led[5];
assignled_d0=led[0];
assignled_d1=led[1];
assignled_d6=led[6];
assignled_d7=led[7];
endmodule
六、最后的困惑
在例程以及思考题里改编的程序中,当寄存器变量cnt计满一个周期时,并没有相应的清零动作,然而cnt仍然能自动复位,并且在实验中,走马灯仍然能按照预期运行。
这是为什么呢?
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FPGA 实验 简单 分频器 设计