电子科技大学ASIC 秒表计时电路实验报告.docx

上传人:b****0 文档编号:8969445 上传时间:2023-05-16 格式:DOCX 页数:21 大小:133.26KB
下载 相关 举报
电子科技大学ASIC 秒表计时电路实验报告.docx_第1页
第1页 / 共21页
电子科技大学ASIC 秒表计时电路实验报告.docx_第2页
第2页 / 共21页
电子科技大学ASIC 秒表计时电路实验报告.docx_第3页
第3页 / 共21页
电子科技大学ASIC 秒表计时电路实验报告.docx_第4页
第4页 / 共21页
电子科技大学ASIC 秒表计时电路实验报告.docx_第5页
第5页 / 共21页
电子科技大学ASIC 秒表计时电路实验报告.docx_第6页
第6页 / 共21页
电子科技大学ASIC 秒表计时电路实验报告.docx_第7页
第7页 / 共21页
电子科技大学ASIC 秒表计时电路实验报告.docx_第8页
第8页 / 共21页
电子科技大学ASIC 秒表计时电路实验报告.docx_第9页
第9页 / 共21页
电子科技大学ASIC 秒表计时电路实验报告.docx_第10页
第10页 / 共21页
电子科技大学ASIC 秒表计时电路实验报告.docx_第11页
第11页 / 共21页
电子科技大学ASIC 秒表计时电路实验报告.docx_第12页
第12页 / 共21页
电子科技大学ASIC 秒表计时电路实验报告.docx_第13页
第13页 / 共21页
电子科技大学ASIC 秒表计时电路实验报告.docx_第14页
第14页 / 共21页
电子科技大学ASIC 秒表计时电路实验报告.docx_第15页
第15页 / 共21页
电子科技大学ASIC 秒表计时电路实验报告.docx_第16页
第16页 / 共21页
电子科技大学ASIC 秒表计时电路实验报告.docx_第17页
第17页 / 共21页
电子科技大学ASIC 秒表计时电路实验报告.docx_第18页
第18页 / 共21页
电子科技大学ASIC 秒表计时电路实验报告.docx_第19页
第19页 / 共21页
电子科技大学ASIC 秒表计时电路实验报告.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

电子科技大学ASIC 秒表计时电路实验报告.docx

《电子科技大学ASIC 秒表计时电路实验报告.docx》由会员分享,可在线阅读,更多相关《电子科技大学ASIC 秒表计时电路实验报告.docx(21页珍藏版)》请在冰点文库上搜索。

电子科技大学ASIC 秒表计时电路实验报告.docx

电子科技大学ASIC秒表计时电路实验报告

电子科技大学通信学院

秒表计时电路实验报告

 

班级

学生

学号

实验时间2015年11月27日

 

一、设计思路概述

设计要求:

秒表计时功能,显示分、秒、0.01秒;具有启动、暂停、停止和清空功能;增加有趣的流水灯;输入信号:

4bit按键,50MHz时钟;输出信号:

6位数码管

.设计分析:

本设计要求秒表计时功能,显示分、秒、0.01秒,而这可以由分频电路实现,将电路的输入时钟进行分频,得到1/60Hz,1Hz,和100Hz信号,就可以达到本设计要求的显示要求了;本设计要求具有启动、暂停、停止和清空功能,而这个可以由状态机实现,通过合理的配置状态转换,就可以达到要求。

流水灯的实现:

单个灯从左到右逐步发光。

相当于是一个移位寄存器,我们可通过不同的时钟来驱动它,实现不同的流水速度。

这里,我们实现了一个1Hz,和一个10Hz的流水灯电路。

二、总体设计框图及详细说明

状态机实现清零、暂停、停止等状态的切换由2比特的key信号控制,计数器500000进制由输入时钟产生周期0.01s的时钟,这是显示时钟信号的最小单位。

计数器10进制可实现10分频,由他产生的输出时钟为输入时钟周期的10倍,并根据他的状态即计数量作为输出显示对应位的时间信号,6进制实现6分频,实现功能类似于计数器10进制,通过如框图中的组合可产生时钟信号的不同位。

显示译码电路显示时钟,输出56位,因为时钟信号具有8位,输出信号连到相应的数码管即可。

三、模块设计框图、相关时序

1.6进制计数器(分频器)设计

//计数器实现6分频,计数到达2和5,输出始终翻转一次,且计数达到5时计数清零

modulecount6(rst,clk,clkout,counter);

inputrst;

inputclk;

outputregclkout;

outputreg[3:

0]counter;

always@(negedgeclkornegedgerst)begin

if(~rst)begin

clkout<=0;

counter<=0;

end

elseif(counter==2)begin

clkout<=~clkout;

counter<=counter+4'b1;

end

elseif(counter==5)begin

clkout<=~clkout;

counter<=0;

end

elsebegin

counter<=counter+4'b1;

end

end

endmodule

仿真结果为:

由图可知实现了6分频。

2、10进制计数器(分频器)设计

//计数器实现10分频,计数到达4和9,输出始终翻转一次,且计数达到9时计数清零

modulecount10(rst,clk,clkout,counter);

inputrst;

inputclk;

outputregclkout;

outputreg[3:

0]counter;

always@(negedgeclkornegedgerst)begin

if(~rst)begin

clkout<=0;

counter<=0;

end

elseif(counter==4)begin

clkout<=~clkout;

counter<=counter+4'b1;

end

elseif(counter==9)begin

clkout<=~clkout;

counter<=0;

end

elsebegin

counter<=counter+4'b1;

end

end

endmodule

仿真结果为:

由图可知实现了10分频。

3、500000进制计数器(分频器)设计:

//实现500000分频,目的是把50Mhz的系统时钟分频成为100Hz的

always@(negedgeclkornegedgerst10ms)begin

if(~rst10ms)

begin

clk10ms<=0;

clk10msreg<=0;

end

elseif(clk10msreg==249999)

begin

clk10ms<=~clk10ms;

clk10msreg<=clk10msreg+1;

end

elseif(clk10msreg==499999)

begin

clk10ms<=~clk10ms;

clk10msreg<=0;

end

else

begin

clk10msreg<=clk10msreg+1;

end

end

4、状态机设计

代码为:

//通过状态机实现复位信号的转换

always@(negedgeclkornegedgeclear)begin

if(~clear)

begin

state<=idlestate;rst<=0;rst10ms<=0;

end

else

begin

case(state)

idlestate:

begin

if(~start)

begin

state<=prestate;

rst<=0;

rst10ms<=0;

end

else

state<=idlestate;

end

prestate:

begin

state<=runstate;

rst<=1;

rst10ms<=1;

end

holdstate:

begin

if(~stop)

begin

state<=idlestate;

rst<=1;

rst10ms<=0;

end

elseif(~start)

begin

state<=runstate;

rst<=1;

rst10ms<=1;

end

else

state<=holdstate;

end

runstate:

begin

if(~stop)

begin

state<=idlestate;

rst<=1;

rst10ms<=0;

end

elseif(~hold)

begin

state<=holdstate;

rst<=1;

rst10ms<=0;

end

else

state<=runstate;

end

default:

state<=state;

endcase

end

end

5、显示译码电路设计

//实现动态显示

always@(negedgeclkornegedgerst)begin

if(~rst)begin

displayreg<=3'b000;

segcode[0]<=7'b1111111;

segcode[1]<=7'b1111111;

segcode[2]<=7'b1000000;

segcode[3]<=7'b1000000;

segcode[4]<=7'b1000000;

segcode[5]<=7'b1000000;

segcode[6]<=7'b1000000;

segcode[7]<=7'b1000000;

end

elsebegin

case(timeout[displayreg])

0:

segcode[displayreg]<=7'b1000000;

1:

segcode[displayreg]<=7'b1111001;

2:

segcode[displayreg]<=7'b0100100;

3:

segcode[displayreg]<=7'b0110000;

4:

segcode[displayreg]<=7'b0011001;

5:

segcode[displayreg]<=7'b0010010;

6:

segcode[displayreg]<=7'b0000010;

7:

segcode[displayreg]<=7'b1011000;

8:

segcode[displayreg]<=7'b0000000;

9:

segcode[displayreg]<=7'b0010000;

default:

segcode[displayreg]<=7'b1111111;

endcase

displayreg<=displayreg+3'b1;

end

end

6、流水灯设计

//流水灯显示

always@(negedgeclk1sornegedgerst)

begin

if(~rst)

ledg<=8'b0;

elseif(ledg==8'b0)

ledg<=8'b10000000;

else

ledg<=(ledg>>1);

end

always@(negedgeclk100msornegedgerst)

begin

if(~rst)

ledr<=18'b0;

elseif(ledr==18'b0)

ledr<=18'b100000000000000000;

else

ledr<=(ledr>>1);

end

四、代码及必要注释

顶层模块:

moduleclock(key,ledr,ledg,hex,clk);

input[3:

0]key;

inputclk;

outputreg[17:

0]ledr;

outputreg[7:

0]ledg;

output[55:

0]hex;

wireclear;

wirestart;

wirestop;

wirehold;

assignclear=key[0];

assignstart=key[1];

assignstop=key[2];

assignhold=key[3];

reg[19:

0]clk10msreg;

regclk10ms;

wireclk100ms;

wireclk1s;

wireclk10s;

wireclk1min;

wireclk10min;

wireclk1h;

reg[1:

0]state;

parameteridlestate=2'b00,prestate=2'b01,holdstate=2'b10,runstate=2'b11;

regrst;//低电平有效,10分频,6分频的复位

regrst10ms;//低电平有效,500000分频的复位

reg[2:

0]displayreg;

wire[3:

0]timeout[7:

0];

reg[6:

0]segcode[7:

0];

assignhex={segcode[7],segcode[6],segcode[5],segcode[4],segcode[3],segcode[2],segcode[1],segcode[0]};

//通过状态机实现复位信号的转换

always@(negedgeclkornegedgeclear)begin

if(~clear)

begin

state<=idlestate;rst<=0;rst10ms<=0;

end

else

begin

case(state)

idlestate:

begin

if(~start)

begin

state<=prestate;

rst<=0;

rst10ms<=0;

end

else

state<=idlestate;

end

prestate:

begin

state<=runstate;

rst<=1;

rst10ms<=1;

end

holdstate:

begin

if(~stop)

begin

state<=idlestate;

rst<=1;

rst10ms<=0;

end

elseif(~start)

begin

state<=runstate;

rst<=1;

rst10ms<=1;

end

else

state<=holdstate;

end

runstate:

begin

if(~stop)

begin

state<=idlestate;

rst<=1;

rst10ms<=0;

end

elseif(~hold)

begin

state<=holdstate;

rst<=1;

rst10ms<=0;

end

else

state<=runstate;

end

default:

state<=state;

endcase

end

end

//实现500000分频,目的是把50Mhz的系统时钟分频成为100Hz的

always@(negedgeclkornegedgerst10ms)begin

if(~rst10ms)

begin

clk10ms<=0;

clk10msreg<=0;

end

elseif(clk10msreg==249999)

begin

clk10ms<=~clk10ms;

clk10msreg<=clk10msreg+1;

end

elseif(clk10msreg==499999)

begin

clk10ms<=~clk10ms;

clk10msreg<=0;

end

else

begin

clk10msreg<=clk10msreg+1;

end

end

//例化了6分频和10分频的计数器

count6min10counter(rst,clk10min,clk1h,timeout[7]);

count10min1counter(rst,clk1min,clk10min,timeout[6]);

count6sec10counter(rst,clk10s,clk1min,timeout[5]);

count10sec1counter(rst,clk1s,clk10s,timeout[4]);

count10ms100counter(rst,clk100ms,clk1s,timeout[3]);

count10ms10counter(rst,clk10ms,clk100ms,timeout[2]);

assigntimeout[1]=4'b1111;

assigntimeout[0]=4'b1111;

//实现动态显示

always@(negedgeclkornegedgerst)begin

if(~rst)begin

displayreg<=3'b000;

segcode[0]<=7'b1111111;

segcode[1]<=7'b1111111;

segcode[2]<=7'b1000000;

segcode[3]<=7'b1000000;

segcode[4]<=7'b1000000;

segcode[5]<=7'b1000000;

segcode[6]<=7'b1000000;

segcode[7]<=7'b1000000;

end

elsebegin

case(timeout[displayreg])

0:

segcode[displayreg]<=7'b1000000;

1:

segcode[displayreg]<=7'b1111001;

2:

segcode[displayreg]<=7'b0100100;

3:

segcode[displayreg]<=7'b0110000;

4:

segcode[displayreg]<=7'b0011001;

5:

segcode[displayreg]<=7'b0010010;

6:

segcode[displayreg]<=7'b0000010;

7:

segcode[displayreg]<=7'b1011000;

8:

segcode[displayreg]<=7'b0000000;

9:

segcode[displayreg]<=7'b0010000;

default:

segcode[displayreg]<=7'b1111111;

endcase

displayreg<=displayreg+3'b1;

end

end

//流水灯显示

always@(negedgeclk1sornegedgerst)

begin

if(~rst)

ledg<=8'b0;

elseif(ledg==8'b0)

ledg<=8'b10000000;

else

ledg<=(ledg>>1);

end

always@(negedgeclk100msornegedgerst)

begin

if(~rst)

ledr<=18'b0;

elseif(ledr==18'b0)

ledr<=18'b100000000000000000;

else

ledr<=(ledr>>1);

end

endmodule

子模块1:

6进制分频

//计数器实现6分频,计数到达2和5,输出始终翻转一次,且计数达到5时计数清零

modulecount6(rst,clk,clkout,counter);

inputrst;

inputclk;

outputregclkout;

outputreg[3:

0]counter;

always@(negedgeclkornegedgerst)begin

if(~rst)begin

clkout<=0;

counter<=0;

end

elseif(counter==2)begin

clkout<=~clkout;

counter<=counter+4'b1;

end

elseif(counter==5)begin

clkout<=~clkout;

counter<=0;

end

elsebegin

counter<=counter+4'b1;

end

end

endmodule

子模块2:

10进制分频

//计数器实现10分频,计数到达4和9,输出始终翻转一次,且计数达到9时计数清零

modulecount10(rst,clk,clkout,counter);

inputrst;

inputclk;

outputregclkout;

outputreg[3:

0]counter;

always@(negedgeclkornegedgerst)begin

if(~rst)begin

clkout<=0;

counter<=0;

end

elseif(counter==4)begin

clkout<=~clkout;

counter<=counter+4'b1;

end

elseif(counter==9)begin

clkout<=~clkout;

counter<=0;

end

elsebegin

counter<=counter+4'b1;

end

end

endmodule

子模块1、2的testbench:

`timescale1ps/1ps

moduleclock_vlg_tst();

regclk;

regrst;

wireclkout;

wire[3:

0]counter;

clocki1(

//portmap-connectionbetweenmasterportsandsignals/registers

.clk(clk),

.clkout(clkout),

.counter(counter),

.rst(rst)

);

initial

begin

rst=0;

clk=1;

#10;

clk=0;

#10;

rst=1;

#500;

$finish;

end

always

begin

#30;

forever

begin

clk=~clk;

#10;

end

end

endmodule

五、总结及心得体会

第二次实验增加了状态机的设计与描述,计时器的核心是分频器的设计与实现,通过6、10进制分频的组合即可实现及时。

在这个过程中还涉及到了流水灯的概念与实现。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2