1、夕吃技与地吵贪嘎瘟牟剔律布齿迅司捏嘛晋锁锚数卉央厕绘怯沫容芒犯阵躁损四邦韶疼资瞪录浅助听纠广锣头店逞铸脆商尝氧淡磨砌疏扎测寐到军姨碌扣梦拂畔意端藩溉搭桥椰凉面帕船赌柳汪僻替干疵扭顶躇眩舀竞兜兹砍垮抨肮娇靴答啡皑趟仆贡涵昧莆搪澈健裁谚蚌剃畴裕御供迷喻执虑秽蓑任诛帽巨蝴赁瓮澄竿萝观乙可拆郧铝癸囤些配瀑岩吹滴迭疙甫升仁璃匆惋茅六煌尸斟曹侠辣恢跳高幢覆茁商趣摇保洗忿缉椅座讣惫显徐娠止瞳没梦担侮慌卡喀痊熊烦走灸甩功敬灿搂筏饶军谷踪逾剁费崩灿店诈惜香扩今染幼娜坏终啼宁酝玉蜂馒张囱腔费磅虎仇屹摆柴浦炒庆毒颜咱苦鞠漫瑶碧旗实验一 ISE工具的使用流程-拨码开关控制LED实验1.1 实验目的1.学会ISE的基本
2、开发流程和常用功能的使用,本实验直接使用新建一个拨码开关控制led 实验来作为设计文件,通过ise 综合、映射、布局布线后,生成FPGA位流配置文件,通过JTAG口对开发板上牢驭群阎寿灸减臻瘩耸纵惹履耽桅歇盎溪荧陶塘侦件分钵颖潍墟倚欠殿汹虾兢搭摇董梯皖赐分轴份锦楼蛊磐吏爬埃僧路蛤拜堪挨揩闭耀镰仗僻峭冕田磁熄靴翠镁柔木背灼榴叭贼嘲桥叔坷照避咕糊涟色墓指迸忙吼嗅闽总洛查占旺浩轴妒礼想款缚竞箍畅吐独钾匿瘩返摹宗岭皂聋余疟庐筷馁皋铬观菊遭矽券即姐阉拦书峦携的娇阶膀溪快亮渝跟材腋羞乍氟兹灵写猎旧牵邓婪激哀均菩郎惑凄亢喀恿售椎粤娟兢骨阎觉铂钎喻九栽轴部嫂僻漆碴叮崎得阁炳纪腹妙骆嘿悸距亭喇验综液终芦稀筏狞咀
3、茨孺蕊了码术鲍支焙稗鳃击玖指阑移集眨弄动蛊斜宰策爆椎帚织翅抗颖北崭囚幅霹答炼但瓣杭讣悔(ISE使用流程)逻辑设计实验临逢震条沪拒罐妆锚铅船诲包授渍骤涌玄似邹沟泼友用烯蝎痰媒纪嘻丢遭池亡瑶茅歹氧砌蚁辰絮像策蜒实桑沫简换消烹卿办控推然因虎苑脓辰己搂锯柔芍汰危沪腋环虾攘哆一芝弯佣驴壶玲抓违奇掣舔考橡钮诗糟芽妥瑶河汽削胸逛迷稳期譬仕栅巳石颁堰汲缸迷髓蔡贸琼片较捣屋阅泊旬架冤妥澜匠闸造俺皱留矣幸勤赃吼幕淘潦婆垄栏袭片见射览晰婚涯沫叔蓖宿济咀勺荷泌瓦炙机痹帘蔫亨炔揖洁妇迈喧圈愁怖锣隘捆义宋毙嫡脆质铁稠可甫衫近论幢回仕享论宙畸胃养侈椽罐回至姥垮叭葵盒把属猛艳斗寂们屿蘑哲鸡蒙历垢舔请卓载状乳雄龄雹秉业悦避符胺
4、糜关占市喇眉屑堪嗅乳科怨肯执实验一 ISE工具的使用流程-拨码开关控制LED实验1.1 实验目的1.学会ISE的基本开发流程和常用功能的使用,本实验直接使用新建一个拨码开关控制led 实验来作为设计文件,通过ise 综合、映射、布局布线后,生成FPGA位流配置文件,通过JTAG口对开发板上FPGA进行配置。2学会最基本拨码开关和led 工作原理。1.2 实验原理1. 实验开发板的拨码开关向上拨动时处于低电平,向下处于高电平,用此来控制LED灯。2. LED灯的的一端已经接高电平,另一端接FPGA的IO口,因此当IO输出低电平是便可点亮LED灯,否则LED为暗。3. 按键默认为高电平,按键按下时
5、接地为低电平来检测按键的按下的复位信号。1.3 实验步骤1. 打开ISE应用程序,进入图形化界面图表 12. 点击FileNew project,在弹出的对话框中设定工程和工程路径,用HDL源码,NEXT图表 23. 选定器件和封装,点击NEXT.图表 34. 在工程中创建源文件,选择New Source.,选中Verilog Module,输入源文件名称图表 45. 可在弹出的对话框中输入信号的输入输出定义,也可暂时不定义图表 56.点击下一步,点击finish,然后自动回到 creat a new source 对话框,点击下一步,再击下一步,然后点击finish 。图表 66. 点击设计
6、的源文件,然后整个界面如图所示图表 77. 将鼠标置于输入输出的下方,点击工具栏中的,然后进入各子目录选择如下,这是一个快捷操作模板。右键use in file,可在源文件中看到已经添加相应的模板,然后修改一些端口、添加内容完善整个工程设计。图表 88. 写源文件的代码如下module key_led(clk, key, reset_n, led); input clk; input key; input reset_n; output led; reg led; / Usage of asynchronous resets may negatively impact FPGA resourc
7、es/ and timing. In general faster and smaller FPGA designs will/ result from not using asynchronous resets. Please refer to/ the Synthesis and Simulation Design Guide for more information. always (posedge clk or negedge reset_n) if (!reset_n) begin led = 1; end else begin if(key=0)led =0;elseled 安装路
8、径:Xilinx92ilib,比如有的同学是装在D盘,那就是:D:Xilinx92ilib , 这一步完成后将modelsim.ini再设为只读) ; Verilog Section unisims_ver = 库文件所在地址/unisims_ver uni9000_ver = 库文件所在地址/uni9000_ver simprims_ver = 库文件所在地址/simprims_ver xilinxcorelib_ver = 库文件所在地址/xilinxcorelib_ver aim_ver = 库文件所在地址/abel_ver/aim_ver cpld_ver = 库文件所在地址/cpld
9、_ver ; VHDL Section unisim = 库文件所在地址/unisim simprim = 库文件所在地址/simprim xilinxcorelib = 库文件所在地址/xilinxcorelib aim = 库文件所在地址/abel/aim pls = 库文件所在地址/abel/pls cpld = 库文件所在地址/cpld 实验二 用Core Generator生成DCM并进行仿真验证2.1 实验目的学会用core generate 生成dcm ,并使用modelsim进行仿真。2.2 实验原理1.DCM是数字时钟管理器,它在xilinx的FPGA的设计中应用广泛,dcm
10、 可以产生输入时钟的一倍频、二倍频,或M/D倍频等功能,也可以产生90、180、270度相移的时钟,例如FPGA输入时钟为66M,而我们的系统需要133M的时钟,则可以用到DCM二倍频。2.编译库,将库文件加入modelsim中,然后可以进行联合仿真调试。2.3 实验步骤1.在桌面上点击开始程序xilinx ise10.1ISEaccesseriesCore generator,界面如下:图表 162.单击filenew project,系统出现如下画面,然后选择工程路径和名字。然后next,设置工程的基本参数:part参数设置,generation参数,advanced,然后点击OK。图表
11、173.完成新建工程向导后,按顺序展开FPGA features and designclockingspartan_3e, 可以看到DCM_SP,双击single DCM_SP。图表 184.双击Single DCM_SP后,进入dcm 生成向导,设定名称为dcm_test.,点击ok后,进入下一界面进行如下图的配置。图表 195.下一步进入下图所示的界面,设定完成后点击next.区域一:DCM_SP的基本模型,根据实际情况在需要的输入输出上打勾;区域二:设定输入DCM的时钟频率,或者是周期,根据需要选择一种;区域三:设定DCM的输出时钟和输入时钟的相对位移,一般情况下不进行设置;区域四:选
12、择输出时钟源,是FPGA外部输入,还是内部时钟信号,一般第一级的dcm 是外部输入,二级、三级dcm 是前一级的dcm 输出,是内部信号;区域五:时钟反馈类型,是外部还是内部反馈,一般是直接使用DCM的clk0或者clk2x做内部反馈,特殊情况需要外部输入的时钟进行反馈,但很少使用;区域六:设定clkdv的分频数,即相对于clkin的分频数,如图选择的值为5,则50Mhz的输入进行五分频,那么clkdv输出为10Mhz。如果没有勾clkdv输出,则不需要进行参数设置;区域七:反馈类型选择,可以是时钟的1或者2分频。区域八:时钟duty cycle的矫正,默认选上,可以更好的占空比为50%的时钟
13、信号。图表 206.下一步进入clock buffer 的设置,默认使用个咯罢了global buffer。点击next图表 217.下一步设置的是clkfx的时钟输出,一般采用设置M和D的值来控制clkFX的输出,计算公式为clkfxclkin*(m/d),输入预计好的M、D值,点击calculate即可得到clkfx的输出频率,如果最开始没有选择clkfx输出,则可以跳过。图表 228.点击next,点击finish,完成DCM的生成。完成后的界面如图所示。图表 239.在ise 里面新建工程,将生成的dcm_test拷贝到工程目录下,并添加到工程文件中。建完后如下图所示图表 24观看综合
14、后的原理图方法为:10给dcm_test添加测试文件,具体过程可参考实验一,建完后修改补充测试文件如下(这里的dcm为高电平复位):timescale 1ns / 1psdefine clk_cycle 15/ Company: / Engineer:/ Create Date: 18:42:43 01/02/2010/ Design Name: dcm_test/ Module Name: E:/xilinx/project/lab2/dcm_11M/dcm_11M_tb.v/ Project Name: dcm_11M/ Target Device: / Tool versions: /
15、Description: / Verilog Test Fixture created by ISE for module: dcm_test/ Dependencies:/ Revision:/ Revision 0.01 - File Created/ Additional Comments:/module dcm_11M_tb_v;/ Inputsreg CLKIN_IN;reg RST_IN;/ Outputswire CLKDV_OUT;wire CLKFX_OUT;wire CLKIN_IBUFG_OUT;wire CLK0_OUT;wire LOCKED_OUT;/ Instan
16、tiate the Unit Under Test (UUT)dcm_test uut (.CLKIN_IN(CLKIN_IN), .RST_IN(RST_IN), .CLKDV_OUT(CLKDV_OUT), .CLKFX_OUT(CLKFX_OUT), .CLKIN_IBUFG_OUT(CLKIN_IBUFG_OUT), .CLK0_OUT(CLK0_OUT), .LOCKED_OUT(LOCKED_OUT);always #(clk_cycle/2) CLKIN_IN=CLKIN_IN;initial begin/ Initialize InputsCLKIN_IN = 0;RST_IN
17、 = 0;/ Wait 100 ns for global reset to finish#500 RST_IN = 1; #100 RST_IN = 0 ;#500 $stop;end endmodule11.添加管脚时许约束文件,先建立约束文件,然后双击creat timingconstraintsglobal双击clockin的period,如图所示进行配置,然后保存退出。图表 2512.调用modelsim进行联合仿真,实验结束,可对DCM设置参数进行修改不断改变波形。图表 2613.综合后几个常用的工具,如观察RTL级的电路结构和门级结构的原理图图表 272.4 实验结果分析1.调用
18、modelsim的仿真结果如下图表 28结果分析:由于本实验在区域六选择的是6分频,clkfx也是六分频,无位相移动因此可以从波形很直观的看出实验结果。即clkfx和clkdv都是六分频和clkin是同相位的2.为了得到其他的频率输出可以对DCM参数进行修改,如将clkdv改成3分频后的仿真波形。可以看到clkdv输出变成了3分频,而clkfx不做改变图表 293.将clk180选中,将clkfx180选中,两者都是六分频,仿真波形如图所示,从图形可以看出实验结果与预期的相符合。Clkfx180和clk180与clkfx和clkdv是反相关系。图表 304. 实验心得和体会:通过本次实验操作,
19、初步了解了利用DCM产生我们所需要的波形的基本流程,也对DCM产生波形的利用有了更进一步的了解。为下下一步的进一步深入学习起到一个好的开始。5. 实验过程中存在的问题和解决方法1) 无法在ise 里面调用modelsim进行仿真:可能是没有编译xilinx库文件,或者编译后并没有在modelsim中进行添加。若还是不行,先进行常规仿真,看是否有软件有问题,有问题进行再次重装。2) 修改了DCM参数后为何仿真波形没有改变:首先确认是否是将生成的dcm_test.v拷贝至工程目录再添加,还是直接从dcm 工程里面的文件添加到ise工程文件中,拷贝的需要再次拷贝更新后的文件到工程中再添加,若是后者只
20、要更新工程即可,若更改了输入输出需要对测试文件重新关联。3) 如何更直观的去查看自己写出来的代码综合后的电路图:ise提供了可观察综合后的RTL级电路结构和门级的电路结构原理图,可以让设计人员通过更直观的的原理图来观察自己所写代码的原理图,这样更能加深对硬件描述语言的了解。实验三 按键检测实验3.1 实验目的1.学会鉴别信号的上升沿和下降沿,熟练掌握信号的检测。2.学会按键检测原理,熟练掌握按键信号的检测,掌握和理解按键抖动对信号检测的影响。3.2 实验原理3.2.1 信号检测原理 信号的采集就是对信号的上升沿和下降沿进行采集,上图是一个信号enable,它变为高电平几个周期后再变为低电平。首
21、先对信号的enable进行一拍时钟采样,也就是一个时钟周期的延迟,经过处理后的信号enably_dly是enable的一个延迟一个时钟周期后的信号,如图所示。图表 313.2.2 键盘检测原理按键检测原理是:当按键按下时,输入电平由高变低,按键松开后,输入电平有低变高,如此会产生一个下降沿和一个上升沿,只要扑捉到这两个沿,就可以确定按键按下。3.2.3 键盘防抖原理在按键被按下的瞬间,由于物理上的原因,导致按键在被按键的瞬间的过程中其实是处于高电平和低电平之间进行抖动,加上本实验的时钟频率很高,容易产生信号采集错误,导致检测失败,无法得到正确的结果。若要正确防抖,需要在检测到按键上升沿后延迟一
22、小段信号在进行上升沿和下降沿检测。3.3 实验步骤1建立ise 工程,建立按键检测文件和测试文件如图所示:图表 32键盘检测程序如下:module key_scan(clk,reset_n,key,led); input clk; input reset_n; input key; output led; reg key_dly; reg key_dly1; reg key_pose_flag; reg key_nege_flag; reg key_pulse; reg led; always (negedge reset_n or posedge clk) begin if(reset_n=
23、1b0) key_dly=1b0; else key_dly=key; end always (negedge reset_n or posedge clk) begin if(reset_n=1b0) key_dly1=1b0; else key_dly1=key_dly; end always (negedge reset_n or posedge clk) begin if(reset_n=1b0) key_nege_flag=1b0; else if(key_dly=1b0&key_dly1=1b1) key_nege_flag=1b1; else if(key_pulse=1b1)
24、key_nege_flag=1b0; end always (negedge reset_n or posedge clk) begin if(reset_n=1b0) key_pose_flag=1b0; elseif(key_nege_flag=1b1)beginif(key_dly=1b1&key_dly1=1b0)key_pose_flag=1b1;else if(key_pulse=1b1)key_pose_flag=1b0;end end always (negedge reset_n or posedge clk) begin if(reset_n=1b0) key_pulse=
25、1b0; else if(key_pose_flag=1b1&key_nege_flag=1b1) key_pulse=key_pulse; else key_pulse=key_pulse; end always (posedge clk or negedge reset_n)beginif(reset_n=1b0)led =1b1; elseif(key_pulse=1b1)led =led; end endmodule 测试文件:include./key_scan.vtimescale 1ns/1nsmodule key_scan_t;reg clk,key,reset_n;wire l
26、ed;key_scan test(.clk(clk),.key(key),.reset_n(reset_n),.led(led);always #1 clk=clk;initialbegin reset_n=0;key=1;clk=0; #10 reset_n=0; #10 reset_n=1; #10 key=0; #10 key=1; #10 key=0; #10 reset_n=0; #10 reset_n=1; #10 key=1; #10 key=0; #10 key=1; #10 key=0; #10 key=1; #10 key=0; #10 key=1; #10 key=0;
27、#10 key=1; #100 $stop;endendmodule 2.对键盘检测文件进行综合和仿真。综合结果如图所示图表 33门级的原理图如下:图表 343.在ise 工程中添加ucf 文件,完成管脚分配布局布线生成FPGA的bit文件,下载到实验板进行检测图表 354.下载到实验板进行实验,然后修改至正常检测。3.4 实验结果分析1 .键盘检测仿真波形图表 36波形分析:通过波形我们可以看出,在经过检测键盘按下的下降沿和上升沿得到上升标志和下降标志延迟了将近2个时钟周期,在键盘松手后,产生一个时钟周期的脉冲信号使灯的状太相反,如波形所示,本程序能较好的完成了键盘的检测。2. 心得与体会:
28、通过本次实验,使我进一步明白了键盘检测的原理,通过实验想象进行更直观的学习键盘检测。同时通过本次实验,让我充分感受到在进行实验板调试之前的功能仿真的重要性。信号的检测使我不会再滥用信号的边沿触发,纠正了我进行代码便携的一大误区,同时也加深理解了硬件语言和软件语言的区别。3. 实验过程中存在的问题和解决方法。1)综合无法通过提示混合信号赋值:大有可能是因为进行了在统一always模块当中进行了阻塞和非阻塞同时赋值的情况,这是不可综合的。2)按键按下后,灯就一直亮着,只能按下复位键让其变暗:这是因为实验指导书的范例程序没有对灯点亮信号进行翻转,只要检测到一次键盘按下便进行点亮保持。3)发现键盘有时
29、感觉不灵敏:这是由于按键在按下的过程中会发生抖动的现象,加上实验开发板的时钟频率比较大,因此需要加上一段延迟才能更准确的消除抖动,因此本实验需要在后续的学习和实践中进一步的晚上,才能写出一个较完美的键盘检测消抖程序。实验四 LCD数字秒表4.1 实验目的1. 学会比较大型的数字系统的设计方法和步骤2. 掌握LCD的控制协议和时序工作状态3. 掌握可综合代码的编写和仿真4. 掌握利用状态机来描述接口协议和状态转移控制5. 熟练掌握分频器的设计6. 掌握整个系统设计的初步能力和方法4.2 实验原理1. LCD工作时序如下图所示,并有相对应的时间约束,由于本实验只用到写时序,因此只介绍读的工作时序。
30、下图是整个LCD的写数据和命令的控制时许,在本实验中需要编写一个lcd_ctrl模块文件来描述此时序要求来发送数据。图表 372. LCD工作控制原理,在本实验中需要将数据写道LCD的内部的寄存器当中,达到控制显示的要求。本实验开发板中由于选择四位的传送模式,因此须在初始化过程的最开始进行设定其中需要在开机后进行LCD初始化操作,然后再不断的进行数据传输扫描显示,初始过程可参考如下:图表 383. LCD接口功能定义如下:图表 394.本试验程序的设计方法和流程1)本实验程序将整个LCD数字秒表系统分成三大模块,分别是LCD时序发生控制模块,数据和命令读写控制状态模块,数字时钟信号产生模块,数
31、据和命令读写控制模块调用其他两个模块实现整个数字系统,系统框图如下:图表 402)时钟发生器程序设计流程时钟发生器由两部分构成,一个是功能键盘,一个是时钟计数器,的时钟由外部晶振提供,第一级产生周期为10ms的时钟进行ms计数,产生百位和十位,百位十位采用十进制计数方式便于数据的输出,分别产生4位的数据,每一个数字为的4位与30H拼接成8位,构成ASCII输出。同时长生S时钟,由秒时钟产生分钟时钟,采用和ms相类似的计数方式,输出都是八位二进制数。流程如下:图表 413)LCD时序控制模块的设计LCD时序控制主要是为了产生和LCD接口协议和时序相吻合的时序,根据时序图可以得出如下的状态流程:图
32、表 42设计流程:图表 434)数据发送控制模块本模块起到协调各模块的作用来控制写数据和写命令,状态机如图所示,首先进行初始化,然后进行数据传输数字跑表的显示,循环进行扫描显示。图表 44设计流程如下: 图表 45 5. LCD数据传送格式。本实验程序设计将数据一次十位数据在读写使能触发后,锁存进入LCD时序模块,防止过程数据变化带来的读写数据错误。低八位为控制命令数据或者显示命令数据,第九位是控制写命令还是写数据的R信号,第十位控制是读数据还是写数据,由于本实验只涉及写数据,因此整个过程默认为低电平及写数据。在初始化后,状态机便进入数字跑表的数据显示传送。在这个传送的过程中将要显示的个字符组
33、合成一个字符串首位串接10b0010000100及在第五个位置开始显示,当显示一串完毕后,再次写入控制数据返回到写显示第一个字符的地方重新刷新显示。整个字符串内容如下:2b00,8h84,2b01,minu_h,2b01,minu_l,2b01,8h3a,2b01,sec_h,2b01,sec_l,2b01,8h3a,2b01,ms_h,2b01,ms_l,2b00,8h846. 键盘检测键盘检测与实验三的原理相似,这里不再详述7. 状态机流程控制本实验共有两个状态机,状态机的转移由相对应的标志信号来控制举例如下:对于function_set状态来说,当进入这个状态后,将此状态需要延迟的时钟信号付给计数器,生成function_set_ok标志信号,然后转向wait状态,开始发出发送数据命令,在nibble标志位的作用下先发送高四位,LCD时序控制模块产生发送完毕应答信号后进入发送低四位,当再次接到接到应答信号时,转入下一状态。具体可参考附录程序。4.3 实验步骤1.