1、FPGA基于HDL的十进制计数器设计基于HDL的十进制计数器设计一、实验目的1、掌握基于语言的ISE设计全流程;2、熟悉、应用VerilogHDL描述数字电路;3、掌握基于Verilog的组合和时序逻辑电路的设计方法。4、掌握chipscope片内逻辑分析仪的使用与调试方法。5、设计具有异步复位、同步使能的十进制计数器,其计数结果可以通过七段数码管、发光二极管等进行显示。二、实验原理1、十进制计数器的设计即是设置一变量,当计数脉冲上升沿到来时,先判断是否为9,若是则置零,否则就进行加一操作。将变量再进行一个译码操作输出到数码管显示即可。图1 实验原理图2、数码管分为7 段和8 段,七段数码管由
2、 7段二极管组成。8段数码管比起7段数码管多了一个显示小数点的LED。数码管按发光二极管单元衔接方式分为共阳极数码管和共阴极数码管。本实验使用共阳数码管。它是指将一切发光二极管的阳极接到一同构成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到电源VCC 上,当某一字段发光二极管的阴极为低电平相应字段就点亮。当某一字段的阴极为高电平相应字段就不亮。共阳端可以作为位选端,实现动态扫描。动态扫描即是利用了人眼睛的视觉暂留现象,以合适的频率显示每一位数码管,便会产生所有数码管是一起点亮的错觉,数码管原理图如图:图2 共阳数码管示意图3、数码管显示数字与对应的输入数据的关系如表所示:0
3、8hc018hf928ha438hb048h9958h9268h8278hf888h8098h90表1 数码管显示表4、本次设计一共有11个端口:输入信号:clk -待计数的时钟。clr -异步清零信号,当clr=1,输出复位为0,当clr=0,正常计数。ena-使能控制信号,当ena=1,电路正常累加计数,否则电路不工作。输出信号:q6:0-驱动数码管,显示计数值的个位。cout -1bit数据,显示计数值向十位的进位图。三、实验步骤1、整个系统主要设计的模块是:十进制计数模块和数码管驱动模块,由于实验板的按键为实现硬件防抖,则需要将按键输入的时钟clk,先通过消抖模块消抖后,再输出至后续使
4、用。图3 系统结构图2、分别进行各个模块的设计并进行仿真测试。1)十进制计数器模块设计输入:CLK -待计数的时钟。CLR -异步清零信号,当CLR =1,输出复位为0,当CLR =0,正常计数。ENA-使能控制信号,当ENA=1,电路正常累加计数,否则电路不工作。输出:SUM3:0- 计数值的个位,即在CLK上升沿检测到SUM=9时,SUM将被置0,开始新一轮的计数。COUT -计数值的十位进位,即只有在时钟CLK上升沿检测到SUM=9时,COUT将被置1,其余情况下COUT=0。2)数码管显示驱动模块输入:sum3:0 -待显示的数值。输出:out6:0 -驱动数码管的七位数值(注意下表中
5、out的对应位3)消抖模块(1)按键抖动的产生原因:通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。图4 按键抖动波形图(2)本次实验提供的消抖模块简介 图5 消抖模块框图(3)电平检查模块:检测输入的按键是否被按下或者释放,并分别将H2L_Sig,L2H_Sig拉高,并随后拉低,给出按键的操作信息。(4)延时模块:对输入的信号变化进行计时并观察信号的变换情况,对输出端口进行恰当地赋值。注:实验资料中将给出消抖
6、模块设计源代码。对模块的具体设计细节不需理解,消抖模块不要求仿真。3、根据板子锁定引脚,并生成下载文件。数码管驱动的七位信号可输出到电路板上相关引脚。为简化设计,可将消抖模块的复位信号、使能信号与cnt10模块共用。根据下载板资料,完成引脚锁定,生成相关的用户约束文件(ucf)。注意:由于clk没锁在ISE默认的时钟输入引脚上,需要添加代码:“CLOCK_DEDICATED_ROUTE = FALSE;”锁引脚代码:NET CLK LOC = P57| CLK_DEDICATED_ROUTE = FALSE ;NET CLK_50 LOC = P80;NET COUT LOC = P23;NE
7、T ENA LOC = P32;NET CLR LOC = P26;NET DATA_OUT6 LOC = P102;NET DATA_OUT5 LOC = P99;NET DATA_OUT4 LOC = P107;NET DATA_OUT3 LOC = P109;NET DATA_OUT2 LOC = P112;NET DATA_OUT1 LOC = P100;NET DATA_OUT0 LOC = P106;4、Chipscope在线调试(1)Chipscope调试开始 ,新建.cdc文件。在HDL工程中添加chipscope file,选择ChipScope Definition and
8、 Connection File,file name 取名seg。(2)Chipscope-配置 .cdc文件在原有的HDL工程下出现新建seg.cdc文件,可以在chipscope植入 ILA 和 ICON IP核,双击seg.cdc文件,进入配置界面。(3)Chipscope-设置触发端口、类型等。进入配置界面,每个触发端口ILA核可支持多路比特数据,最多可有16个端口,触发匹配类型共有6种。这里配置根据需要调试的数据个数、类型决定。(4)Chipscope-设置采样深度设置采样深度,即为一次采样数据所显示的深度、个数。深度范围512-16384,采样深度越深,耗费资源越多。然后点击Net
9、 Connections标签,设置设置触发时钟与触发信号界面。(5)Chipscope-设置采样信号选择Modify Connections 选项,进入采样时钟和触发信号设置,采样时钟用于捕捉触发信号(6)Chipscope-设置采样时钟设置触发时钟,一般选择系统频率最高的主时钟。注:Net selections中每个channel必须有添加有信号,否则综合要报错。(7)Chipscope-设置触发数据同样设置触发信号,将TPO与TP1端口中的每个channel都添加,此处TP0监测clk、clr、ena、cout。TP1监测的数码管七段信号q7:0、以及COM。(8)Chipscope-JT
10、AG扫描设置好以后保存退出,综合与实现,双击图中Analyze Design Using Chipscope。进入chipscope软件,单击 按钮开始JTAG扫描,查找FPGA器件。(9)Chipscope-装载.bit文件JTAG扫描以后会发现三个设备,选择XC3S500E,在DEV:0 MyDevice(XC3S500E)右击configure按以下图进行操作,选择下载的bit流文件(10)Chipscope-装载.cdc文件(11)开始采样(12)Chipscope-分析数据分析数据,在开发板上数码管显示为0,统通过计算得出七段输出q6:0 = 7b1000000,加上COM端为8b1
11、1000000。观察chipscope软件中,如下图所示,采样数据为0xc0,换成二进制刚好是8b11000000。得出结论:硬件测试系统设计正确。图6 Chipscope在线调试仿真图四、实验结果1、十进制计数器模块仿真测试图7 计数器波形图由图可以看出测试波形与理论分析结果相符,当使能ena=1时,clr=0,且时钟上升沿来临时,十进制计数模块开始计数,当计数到9时,产生进位,当clr=1时,计数清零;当ena=0时暂停计数。2、下载到实验板上面后的结果数码管开始显示为0,之后每拨动一次拨动开关,数码管的显示值就加1,当加到9的时候产生一个进位即是LED0发光,并且又从0开始计数。拨动复位
12、键数码管清零。将使能开关置低,可以看到数码管显示值不在变化,即是计数器不在计数。实验结果符合设计要求。3、跑表下载实验效果八位数码管全部显示为0,之后开始计数,最右边两个数码管一直在加和清零。右边第三个数码管按照一秒加一的速度在进行变化。按下复位端,及拨码开关1拨动到低电位,数码管显示值清零。拨码开关2波动到低电位时,数码管显示值暂停。实验结果符合设计要求。4、四位十进制频率计下载效果开始时数码管全显示为0。大概过了一秒左右,显示为500,即是事先设定好的计数脉冲的频率。拨动拨码开关1到低电位的位置,数码管显示值清零,过一秒左右又显示频率值。五、思考题1、如何用两个或一个always 实现十进
13、制计数模块?module cnt10(clk_k,clk,clr,ena,sum,cout);input clk,clk_k,clr,ena;output3:0 sum;output cout;reg3:0 sum;reg cout;reg a,b;always (posedge clk )begin a = clk_k; b = a;endwire key_posedge = (b&a)?1b1:1b0;always (posedge clk)begin if(clr) begin cout = 0; sum = 0; end else if(key_posedge&ena) begin i
14、f(sum 4d9) begin sum = sum+1b1; cout = 0; end else begin cout = 1; sum = 0; end end else begin cout = cout; sum = sum; endendendmodule2、如何用always,或assign实现数码管的驱动设计?module tube(clk,sum,seg);input clk;input3:0 sum;output7:0 seg;reg7:0 seg;always (posedge clk)begin case(sum) 4d0:seg = 8hc0; 4d1:seg = 8
15、hf9; 4d2:seg = 8ha4; 4d3:seg = 8hb0; 4d4:seg = 8h99; 4d5:seg = 8h92; 4d6:seg = 8h82; 4d7:seg = 8hf8; 4d8:seg = 8h80; 4d9:seg = 8h90; default:seg = 8h00; endcaseend3、比较实验一与实验二的实验过程,说明原理图输入法与HDL输入法的不同的应用环境。原理图适用于将模块综合的设计。HDL输入可以适用基础模块的设计,基础模块写好以后调用起来更方便。六、代码1、Cnt10的Verilog HDL代码:module cnt10(clk_k,clk
16、,clr,ena,sum,cout);input clk,clk_k,clr,ena;output3:0 sum;output cout;reg3:0 sum;reg cout;reg a,b;always (posedge clk )begin a = clk_k; b = a;endwire key_posedge = (b&a)?1b1:1b0;always (posedge clk)begin if(clr) begin cout = 0; sum = 0; end else if(key_posedge&ena) begin if(sum 4d9) begin sum = sum+1
17、b1; cout = 0; end else begin cout = 1; sum = 0; end end else begin cout = cout; sum = sum; endendendmodule2、数码管的VerilogHDL代码: module tube(clk,sum,seg);input clk;input3:0 sum;output7:0 seg;reg7:0 seg;always (posedge clk)begin case(sum) 4d0:seg = 8hc0; 4d1:seg = 8hf9; 4d2:seg = 8ha4; 4d3:seg = 8hb0; 4
18、d4:seg = 8h99; 4d5:seg = 8h92; 4d6:seg = 8h82; 4d7:seg = 8hf8; 4d8:seg = 8h80; 4d9:seg = 8h90; default:seg = 8h00; endcaseendendmodule3、激励文件:module test_cnt10; / Inputs reg clk_k; reg clk; reg clr; reg ena; / Outputs wire 3:0 sum; wire cout; / Instantiate the Unit Under Test (UUT) cnt10 uut ( .clk_k
19、(clk_k), .clk(clk), .clr(clr), .ena(ena), .sum(sum), .cout(cout) ); initial begin / Initialize Inputs clk_k = 0; clk = 0; clr = 0; ena = 0; / Wait 100 ns for global reset to finish forever#10 clk = clk; / Add stimulus here end initial begin forever#20 clk_k = clk_k; end initial begin #30 begin clr =
20、 1;ena= 0;end #30 begin clr = 1;ena = 1;end #30 begin clr = 0;ena = 1;end end4、引脚锁定:NET clk_key LOC = P57;NETclk_key CLOCK_DEDICATED_ROUTE = FALSE;NET ena LOC = P20;NET clr LOC = P26;NET cout LOC = P22;#NET sel0 LOC = P132;#NET sel1 LOC = P129;#NET sel2 LOC = P128;#NET sel3 LOC = P127;#NET sel4 LOC = P126;#NET sel5 LOC = P123;#NET sel6 LOC = P122;#NET sel7 LOC = P120;NET seg0 LOC = P102;NET seg1 LOC = P99; NET seg2 LOC = P107;NET seg3 LOC = P109;NET seg4 LOC = P112;NET seg5 LOC = P100;NET seg6 LOC = P106;NET seg7 LOC = P108;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1