资源描述
西安邮电学院
FPGA课程设计报告
题 目:电风扇的自动定时开关控制器
院 系: 电子工程学院
专业班级: 微电子0901
学生姓名:
导师姓名:
起止时间: 2012.6.18 至 2012.6.29
FPGA课程设计报告提纲
1. 任务
运用FPGA
用FPGA开发板的按键作为输入控制键,用数码管显示当前电风扇自动定时状态(包括:自动开/关,工作定时等)。
2. 目的
运用verilog hdl描述设计,在开发板上实现要求。
3. 使用环境 (软件/硬件环境,设备等)
Ep2c35f672c6开发板
4. FPGA课程设计详细内容
4.1 技术规范
4.1.1 功能定义
(1),根据用户需求,通过按键切换来实现风扇定时和普通工作模式。
(2) 普通工作模式时,由手动开关控制电风扇的开关,即当开关打开时,风扇工作; 开关关闭时,风扇停止工作。
(3) 定时模式时,根据设定定时时间来选择电风扇工作时间,比如10 分钟、 20分钟、 30分钟等,并且同步显示剩余工作时间,但是此时用户仍可以通过开关控制提前关掉电扇。
(4) LED 上显示当前工作状态:风扇工作亮,停止工作灭。数码管显示总的设定的时间(小时,分钟)和剩余工作时间。
4.1.2 系统结构框图
分频模块
自动定时倒计时模块
模式选择控制模块
显示模块
Clk
In
opt
key
En
On
Out_H
Out_L
C_out
总体设计可以分为以上几个模块,各模块的功能简要介绍:
(1) 分频模块:模块的功能是把 50MHz 的系统时钟转换为 1Hz 的时钟,和2Hz的时钟。1Hz的时钟供计数模块的使用。2Hz的时钟供输入定时数值的使用。
(2)模式选择控制模块:选择需要的工作模式。包括两个模式:定时、普通。
(3)自动定时倒计时模块:选择定时模式后,根据键盘的输入值来设定工作时间,在定时时间以内则风扇工作,倒计时结束或开关关闭时风扇自动关闭。
(4)显示模块:LED 上显示当前工作状态:风扇工作亮,停止工作灭。数码管显示总的设定的时间和剩余工作时间。
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 功能验证方案
4.3 功能验证方案可变模值计数器模块项目 信号名 预期结果 实际结果 结果比较时钟输入 clk_50M 20ns 时钟信号 同左 √复位检测 rst 初始化高电平,等待 同左 √ 200ns 后变为低电平分频器脉冲进位 Clk rst 为低电平后,每 5 同左 √ 个时钟脉冲(为测试 方便选用模 5 分频 器)后产生一个高脉 冲 秒 time_sec 当 clk 为高时,加 1, 同左 √ 从 0 加到 60 分 time_min 当 time_sec 为高时, 同左 √ time_min .
4.4 电路设计源代码,功能仿真激励源代码及功能仿真结果报告
//顶层模块
module fan(op,clr,clk,key,fz,en,h_1,h_0,m_1,m_0,out,out_3,out_2,out_1,out_0,nclk);
input op,clr,clk,key,fz,en;
input h_1,h_0,m_1,m_0;
output out,nclk;
wire out,nclk;
output [6:0] out_3,out_2,out_1,out_0;
wire [7:0] h,m;
wire b_m,b_h;
wire [3:0] h_bcd_h,h_bcd_l,m_bcd_h,m_bcd_l;
wire a_1,a_0;
wire key_1;
wire sign;
wire inclk;
display play(.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));
fenpin fen(.inclk(inclk),.nclk(nclk),.clk(clk),.clr(clr));
clock min(.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));
hour ho(.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));
opt option(.op(op),.a_1(a_1),.a_0(a_0),.key(key),.clk(clk),.clr(clr),.key_1(key_1));
last la(.key(key),.key_1(key_1),.sign(sign),.out(out));
sg sos(.b_m(b_m),.b_h(b_h),.clk(clk),.clr(clr),.sign(sign));
led_display l_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
分频模块
module fenpin(clk,clr,nclk,inclk);
input clk,clr;
output nclk,inclk;
reg nclk,inclk;
reg [50:0] nadd,inadd;
always @ (posedge clk)
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 @ (posedge clk)
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
倒计时模块
module hour(a,en,sign,data,clk,b_h,bcd_h,bcd_l);
input a,clk,en,sign;
input [7:0] data;
wire [7:0] data;
output b_h;
reg b_h;
output [3:0] bcd_h,bcd_l;
reg [3:0] bcd_h,bcd_l;
reg [7:0] count;
reg e;
always @ (posedge clk)
begin
if(!en)
e=1;
end
always @ (posedge a or negedge en)
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 @ (posedge clk or posedge e)
begin
if(e)
begin
bcd_h=count[7:4];
bcd_l=count[3:0];
end
end
endmodule
module clock(en,a_1,sign,data,sclk,clk,b_m,bcd_h,bcd_l);
input en,sign,clk,sclk,a_1;
input [7:0] data;
wire [7:0] data;
output b_m;
reg b_m;
output [3:0] bcd_h,bcd_l;
reg [3:0] bcd_h,bcd_l;
reg [7:0] count;
wire as;
reg e;
assign as=e&sign&a_1;
always @ (posedge clk)
begin
if(!en)
e=1;
end
always @ (posedge sclk or negedge en)
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 @ (posedge clk or posedge e)
begin
if(e)
begin
bcd_h=count[7:4];
bcd_l=count[3:0];
end
end
endmodule
module sg(b_m,b_h,clk,sign,clr);
input b_m,b_h,clk,clr;
output sign;
reg sign;
always @ (posedge clk or negedge clr)
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
信号处理模块
module last(key,sign,key_1,out);
input key,sign,key_1;
output out;
wire out;
wire ks;
assign ks=key&sign;
assign out=ks|key_1;
endmodule
数据输入模块
module display(h_1,h_0,m_1,m_0,fz,clk,clr,h,m);
input h_1,h_0,m_1,m_0;
input clk,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 @ (posedge clk or negedge clr)
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 @ (posedge clk or negedge clr)
begin
if(!clr)
begin
add_h_0=0;
add_h_1=0;
end
else
begin
if(fz)
begin
if(!h_0)
begin
if(add_h_0==4'b1001)
begin
add_h_0=0;
end
else
begin
add_h_0=add_h_0+1;
end
end
if(!h_1)
begin
if(add_h_1==4'b0101)
begin
add_h_1=0;
end
else
begin
add_h_1=add_h_1+1;
end
end
end
end
end
always @ (posedge clk or negedge clr)
begin
if(!clr)
begin
h=0;
m=0;
end
else
begin
h={add_h_1,add_h_0};
m={add_m_1,add_m_0};
end
end
Endmodule
模式切换模块
module opt(op,a_1,a_0,key_1,key,clk,clr);
input op,key,clk,clr;
output a_1,a_0,key_1;
reg a_1,a_0;
assign key_1=key&a_0;
always @ (posedge clk or negedge clr)
begin
if(!clr)
begin
a_0=0;
a_1=0;
end
else
begin
if(op)
begin
a_1=1;
a_0=0;
end
else
begin
a_0=1;
a_1=0;
end
end
end
endmodule
led数码管显示模块
module led_display(out_3,out_2,out_1,out_0,clk,clr,data_3,data_2,data_1,data_0,sign);
input clk,clr,sign;
input [3:0] data_3,data_2,data_1,data_0;
output [6:0] out_3,out_2,out_1,out_0;
wire [6:0] out_3,out_2,out_1,out_0;
le
展开阅读全文