FPGA电子表.docx

上传人:b****8 文档编号:9332532 上传时间:2023-02-04 格式:DOCX 页数:31 大小:66.39KB
下载 相关 举报
FPGA电子表.docx_第1页
第1页 / 共31页
FPGA电子表.docx_第2页
第2页 / 共31页
FPGA电子表.docx_第3页
第3页 / 共31页
FPGA电子表.docx_第4页
第4页 / 共31页
FPGA电子表.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

FPGA电子表.docx

《FPGA电子表.docx》由会员分享,可在线阅读,更多相关《FPGA电子表.docx(31页珍藏版)》请在冰豆网上搜索。

FPGA电子表.docx

FPGA电子表

FPGA课程设计报告提纲

1.任务

设计一个电子表微控制器,并且能显示1/10秒、秒、分。

可以预设值,还可以复位清零。

学会板子上的LCD液晶显示屏,按键的使用(消抖),拨动开关。

2.目的

熟悉Sparten-3E板子,会使用它的硬件,比如板子上的LCD液晶显示屏,板子自带的按键,还有拨动开关。

利用这些硬件设计出电子表微控制器,使用按键改变1/10秒,秒,分,使用拨动开关暂停电子表,使用板子上的LCD液晶显示屏来显示时间,和通过按键改变后的时间。

熟练掌握verilog语言的使用。

3.使用环境(软件/硬件环境,设备等)

Modelsim和Xilinx-ISE-10.1

4.FPGA课程设计详细内容

4.1技术规范

电子表微控器设计技术规范

V1.0

版本信息

版本

日期

描述

作者

1.0

2011年3月1日

电子表微控器设计

陆晓育

2.0

2011年3月8日

电子表微控器设计

陆晓育

目录

1总体描述

1.1功能定义

1.用FPGA开发板的拨动开关作为电子表的时间初值设置控制信号,首先设置出电子表的1/10秒,秒,分初值。

并且在LCD上显示出1/10秒,秒,分

2.使用拨动开关(Switch1)作为电子表的总控制开关,当Switch1为低电平时,才可以修改时间。

3.按键2(Button2)作为1/10秒的初值设置控制键。

4.按键3(Button3)作为秒的初值设置和修改的控制键。

5.按键4(Button4)作为分的初值设置和修改的控制键。

6.在LCD上显示修改后的时间。

7.使用Switch2作为电子表的复位,当它为低电平时,把电子表的1/10秒,秒,分清零。

1.2结构框图

1.3设计工艺

1.3应用范围

作为电子表查看时间,时间更加的精确。

还可以当做跑表使用。

2引脚描述

名称

引脚(inputoroutput)

位宽

描述

1Switch1

INPUT

1

控制初值设置,并且是修改时间的总开关,当它为低电平时,才能修改1/10秒,秒,分

2Button2

INPUT

1

当总开关开启时(为低电平),修改1/10秒

3Button3

INPUT

1

当总开关开启时(为低电平),修改秒

4Button4

INPUT

1

当总开关开启时(为低电平),修改分

5CLOCK_50MHZ

INPUT

1

产生50MHZ的晶振输出,给系统应用

6LCD_EN

OUTPUT

1

LCD的读/写操作允许控制信号,为高电平时允许读写,低电平时不允许

7LCD_RS

OUTPUT

1

寄存器选择控制信号,为低电平时写操作期间LCD的复位端

8LCD_R/W

OUTPUT

1

读写控制信号,0:

写,LCD接受数据1:

读,LCD输出数据

9DB0

OUTPUT

1

FPGA连接LCD的数据端DB4

10DB1

OUTPUT

1

FPGA连接LCD的数据端DB5

11DB2

OUTPUT

1

FPGA连接LCD的数据端DB6

12DB3

OUTPUT

1

FPGA连接LCD的数据端DB7

13reset

INPUT

1

电子表的复位端,当它为低电平时,电子时钟的1/10秒,秒,分都清零。

4功能模块描述

4.1时钟模块

1.1/10秒

在这个模块中有1/10秒,秒,分,通过这几个时间来反映做出来的电子表,用板子里面的50MHZ产生出10HZ的分频作为1/10秒,从而进行计时。

2.Switch1:

初值设置开关(总开关):

拨动到低电平时,1/10秒,秒,分都停止,开始设置时间。

拨动到高电平时,说明时间设置完毕,时钟开始正常运行。

Button2按键1(修改1/10秒):

按一次,1/10秒加1。

Button3按键2(修改秒):

按一次,秒加1。

Button4按键3(修改分):

按一次,分加1。

4.2按键模块

这个模块完成的是按键的消抖,使用系统自带50MHZ时钟分频得到的25MHZ,再进行按键采样,人一般的反应时间在50ms左右,所以采样的计数设置为25MHZ*50ms。

4.3LCD显示模块

1.第一行显示“TIME“.

2.LCD上的第二行显示1/10秒,秒,分。

3.LCD上的第二行显示修改后的1/10秒,秒,分。

4.4时钟分频模块

使用FPGA板子中自带的50MHZ时钟分频得到10HZ(用于电子表计时),分频得到25MHZ(用于按键消抖模块时对按键采样的频率)。

5电学指标

6绝对最大范围

7建议工作条件

8其他说明

4.2设计方案

电子表微控器设计方案

V1.0

版本信息

版本

日期

描述

作者

1.0

2011年3月1日

电子表微控器设计

陆晓育

2.0

2011年3月8日

电子表微控器设计

陆晓育

目录

1概述

设计一个电子表微控制器,用FPGA开发板的拨动开关作为电子表的时间初值设置控制信号,并且使用按键改变时间(1/10秒,秒,分),LCD显示当前时间值以及修改后的时间。

2设计目标

2.1功能定义

1.用FPGA开发板的拨动开关作为电子表的时间初值设置控制信号,首先设置出电子表的1/10秒,秒,分初值。

并且在LCD上显示出1/10秒,秒,分

2.使用按键1(Switch1)作为电子表的总控制开关,当Switch1为低电平时,才可以修改时间。

3.使用reset作为电子表的复位,当它为低电平时,把电子表的1/10秒,秒,分清零。

4.按键2(Button2)作为1/10秒的初值设置控制键。

5.按键3(Button3)作为秒的初值设置和修改的控制键。

6.按键4(Button4)作为分的初值设置和修改的控制键。

7.在LCD上显示修改后的时间。

2.2接口描述

名称

引脚(inputoroutput)

位宽

描述

1Switch1

INPUT

1

控制初值设置,并且是修改时间的总开关,当它为低电平时,才能修改1/10秒,秒,分

2Button2

INPUT

1

当总开关开启时(为低电平),修改1/10秒

3Button3

INPUT

1

当总开关开启时(为低电平),修改秒

4Button4

INPUT

1

当总开关开启时(为低电平),修改分

5CLOCK_50MHZ

INPUT

1

产生50MHZ的晶振输出,给系统应用

6LCD_EN

OUTPUT

1

LCD的读/写操作允许控制信号,为高电平时允许读写,低电平时不允许

7LCD_RS

OUTPUT

1

寄存器选择控制信号,为低电平时写操作期间LCD的复位端

8LCD_R/W

OUTPUT

1

读写控制信号,0:

写,LCD接受数据1:

读,LCD输出数据

9LCD_DB0

OUTPUT

1

FPGA连接LCD的数据端DB4

10LCD_DB1

OUTPUT

1

FPGA连接LCD的数据端DB5

11LCD_DB2

OUTPUT

1

FPGA连接LCD的数据端DB6

12LCD_DB3

OUTPUT

1

FPGA连接LCD的数据端DB7

13reset

INPUT

1

电子表的复位端,当它为低电平时,电子时钟的1/10秒,秒,分都清零。

端口定义:

端口名称

引脚定义

1Switch1

N17

2Button2

H13

3Button3

K17

4Button4

D18

5CLOCK_50MHZ

C9

6LCD_EN

M18

7LCD_RS

L18

8LCD_R/W

L17

9LCD_DB0

R15

10LCD_DB1

R16

11LCD_DB2

P17

12LCD_DB3

M15

13reset

H18

2.3引脚时序

Clock

Switch1

Button2

Button3

Button4

LCD_EN

LCD_RS

LCD_R/W

LCD_DB[0:

3]

3顶层方案设计

3.1顶层结构框图

3.2顶层模块划分

1.分频模块

使用FPGA板子中自带的50MHZ时钟分频得到10HZ(用于电子表计时1/10秒),分频得到25MHZ(用于按键消抖模块时对按键采样的频率)。

2.按键模块

这个模块完成的是按键的消抖,使用系统自带50MHZ时钟分频得到的25MHZ,再进行按键采样,人一般的反应时间在50ms左右,所以采样的计数设置为25MHZ*50ms。

Switch1:

用它作为时钟的总开关,当它为低电平有效时,开始设置电子表的初值。

reset:

使用reset作为电子表的复位,当它为低电平时,把电子表的1/10秒,秒,分清零。

Button2:

作为1/10秒的初值设置控制键(每按键一次,1/10秒加1,到9时在返还到0)。

Button3:

作为秒的初值设置和修改控制键(每按键一次,秒加1,累加到59时,返回到0)。

Button4:

作为分的初值设置和修改控制键(每按键一次,分加1,累加到59时,)。

3.时钟模块

利用FPGA板子当中晶振产生的50MHZ分频得到0.1秒,从而可以得到秒,分。

4.LCD液晶显示模块

显示初值设定的时间,并且可以显示修改后的时间。

3.3子模块说明

1.按键模块:

Switch1:

初值设置开关(总开关):

拨动到低电平时,1/10秒,秒,分都停止,开始设置时间。

拨动到高电平时,说明时间设置完毕,时钟开始正常运行。

Button2按键1(修改1/10秒):

按一次,1/10秒加1。

Button3按键2(修改秒):

按一次,秒加1。

Button4按键3(修改分):

按一次,分加1。

2.时钟模块:

1/10秒

在这个模块中有1/10秒,秒,分,通过这几个时间来反映做出来的电子表,用板子里面的50MHZ产生出10HZ的分频。

3.LCD液晶显示模块

显示1/10秒,秒,分

显示修改后的1/10秒,秒,分

4.按键消抖模块

这个模块完成的是按键的消抖,使用系统自带50MHZ时钟分频得到的25MHZ,再进行按键采样,人一般的反应时间在50ms左右,所以采样的计数设置为25MHZ*50ms。

4子模块详细设计

4.1键盘模块设计

Switch1:

用它作为时钟的总开关,当它高电平

(1)有效时,开始设置电子表的初值。

Reset:

作为电子表的复位,当它为低电平时,把电子表的1/10秒,秒,分清零。

Button2:

作为1/10秒的初值设置控制键(每按键一次,1/10秒加1,到9时在返还到0并且向秒进位1)。

Button3:

作为秒的初值设置和修改控制键(每按键一次,秒加1,累加到59时,返回到0并且向分进位1)。

Button4:

作为分的初值设置和修改控制键(每按键一次,分加1,累加到59时返回到0)。

4.2时钟模块设计

1.利用FPGA板子中晶振产生的50MHZ频率,把它分频成0.1秒即10HZ。

2.上面分频得到的0.1秒就是电子表的最小时间单位,当1/10秒从0开始走到9时,向秒进位1的同时,从9跳转到0,重新开始从零计时。

3.秒从0开始计数,当从1/10秒得到进位时,秒加1,直到计数计到59时,向分进位1的同时,从59跳转到0,重新开始从零计时。

4.分从0开始计数,当从秒得到进位时,分加1,直到计数计到59时,跳转到0,从零开始重新计时。

4.3LCD液晶显示模块

首先显示初值1/10秒,秒,分,如果有修改,那么LCD液晶显示屏显示出修改后的时间值

4.3功能验证方案

moduletextdianclock;

regclk1,reset;

wire[7:

0]fen,miao;

wire[3:

0]time_one_ten;

dianclockdc(reset,clk1,fen,miao,time_one_ten);

initial

begin

clk1=0;

reset=0;

end

always#5clk1=~clk1;

initial

begin

#15reset=1;

end

endmodule

4.4电路设计源代码,功能仿真激励源代码及功能仿真结果报告

ModuleTOP(CLK_50MHZ,reset,Switch1,Button2,Button3,Button4,LCD_RS,LCD_DB,LCD_RW,LCD_E);

inputCLK_50MHZ;

inputreset;

inputSwitch1,Button2,Button3,Button4;

//inputSwitch1,Button2,Button3,Button4;

outputLCD_RS,LCD_RW,LCD_E;

output[3:

0]LCD_DB;

//wire[3:

0]DATA;

wireclk1,clk2;

wire[7:

0]fen,miao;

wire[3:

0]time_one_ten;

wireButton6,Button7,Button8;

fenpinfp(.CLK_50MHZ(CLK_50MHZ),.clk1(clk1),.clk2(clk2));

//按键消抖

clearjittercj1(.clk2(clk2),.reset(reset),.Button_in(Button2),.Button_out(Button6));

clearjittercj2(.clk2(clk2),.reset(reset),.Button_in(Button3),.Button_out(Button7));

clearjittercj3(.clk2(clk2),.reset(reset),.Button_in(Button4),.Button_out(Button8));

//时钟计时

dianclockdc(.reset(reset),.clk1(clk1),.Button5(Switch1),

.Button6(Button6),.Button7(Button7),.Button8(Button8),

.fen(fen),.miao(miao),.time_one_ten(time_one_ten)

);

//LCD显示

LCDlc(.CLK_50MHZ(CLK_50MHZ),.LCD_RS(LCD_RS),.LCD_DB(LCD_DB),

.LCD_RW(LCD_RW),.LCD_E(LCD_E),

.fen(fen),.miao(miao),.time_one_ten(time_one_ten));

endmodule

modulefenpin(CLK_50MHZ,clk1,clk2);

inputCLK_50MHZ;

outputclk1;

outputclk2;

regclk1;

regclk2;

reg[22:

0]count;

reg[1:

0]count2;

always@(posedgeCLK_50MHZ)//fenpento10hz

begin

if(count==23'h4C4B40)

begin

count=0;

clk1=1;

end

else

begin

clk1=0;

count=count+1;

end

end

always@(posedgeCLK_50MHZ)//fenpento25mhz

begin

if(count2==2'b10)

begin

count2=0;

clk2=1;

end

else

begin

clk2=0;

count2=count2+1;

end

end

endmodule

moduledianclock(reset,clk1,Button5,Button6,Button7,Button8,

fen,miao,time_one_ten);

inputclk1,reset;

inputButton5,Button6,Button7,Button8;

output[7:

0]fen,miao;

output[3:

0]time_one_ten;

reg[7:

0]fen,miao;

reg[3:

0]time_one_ten;

wireclk;

assignclk=Button5&&clk1||Button6||Button7||Button8;

//**timecountmodule**//

always@(posedgeclkornegedgereset)

begin

if(!

reset)begin

time_one_ten=2'b00;fen=2'b00;miao=2'b00;

end

else

begin

if(fen==8'b01011001&&miao==8'b01011001&&time_one_ten==4'b1001)//59:

59:

9

begin

time_one_ten=0;fen=0;miao=0;

end

elseif(miao==8'b01011001&&time_one_ten==4'b1001)//##:

59:

9

begin

if(fen[3]&&fen[0])//#9:

59:

9

begin

fen=fen+7;

miao=0;time_one_ten=0;

end

else

begin//##:

59:

9

fen=fen+1;

miao=0;time_one_ten=0;

end

end

elseif(time_one_ten==4'b1001)//##:

##:

9

begin

if(miao[3]&&miao[0])//##:

#9:

9

begin

time_one_ten=0;

miao=miao+7;

end

else

begin

miao=miao+1;

time_one_ten=0;

end

end

//else

//time_one_ten=time_one_ten+1;//##:

##:

#

elseif(Button8)//correctthefen

begin

if(fen==8'b01011001&&miao==8'b01011001&&time_one_ten==4'b1001)//59:

##:

#

begin

fen=0;

end

elseif(miao==8'b01011001&&time_one_ten==4'b1001)//##:

##:

#

begin

if(fen[3]&&fen[0])//#9:

##:

#

fen=fen+7;

else

fen=fen+1;

end

elsefen=fen+1;

end

elseif(Button7)//correctthemiao

begin

if(fen==8'b01011001&&miao==8'b01011001&&time_one_ten==4'b1001)//59:

59:

#

begin

fen=0;miao=0;

end

elseif(miao==8'b01011001&&time_one_ten==4'b1001)//##:

59:

#

begin

if(fen[3]&&fen[0])

fen=fen+7;

else

fen=fen+1;

miao=0;

end

end

elseif(Button6)//correctthetime_one_ten(1/10)

begin

if(fen==8'b01011001&&miao==8'b01011001&&time_one_ten==4'b1001)//59:

59:

9

begin

time_one_ten=0;fen=0;miao=0;

end

elseif(miao==8'b01011001&&time_one_ten==4'b1001)//##:

59:

9

begin

if(fen[3]&&fen[0])

fen=fen+7;

else

fen=fen+1;

miao=0;

time_one_ten=0;

end

elseif(time_one_ten==4'b1001)//##:

##:

9

begin

if(miao[3]&&miao[0])

miao=miao+7;

else

miao=miao+1;

time_one_ten=0;

end

else

time_one_ten=time_one_ten+1;

end

else

time_one_ten=time_one_ten+1;//##:

##:

#

end//theendofelse

end//theendofalways

endmodule

moduleclearjitter(clk2,reset,Button_in,Button_out);

inputclk2;//50mhzto25mhz

inputreset;

inputButton_in;

outputButton_out;

//wireButton_out;

reg[20:

0]cnt1;

reg[20:

0]cnt2;

regButton_out1_reg;

//samplingtime=50ms*25mhz

assignButton_out=Button_out1_reg;

//caiyanghighlevel

always@(posedgeclk2ornegedgereset)

begin

if(!

reset)

cnt1<=21'h000000;

else

begin

if(Button_in==1'b1)

cnt1<=cnt1+1;//countofhighlevel

else

cnt1<=21'h000000;

end

end

//caiyanglowlevel

always@(posedgeclk2ornegedgereset)

begin

if(!

reset)

cnt2<=21'h000000;

else

begin

if(Button_in==1'b0)

cnt2<=cnt2+1;//countoflowlevel

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

当前位置:首页 > 小学教育 > 小学作文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1