FPGA电风扇的自动定时开关控制器.docx

上传人:b****9 文档编号:25719031 上传时间:2023-06-11 格式:DOCX 页数:35 大小:198.58KB
下载 相关 举报
FPGA电风扇的自动定时开关控制器.docx_第1页
第1页 / 共35页
FPGA电风扇的自动定时开关控制器.docx_第2页
第2页 / 共35页
FPGA电风扇的自动定时开关控制器.docx_第3页
第3页 / 共35页
FPGA电风扇的自动定时开关控制器.docx_第4页
第4页 / 共35页
FPGA电风扇的自动定时开关控制器.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

FPGA电风扇的自动定时开关控制器.docx

《FPGA电风扇的自动定时开关控制器.docx》由会员分享,可在线阅读,更多相关《FPGA电风扇的自动定时开关控制器.docx(35页珍藏版)》请在冰豆网上搜索。

FPGA电风扇的自动定时开关控制器.docx

FPGA电风扇的自动定时开关控制器

西安邮电大学

FPGA课程设计报告

 

题目:

电风扇的自动定时开关控制器

院系:

电子工程学院

专业班级:

微电子0901

学生姓名:

李小斌

导师姓名:

黄海生

起止时间:

2012-6-18至2012-6-29

 

2012年6月29日

 

4.1.3应用范围................................................................................................5

4.3.1按键输入控制模块方案设计及源程序.................................................7

4.3.2控制模块方案设计及源程序.................................................................8

4.3.3LCD驱动模块方案设计及源程序.......................................................11

 

1、任务

题目:

电风扇的自动定时开关控制器及FPGA功能验证设计;

主要任务:

运用FPGA(SPARTAN3E)设计一个风扇定时开关控制器,能实现手动和自动模式之间的切换。

设计后能对设计进行功能上和时序上的验证和仿真测试。

2、目的

(1)熟悉FPGA开发的环境和FPGA的结构,了解FPGA开发的流程,熟悉进行verilog设

计时各种报告的格式;

(2)能够更熟练地使用verilog设计FPGA;

(3)增加把知识用于实践的实践能力。

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

软件环境:

xilinx开发板对应的综合开发工具ISE10.0;

硬件环境:

XINLIX的SPART3E开发板,此开发板有LCD点阵显示屏,8个LED灯,以及4个拨码开关。

开发板的供电电压为5V;

设备:

PC机一台,USB下载线,开发板配套电源。

4、FPGA课程设计详细内容

4.1技术规范

4.1.1功能定义

(1)可以根据用户的选择,由模式切换按键实现手动或自动模式。

(2)手动动模式时,由电源开关控制电风扇的开关,即当总开关打开时,风扇工作;总开关关闭时,风扇停止工作。

(3)自动模式时,输入自动工作时间,当开关打开时,风扇工作;工作时间结束时,风扇自动关闭。

(4)LCD上显示模式类型(手动,自动),模式的总时间和剩余时间。

4.1.2结构框图

总体设计可以分为以上几个模块,各模块的功能简要介绍:

(1)分频模块

模块的功能是把50MHz的系统时钟转换为1Hz的时钟和2Hz

的时钟。

1Hz的时钟供计数模块的使用;2Hz的时钟供输入定时数值的使用。

(2)模式选择控制模块

选择需要的工作模式。

包括两个模式:

定时、普通。

(3)自动定时倒计时模块

选择定时模式后,根据键盘的输入值来设定工作时间,在定时时

间以内则风扇工作,倒计时结束或开关关闭时风扇自动关闭。

(4)显示模块

LED上显示当前工作状态:

风扇工作亮,停止工作灭。

数码管显

示总的设定的时间和剩余工作时间。

(5)去按键抖动模块

能够消除按键按下或弹起时由于抖动而产生的不良影响,而使得控制器能安全稳定地工作。

在按键持续为高电平一定时间时,才产生作用。

并且在连续的高电平时,只产生一次作用。

4.1.3应用范围

可以用于控制电扇手动或按照一定的时间自动开关。

也可以用户控制其他的电器手动或自动开关。

4.1.4引脚描述

顶层模块管脚描述

(1)输入开关管脚

信号名称

功能描述

输入输出

位宽

Clk

系统时钟,频率为50MHz

input

1

Op

模式选择信号,为1时为定时模式;为0时为普通模式。

input

1

In

输入设定时间信号

input

4

Key

设定时间后开始计时信号

Input

1

Clr

清零信号

input

1

Fz

复制信号

Input

1

En

开始计时信号

Input

1

(2)输出显示管脚

信号名称

功能描述

输入输出

位宽

Out

风扇工作信号,为1是风扇工作,为0时风扇停止工作

Output

1

Out_3

时间高位数码管输出端,为时钟的十位

output

7

Out_2

时间低位数码管输出端,为时钟的个位

output

7

Out_1

时间高位数码管输出端,为分钟的十位

output

7

Out_0

时间高位数码管输出端,为分钟的十位

output

7

4.2设计方案

4.2.1概述

此自动定时控制器,可以实现定时模式和普通模式的切换,一共有六个

模块。

(1)分频模块

模块的功能是把50MHz的系统时钟转换为1Hz的时钟,和2Hz的

时钟。

1Hz的时钟供计数模块的使用。

2Hz的时钟供输入定时数值的使用。

(2)模式选择控制模块

模式选择控制模块:

选择需要的工作模式。

包括两个模式:

定时、普

通。

(3)自动定时倒计时模块

选择定时模式后,根据键盘的输入值来设定工作时间,在定时时间以

内则风扇工作,倒计时结束或开关关闭时风扇自动关闭。

(4)显示模块

LED上显示当前工作状态:

风扇工作亮,停止工作

灭。

数码管显示总的设定的时间和剩余工作时间。

(5)信号处理模块

该模块的主要作用是在定时没有结束的时候用火仍可以通过开关来控

制电扇的关闭。

(6)数据输入模块

当赋值信号(fz)有效后可以通过键盘输入定时的时间,确定输入无误后按下启动键(en),风扇开始倒计时。

4.2.2顶层模块划分

(1)分频模块

这个模块的功能是把频率为50MHz的时钟转换为1Hz的时钟,供计时模块的使用。

引脚分配:

信号名称

功能描述

方向

宽度

Clk

输入50MHz的时钟信号

input

1

Inclk

输出经过分频以后的1Hz的时钟信号

output

1

Nclk

输出经过分频后的2hz的时钟信号

Output

1

电路设计:

(2)模式选择控制模块

选择需要的工作模式。

包括两个模式:

自动、手动,op为1时是定时模式,opl为0时是普通模式。

若为定时模式风在设定的时间内自动工作,当计时结束时风扇自动停止工作,即计时反馈信号out为0时,风扇自动关闭。

若选为手动模式,则在有手动开关key来控制风扇的开关,key为1时风扇工作,为0时停止工作。

引脚分配:

信号名称

功能描述

方向

宽度

op

模式选择信号,为1时为自动开关模式;为0时为手动开关模式。

input

1

key

开关信号

input

1

out

风扇工作状态信号

output

1

clk

主时钟

Input

1

Clr

清零信号

Input

1

A_1

Op为1时a_1为1

Output

1

A_0

Op为0时a_0为1

Output

1

Key_1

Key和a_0都为1时可key_1为1,否则为0。

Output

1

电路设计:

(3)自动定时倒计时模块

选择定时模式后,根据键盘的输入值来设定工作时间,在定时时间以内则风扇工作,倒计时结束时风扇自动关闭。

管脚分配:

信号名称

功能描述

输入输出

位宽

Clk

主时钟

Input

1

nclk

计时时钟,频率为1Hz

input

1

en

开始倒计时信号

input

1

H

小时数据输入

input

8

m

分钟数据输入

Input

8

Sign

时间计数为零反馈信号

output

1

电路设计:

(4)显示模块

LED上显示当前工作状态:

风扇工作亮,停止工作灭。

数码管显示总的设定的时间和剩余工作时间。

管脚分配:

信号名称

功能描述

输入输出

位宽

Data_3

时间高位输出端,为小时的十位

input

4

Data_2

时间低位输出端,为小时的个位

input

4

Data_1

时间高位输出端,为分钟的十位

input

4

Data_0

时间低位输出端,为分钟的个位

input

4

Out_3

时间高位数码管输出端,为小时的十位

output

7

Out_2

时间低位数码管输出端,为小时的个位

output

7

Out_1

时间高位数码管输出端,为分钟的十位

Output

7

Out_0

时间低位数码管输出端,为分钟的个位

Output

7

Clk

主时钟

Input

1

clr

清零信号

Input

1

sign

计时信号

Input

1

电路设计:

(5)信号处理模块

该模块主要是用来在定时还没有结束时,用户仍可以通过开关关闭电扇。

信号名称

功能描述

输入输出

位宽

Key

电扇开关

Input

1

Key_1

电扇在普通模式下产生的工作信号

Input

1

Sign

倒计时信号

Input

1

Out

电扇工作信号

Output

1

(6)数据输入模块

该模块用于用户输入定时时间。

信号名称

功能描述

输入输出

位宽

Clk

2hz时钟,用于防抖

Input

1

clr

清零信号

Input

1

Fz

赋值信号

Input

1

H_0

小时低位输入端

Input

1

H_1

小时高位输入端

Input

1

M_0

分钟低位输入端

Input

1

M_1

分钟高位输入端

Input

1

H

小时输入数值

Output

8

M

分钟输入数值

Output

8

4.3功能验证方案

50M分频模块

项目

信号名

预期结果

实际结果

结果比较

时钟输入

clk_50M

20ns时钟信号

同左

复位信号

rst

前10个时钟周期为高,以后为低

同左

时钟输出

clk_1s

输出1HZ的时钟

同左

计数器模块

项目

信号名

预期结果

实际结果

结果比较

时钟输入

clk_50M

20ns时钟信号

同左

复位检测

rst

初始化高电平,等待200ns后变为低电平

同左

分频器脉冲进位

Clk

rst为低电平后,每5个时钟脉冲(为测试方便选用模5分频器)后产生一个高脉冲

同左

time_sec

当clk为高时,加1,从0加到60

同左

time_min

当time_sec为高时,time_min加1从0加到当前模式所规定的最大值

同左

进位信号

com_sig

当time_min和当前模式规定最大值相等的下一时钟为高电平

同左

工作状态指示信号

work_sig

当计数器在计数过程中时为高,否则为低

同左

LCD显示驱动模块

项目

信号名

预期结果

实际结果

结果比较

clk

50MHz时钟信号

50MHz的时钟

同左

rst

复位信号

开始高电平保持十个时钟周期

同左

addr

存储器地址

每个时钟周期到来时加1

同左

data

每个地址对应的数据

数据和地址应该一一对应,每个时钟周期的数据可以不同也可以相同

同左

lcd_data

Lcd数据发送信号

以次为data的值且时间间隔为2062个时钟周期

同左

lcd_en

使能信号

每隔2000个或50个时钟周期变高一次,持续时间为12个时钟周期

同左

lcd_rs

寄存器选择信号

每隔16*2062个时钟周期变高持续时间为2062个时钟周期

同左

lcd_rw

读写控制信号

由于在这个过程周都是些信号,所以在整个过程中都是高电平

同左

去按键抖动模块

项目

信号名

预期结果

实际结果

结果比较

clk

20ns时钟信号

每20ns产生一个时钟信号

同左

In_data

从外部输入的当前信号

刚开始有一定的抖动,过一段时间后信号稳定

同左

out_data

当输入的信号稳定后产生一个脉冲

当In_data持续稳定4080个时钟周期后发送一个高冲信号

同左

4.4电路设计源代码,功能仿真激励源代码

//顶层模块

modulefan(op,clr,clk,key,fz,en,h_1,h_0,m_1,m_0,out,out_3,out_2,out_1,out_0,nclk);

inputop,clr,clk,key,fz,en;

inputh_1,h_0,m_1,m_0;

outputout,nclk;

wireout,nclk;

output[6:

0]out_3,out_2,out_1,out_0;

wire[7:

0]h,m;

wireb_m,b_h;

wire[3:

0]h_bcd_h,h_bcd_l,m_bcd_h,m_bcd_l;

wirea_1,a_0;

wirekey_1;

wiresign;

wireinclk;

displayplay(.fz(fz),.h_1(h_1),.h_0(h_0),.m_1(m_1),.m_0(m_0),.clk(inclk),.clr(clr),.h(h),.m(m));

fenpinfen(.inclk(inclk),.nclk(nclk),.clk(clk),.clr(clr));

clockmin(.a_1(a_1),.sign(sign),.sclk(nclk),.en(en),.data(m),.clk(clk),.b_m(b_m),.bcd_h(m_bcd_h),.bcd_l(m_bcd_l));

hourho(.sign(sign),.en(en),.a(b_m),.data(h),.clk(clk),.b_h(b_h),.bcd_h(h_bcd_h),.bcd_l(h_bcd_l));

optoption(.op(op),.a_1(a_1),.a_0(a_0),.key(key),.clk(clk),.clr(clr),.key_1(key_1));

lastla(.key(key),.key_1(key_1),.sign(sign),.out(out));

sgsos(.b_m(b_m),.b_h(b_h),.clk(clk),.clr(clr),.sign(sign));

led_displayl_play(.sign(out),.out_3(out_3),.out_2(out_2),.out_1(out_1),.out_0(out_0),.clk(clk),.clr(clr),.data_3(h_bcd_h),.data_2(h_bcd_l),.data_1(m_bcd_h),.data_0(m_bcd_l));

endmodule

分频模块

modulefenpin(clk,clr,nclk,inclk);

inputclk,clr;

outputnclk,inclk;

regnclk,inclk;

reg[50:

0]nadd,inadd;

always@(posedgeclk)

begin

if(!

clr)

begin

nclk=0;

nadd=0;

end

else

begin

if(nadd==24999999)

begin

nclk=!

nclk;

nadd=0;

end

else

nadd=nadd+1;

end

end

always@(posedgeclk)

begin

if(!

clr)

begin

inclk=0;

inadd=0;

end

else

begin

if(inadd==12999999)

begin

inclk=!

inclk;

inadd=0;

end

else

inadd=inadd+1;

end

end

endmodule

倒计时模块

modulehour(a,en,sign,data,clk,b_h,bcd_h,bcd_l);

inputa,clk,en,sign;

input[7:

0]data;

wire[7:

0]data;

outputb_h;

regb_h;

output[3:

0]bcd_h,bcd_l;

reg[3:

0]bcd_h,bcd_l;

reg[7:

0]count;

rege;

always@(posedgeclk)

begin

if(!

en)

e=1;

end

always@(posedgeaornegedgeen)

if(!

en)

begin

count=data;

b_h=0;

end

else

begin

if(a)

begin

if(count[3:

0]==0)

begin

if(count[7:

4]==0)

begin

b_h=1;

end

else

begin

count[7:

4]=count[7:

4]-1;

count[3:

0]=4'b1001;

b_h=0;

end

end

else

begin

count[3:

0]=count[3:

0]-1;

b_h=0;

end

end

end

always@(posedgeclkorposedgee)

begin

if(e)

begin

bcd_h=count[7:

4];

bcd_l=count[3:

0];

end

end

endmodule

moduleclock(en,a_1,sign,data,sclk,clk,b_m,bcd_h,bcd_l);

inputen,sign,clk,sclk,a_1;

input[7:

0]data;

wire[7:

0]data;

outputb_m;

regb_m;

output[3:

0]bcd_h,bcd_l;

reg[3:

0]bcd_h,bcd_l;

reg[7:

0]count;

wireas;

rege;

assignas=e&sign&a_1;

always@(posedgeclk)

begin

if(!

en)

e=1;

end

always@(posedgesclkornegedgeen)

if(!

en)

begin

count=data;

b_m=0;

end

else

begin

if(as)

begin

if(count[3:

0]==0)

begin

if(count[7:

4]==0)

begin

count[7:

4]=4'b0101;

count[3:

0]=4'b1001;

b_m=1;

end

else

begin

count[7:

4]=count[7:

4]-1;

count[3:

0]=4'b1001;

b_m=0;

end

end

else

begin

count[3:

0]=count[3:

0]-1;

b_m=0;

end

end

end

always@(posedgeclkorposedgee)

begin

if(e)

begin

bcd_h=count[7:

4];

bcd_l=count[3:

0];

end

end

endmodule

modulesg(b_m,b_h,clk,sign,clr);

inputb_m,b_h,clk,clr;

outputsign;

regsign;

always@(posedgeclkornegedgeclr)

begin

if(!

clr)

begin

sign=1;

end

else

begin

if(b_h)

begin

if(b_m)

begin

sign=0;

end

else

begin

sign=1;

end

end

else

begin

sign=1;

end

end

end

endmodule

信号处理模块

modulelast(key,sign,key_1,out);

inputkey,sign,key_1;

outputout;

wireout;

wireks;

assignks=key&sign;

assignout=ks|key_1;

endmodule

数据输入模块

moduledisplay(h_1,h_0,m_1,m_0,fz,clk,clr,h,m);

inputh_1,h_0,m_1,m_0;

inputclk,clr,fz;

output[7:

0]h,m;

reg[7:

0]h,m;

reg[3:

0]add_m_0,add_m_1,add_h_0,add_h_1;

always@(posedgeclkornegedgeclr)

begin

if(!

clr)

begin

add_m_0=0;

add_m_1=0;

end

else

begin

if(fz)

begin

if(!

m_0)

begin

if(add_m_0==4'b1001)

begin

add_m_0=1'b0;

end

else

begin

add_m_0=add_m_0+1'b1;

end

end

if(!

m_1)

begin

if(add_m_1==4'b0101)

begin

add_m_1=1'b0;

end

else

begin

add_m_1=add_m_1+1'b1;

end

end

end

end

end

always@(posedgeclkornegedgeclr)

begin

if(!

clr)

begin

add_h_0=0;

add_h_1=0;

end

else

begin

if(fz)

begin

if(!

h_0)

begi

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

当前位置:首页 > 解决方案 > 工作计划

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

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