...基于FPGA的数字式秒表一、设计任务及要求秒表由于其计时精确,分辨率高(0.01秒),在各种竞技场所得到了广泛的应用,本次设计的任务就是设计一个基于FPGA的数字式秒表。1、基本要求:(1)性能指标:秒表的分辨率为0.01秒,最长计时时间为99.99秒;(2)设置启/停开关和复位开关(计数控制器):启/停开关S1的使用方法与传统的机械计时器相同,即按一下启/停开关,启动计时器开始计时,再按一下启/停开关计时终止。复位开关S2用来使计时器清0,复位开关可以在任何情况下使用,即使在计时过程中,只要按一下复位开关,计时进程应立即终止,并对计时器清零。(开关按下为0,弹起为1)。(3)秒表的计时基准信号:以周期为0.01秒(频率100HZ)的计时脉冲作为一个比较精准的计时基准信号输入到0.01秒位计数器的时钟端;在设计中采用分频器把1000HZ的时钟信号转换为100HZ的计时基准信号,其分频系数为10。(4)数码管动态显示:七段数码管采用动态扫描的方式显示,扫描需要一个比较高频率的信号,本次设计选用1000HZ。为了得到1000Hz信号,必须对输入的时钟信号50MHZ进行分频。显示模块共用11个管脚,其中8个用于连接8个数码管的七段LED,还有3个管脚用于选择点亮哪个数码管,每隔很短的一段时间8个数码管交替点亮,依次循环,动态显示,由于人眼的视觉残留,可以观察到连续的测量计数器的计数值。上电后,八个数码管中左边四个显示自己的学号后四位,在运行过程中一直不变;右边四个显示计时时间,范围0000~9999,利用两个按钮S1、S2控制计时。2、提高要求:加入小数点,计时数码管显示范围00.00~99.99。...二、系统原理框图1000Hz100Hz50MHz1000Hz三、电路实现显示译码器数据选择器38译码器模8计数器位控,3位信号段控,8位信号5万分频器模10计数器10分频器控制器...四、功能模块1、分频器(以10分频器为例)(1)VerilogHDL语言程序modulefp10(Clk,Out);inputClk;outputOut;regOut;reg[3:0]Cout;regClk_En;initialOut=0;always@(posedgeClk)beginCout=(Cout==4'd10)?4'd0:(Cout+4'd1);Clk_En=(Cout=4'd5)?1'd1:1'd0;Out=Clk_En;endEndmodule(2)模块化电路(3)波形仿真由波形仿真图可以看出,10分频器将1000Hz的脉冲分频成100Hz的脉冲。2、计数器(以模10计数器为例)(1)VerilogHDL语言程序modulecounter10(Clk,EN,RET,CQ,OUT...);inputClk;inputEN,RET;output[3:0]CQ;outputOUT;regOUT;/*---------------------------------------------------*/wireRst_n;assignRst_n=RET;/*---------------------------------------------------*/reg[3:0]Led;regClk_En;always@(posedgeClkornegedgeRst_n)beginif(~Rst_n)beginOUT=0;Led=4'd0;endelsebeginClk_En=Clk;if(Clk_En&EN)beginbeginif(Led=4'd8)Led=Led+3'd1;elseLed=4'd0;endbeginif(Led=4'd9)OUT=1'd1;elseOUT=1'd0;endendendend/*---------------------------------------------------*/assignCQ=Led;/*---------------------------------------------------*/...endmodule(2)模块化电路(3)波形仿真由波形图可以看出,100Hz的脉冲源,模10计数器D3-D0输出0000-1001,每10个脉冲进位位OUT输出一个单脉冲。3、数据选择器(1)VerilogHDL语言程序modulenumchoose(sel,num4,num5,num6,num7,k);input[2:0]sel;input[3:0]num4;input[3:0]num5;input[3:0]num6;input[3:0]num7;outputreg[3:0]k;alwaysbegincase(sel)3'b000:k=4'd0;3'b001:k=4'd3;3'b010:k=4'd1;3'b011:k=4'd1;3'b100:k=num4;3'b101:k=num5;3'b110:k=num6;3'b111:k=num7;endcaseendendmodule(2)模块化电路...(3)波形仿真由波形图可以看出,在1000Hz的扫描信号及100Hz的计时信号下,数据选择器输出前四位输出学号后四位0311(0000,0011,0001,0001),后四位输出范围0000—9999(0000,0000,0000,0000—1001,1001,1001,1001)。4、显示译码器(带小数点)(1)VerilogHDL语言程序modulexianshiyimaqi(k,Sev_Seg_Led_Data_n,del);input[3:0]k;output[7:0]Sev_Seg_Led_Data_n;input[2:0]del;reg[7:0]Led;reg[3:0]D,C,A,B;always@(k)beginif(del==3'b101)case(k)4'b0000:Led=8'b0111_1111;4'b0001:Led=8'b0000_1101;4'b0010:Led=8'b1011_0111;4'b0011:Led=8'b1001_1111;4'b0100:Led=8'b1100_1101;4'b0101:Led=8'b1101_1011;4'b0110:Led=8'b1111_1011;4'b0111:Led=8'b0000_1111;4'b1000:Led=8'b1111_1111;4'b1001:Led=8'b1101_1111;default:Led=8'b0000_000;endcase...elsecase(k)4'b0000:Led=8'b0111_1110;4'b0001:Led=8'b0000_1100;4'b0010:Led=8'b1011_0110;4'b0011:Led=8'b1001_1110;4'b0100:Led=8'b1100_1100;4'b0101:Led=8'b1101_1010;4'b0110:Led=8'b1111_1010;4'b0111:Led=8'b0000_1110;4'b1000:Led=8'b1111_1110;4'b1001:Led=8'b1101_1110;default:Led=8'b0000_000;endcaseendassignSev_Seg_Led_Data_n=Led;endmodule(2)模块化电路(3)小数点问题由于是只在第六个数码管(S5)上加小数点,且一直存在,故编写显示译码器程序时,在其输出8位段码时,再加一个位控选择器,即当位码为101(S5)时,段码最后一位(D0)总为1。5、计数控制器(1)VerilogHDL语言程序modulecontrol(S1,S2,P,CR);inputS1,S2;outputP,CR;wireS1,S2;regP;regCR;initialP=0;always@(negedgeS1ornegedgeS2)beginif(~S2)...beginCR=0;P=0;endelsebeginCR=1;P=~P;endendEndmodule(2)模块化电路(3)波形仿真由波形可以看出,初始时刻S1,S2皆为高电平,CR(清零)和P(使能)皆为低电平,计数器不工作;按S1,CR和P变为高,计数器开始计数;再按S1,P变为低,计数器使能端为低,暂停计数;按S2,CR和P都变为低,计数器清零且暂停计数。五、仿真与测试结果(1)按S1使计数器开始计数,计数器正常工作时,数码管的输出即为数据选择器的输出经过显示译码器得到的结果,显示范围为031100.00—031199.99。(2)按S1一下,计数器暂停计数,因此数据选择器输出,显示译码器输出,数码管显示...信号皆保持不变。(3)按S2一下,计数器清零且暂停计数,数码管显示(031100.00)。六、实验总结与心得体会开始进行设计时,对整个设计的原理和用Verilog语言编写程序不是非常熟悉,因此采用直接调用集成模块画原理图的方法进行设计,结果发现像74160和74151这种模块都具有许多不必要的控制端口,因此连线不仅繁多而且还极容易出错。特别是8选1数据选择器74151,由于显示译码器需要4位信号输入,所需要的4个数据选择器也就需要更多的连线。随着设计的进行,发现采用自顶而下的方式,用Verilog语言编写每一个模块,在原理图中直接调用生成的图形文件,不仅没有了很多的控制端口和由此带来的连线,而且像数据选择器这种输入与输出之间逻辑很清晰的模块不仅可以直接编写成为一个大模块,而且这样程序编写起来也很简单。尽管十进制计数器也可以编写成一个大模块,但由于存在进位问题,程序编写起来不算容易,逻辑性也不是很强,因此还是选择采用四个单独的计数器。第一次在试验箱上测试存在进位问题,即由低位的8到9时直接跳到高位的9然后再到高位的0。分析认为是由于十进制计数器存在着进位问题,其程序片段如下:always@(posedgeClkornegedgeRst_n)——————————...if(Led=4'd9)OUT=1'd1;elseOUT=1'd0;可以看出,对于OUT进位输出,0到8时是低电平,9为高电平,即8到9时有上升沿,9回到0时是下降沿,而计数器的Clk是上升沿触发。除了修改程序的方法,还可以采用直接在OUT后接非门将上升沿与下降沿互换。欢迎您的光临,Word文档下载后可修改编辑.双击可删除页眉页脚.谢谢!希望您提出您宝贵的意见,你的意见是我进步的动力。赠语;1、如果我们做与不做都会有人笑,如果做不好与做得好还会有人笑,那么我们索性就做得更好,来给人笑吧!2、现在你不玩命的学,以后命玩你。3、我不知道年少轻狂,我只知道胜者为王。4、不要做金钱、权利的奴隶;应学会做“金钱、权利”的主人。5、什么时候离光明最近?那就是你觉得黑暗太黑的时候。6、最值得欣赏的风景,是自己奋斗的足迹。7、压力不是有人比你努力,而是那些比你牛×几倍的人依然比你努力。