基于 FPGA 的电风扇的自动定时开关控制
器设计
2012-06-25
基于 FPGA 的电风扇的自动定时开关控制
器设计
一. 功能描述
1. 本设计通过一个二选一选择器,可以让使用者选择电风扇的工作状态,普
通工作状态还是定时工作状态。
2. 通过计数器的运用完成倒计时功能,实现电风扇的定时功能。
3. 通过计数器完成对主时钟的分频,为电路提供其各自的时钟。
4. 通过 D 触发器和与门电路完成对定时信号的处理,提供倒计时是否结束的
信号。
5. 通过门电路的控制实现总开关控制电扇是否工作,即总开关开,电扇工作;
总开关关,电扇停止工作,不论定时是否完成。
二.输入输出信号描述
DDS
OUT
DATA[2:0]
CLK
信号名
CLK
DATA[2:0]
OUT_q
输入/输出 目标/源
Input
Pin
Input
Output
Pin
Pin
功能描述
主时钟频率,50M ,占空
比 1:1。
3 位的输入数据
波形输出
三 顶层划分
图 1 系统框图
顶层模块说明:
1.状态选择器:二选一选择器,选择电扇工作状态;
2.定时数据输入: D 触发器和计数器的组合,实现数据的输入,使用 bcd 码
计数;
3.倒计时: 计数器,实现倒计数,完成定时功能;
4.信号反馈:D 触发器,控制倒计时是否停止;
5.分频器:计数器,提供电路各自所需要的时钟;
6.输出端:门电路,实现总开关控制电扇是否工作;
7.D:D 触发器输入端,接收加法器输出数据;
8.Q:D 触发器输出端,并将输出数据反馈回加法器输入端,实现数据累加;
9.OUT:接收 D 触发器输出数据的高 8 位,作为波形存储器的地址线;
设计思想说明:
1、DDS 主要用来实现产生各种频率的正弦波,为了使波形更加准确,必须产
生较多的“点”,本设计中共产生 28 个“点”。
2、由于要产生各种频率的波形,所以本设计中采用加法器和数据锁存器的
组合来实现频率的切换。如下图:
通过改变 DATA 的数值可以控制地址线输出的速度。具体波形输出频率可用下
面的公式计算:
四、子模块描述
4.1 地址加法器 D 触发器
1、功能描述
运用加法器和数据锁存器实现地址线输出的频率变换。
2、管脚描述
信号名称
Data
Q_out
Add_out
D
Fclk
输入 / 输出
输入
输入|输出
输出
输入
输入
源
PIN
PIN
PIN
PIN
PIN
目标
功能描述
加法器 3 位数据输入
数据锁存器 11 位反馈值,
同时也是 D 触发器 11 位
输出端
加法器 11 位输出
D 触发器 11 位输入端
主时钟十分频后时钟
3、实现说明:
在主时钟上升沿的时候判断清零端是否为 0,为 0 则将 D 触发器的输入
输出清零;不为 0 则 D 触发器 Q=D,并将 Q 反馈给输入端,和 DATA 进行
下一次加法,实现累加功能。
4、验证方案
正常的加法功能;
是否实现累加;
4.2 波形存储器
1、功能描述
2、管脚描述
8 位地址线的存储器,用来存储波形数据;
信号名称
Address
Fclk
Mem_out
输入 / 输出
输入
输入
输出
源
PIN
PIN
PIN
目标
功能描述
8 位地址线
主时钟十分频后的时钟
8 位存储器输出值
3、实现说明
通过 matalab 软件生成一个正弦(余弦)波数据的.Mif 文件,并加入 quartus
软件的 rom 块中,然后直接调用生成的.v 文件。此文件就是存储器的源代码。
在 Fclk 的上升沿,将 Q 的高 8 位给到地址线 Address,由于上个模块实现的
累加功能,所以地址线实现累加,并且读取速度受上个模块控制。
4、测试
略;
4.3 分频器
1、功能描述
将主时钟实现十分频
2、管脚描述
信号名称
CLK
输入/输出
输入
FCLK
输出
PIN
PIN
源
目标
功能描述
主时钟,50M,
占空比 50%
分 频 后 的 时
钟,5M,占空
比 50%。
3、实现说明
通过计数器、比较器、D 触发器,实现分频。当计数从 0 到 4 时 FCLK
翻转一次,即十分频。
4、测试
用 modelsim 仿真,观察波形是否为十分频;
4.4 D/A 转换器
略
五、验证方案:
正常情况下,输入一个 DATA 的值,查看波形输出是否正常。改变 DATA 的值,
再次查看波形输出是否正常,并且其频率是否满足上述的公式计算出的值。
六、程序代码
1.主程序
module dds(clk,clr,data,out);
input clk,clr;
input data;
wire [2:0] data;
output out;
wire [7:0] out;
reg fclk;
wire [10:0] add_out;
reg [10:0] d;
reg [10:0] q_out;
reg [10:0] count;
reg [7:0] mem_in
sa mem(.address(mem_in),.clock(clk),.q(out));
//实例化 mem
assign add_out=(clr==0)?0:data+q_out;
always @ (posedge fclk)
begin
if(!clr)
begin
d=0;
q_out=0;
end
else
begin
d=add_out;
q_out=d;
end
end
always @ (posedge fclk)
if(!clr)
else
mem_in=0;
mem_in=q_out[10:3];
//十分频
always @ (posedge clk)
begin
if(!clr)
fclk=0;
else if(count==4)
begin
fclk=!fclk;
count=0;
else
count=count+1;
end
end
endmodule
2.mem 块程序
// megafunction wizard: %ROM: 1-PORT%
// GENERATION: STANDARD
// VERSION: WM1.0
// MODULE: altsyncram
altsyncram
//
============================================================
// File Name: sa.v
// Megafunction Name(s):
//
//
// Simulation Library Files(s):
//
//
============================================================
// ************************************************************
// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE!
//
// 9.0 Build 132 02/25/2009 SJ Full Version
// ************************************************************
altera_mf
//Copyright (C) 1991-2009 Altera Corporation
//Your use of Altera Corporation's design tools, logic functions
//and other software and tools, and its AMPP partner logic
//functions, and any output files from any of the foregoing
//(including device programming or simulation files), and any
//associated documentation or information are expressly subject
//to the terms and conditions of the Altera Program License
//Subscription Agreement, Altera MegaCore Function License
//Agreement, or other applicable license agreement, including,
//without limitation, that your use is for the sole purpose of
//programming logic devices manufactured by Altera and sold by
//Altera or its authorized distributors. Please refer to the
//applicable agreement for further details.