您的位置:首页 > 其它

基于CPLD的数字钟设计(一)

2006-04-27 16:03 483 查看
在“夏宇闻老师之verilog学习站”(http://verilog.113.tofor.com)中,有这样一道题目。
设计要求如下:
基于CPLD的数字钟设计
设计任务:
1、 设计一个具有时、分、秒计时,6位数字显示的时钟电路;
2、 具有快速校时功能;
3、 具有整点音响自动报时;
4、 以时钟电路为基础,设计如下表所示的作息时间自动打铃器;
表:自动打铃的作息时间
时间 作用
6:00 起床
7:50 上班预备
8:00 上班
9:30 工间操
12:00 下班
2:30 下午上班
5:30 下午下班
5、 以时钟电路为基础设计一个工业顺序控制器,用LED发光管的亮与灭模拟执行机构的动作,实现要求的工艺过程。

设计要求:
1、 按自顶向下的设计方法,画出系统实现框图。
2、 按模块化方法进行设计,在适当的地方给出注释。
3、 给出系统实现的完整程序或电路原理图,利用仿真手段进行功能调试,给出系统仿真波形图,下载到实验板,进行实际验证
借来练习一下:
可以看出,本题目的关键设计在一个可校正的时钟。其它均为外部设计,较为简单。故现只设计这一部分。

首先,作为数字钟的设计,即涉及到计数器:
秒表:模60计数器;
分表:模60计数器;
时表:模24计数器;
将模60计数器分成模6和模10;
将模24计数器分成模6和模4;

其次,校时功能如何实现呢?设置两个Function Key:Fm_key和Fh_key; Fm_key用来校正分表;Fh_key用来校正时表。
模块框图如下:



时钟正常运行时,分计数器以秒计数器的进位信号为clk, 时计数器以分计数器的进位信号为clk;
[align=left]校时时,若Fm_key为1,则将CLK_1HZ送至分计数器作CLK,可实现分表调整;[/align]
[align=left] 若Fh_key为1,则将CLK_1HZ送至时计数器作CLK,可实现时表调整;[/align]
[align=left] [/align]
[align=left]第一次编码:[/align]
[align=left]/*+FHDR--------------------------------------------------------[/align]
[align=left] file name: clock.v[/align]
[align=left] Author: Clarke.Lee[/align]
[align=left] E-mail: clarke.lee@163.com[/align]
[align=left] --------------------------------------[/align]
[align=left] Clock: 1hz[/align]
[align=left] Reset: Synchronous,Low[/align]
[align=left] include: counter60.v[/align]
[align=left] counter24.v[/align]
[align=left] --------------------------------------[/align]
[align=left] Keywords: Counter, Digital Clock[/align]
[align=left]//-FHDR---------------------------------------------------------*/ [/align]
[align=left] [/align]
[align=left]`timescale 1ns/1ns[/align]
[align=left]`include "counter60.v"[/align]
[align=left]`include "counter24.v"[/align]
[align=left] [/align]
[align=left]module clock(clk,[/align]
[align=left] fm_key,[/align]
[align=left] fh_key2,[/align]
[align=left] reset,[/align]
[align=left] h,[/align]
[align=left] m,[/align]
[align=left] s);[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]input clk;[/align]
[align=left]input f_key1;[/align]
[align=left]input f_key2;[/align]
[align=left]input reset;[/align]
[align=left]output [6:0] h;[/align]
[align=left]output [6:0] m;[/align]
[align=left]output [6:0] s;[/align]
[align=left] [/align]
[align=left]reg [6:0] h;[/align]
[align=left]reg [6:0] m;[/align]
[align=left]reg [6:0] s;[/align]
[align=left] [/align]
[align=left]wire clk_m;[/align]
[align=left]wire clk_h;[/align]
[align=left] [/align]
[align=left]wire cout_s;[/align]
[align=left]wire cout_m;[/align]
[align=left]wire cout_h;[/align]
[align=left] [/align]
[align=left]counter60 counters (.clk(clk),[/align]
[align=left] .reset(reset),[/align]
[align=left] .cout(cout_s),[/align]
[align=left] .out(s));[/align]
[align=left] [/align]
[align=left]counter60 counterm (.clk(clkm),[/align]
[align=left] .reset(reset),[/align]
[align=left] .cout(cout_m),[/align]
[align=left] .out(m));[/align]
[align=left] [/align]
[align=left]counter24 counterh (.clk(clkh),[/align]
[align=left] .reset(reset),[/align]
[align=left] .cout(cout_h),[/align]
[align=left] .out(h));[/align]
[align=left] [/align]
[align=left]//---- clock for minute counter ------[/align]
[align=left]if(fm_key)[/align]
[align=left] clkm = clk;[/align]
[align=left]else[/align]
[align=left] clkm = cout_s;[/align]
[align=left] [/align]
[align=left]//---- clock for hour counter --------[/align]
[align=left]if(fh_key)[/align]
[align=left] clkh = clk;[/align]
[align=left]else[/align]
[align=left] clkh = cout_m; [/align]
[align=left] [/align]
[align=left]endmoudle[/align]
[align=left] [/align]
[align=left]/*+FHDR--------------------------------------------------------[/align]
[align=left] file name: counter60.v[/align]
[align=left] Author: Clarke.Lee[/align]
[align=left] E-mail: clarke.lee@163.com[/align]
[align=left] --------------------------------------[/align]
[align=left] include: counter6.v[/align]
[align=left] counter10.v[/align]
[align=left] --------------------------------------[/align]
[align=left] Keywords: Counter[/align]
[align=left]//-FHDR---------------------------------------------------------*/ [/align]
[align=left] [/align]
[align=left]`timescale 1ns/1ns[/align]
[align=left]`include "counter6.v"[/align]
[align=left]`include "counter10.v"[/align]
[align=left] [/align]
[align=left]module counter60(clk,[/align]
[align=left] reset,[/align]
[align=left] cout,[/align]
[align=left] out);[/align]
[align=left] [/align]
[align=left]input clk;[/align]
[align=left]input reset;[/align]
[align=left]output cout;[/align]
[align=left]output [6:0] out;[/align]
[align=left] [/align]
[align=left]wire cout_6;[/align]
[align=left]wire cout_10;[/align]
[align=left]wire [2:0] out_6;[/align]
[align=left]wire [3:0] out_10;[/align]
[align=left] [/align]
[align=left]counter6 counter6 (.clk(clk),[/align]
[align=left] .reset(reset),[/align]
[align=left] .cout(cout_6),[/align]
[align=left] .out(out_6));[/align]
[align=left]counter10 counter10(.clk(cout_6),[/align]
[align=left] .reset(reset),[/align]
[align=left] .cout(cout),[/align]
[align=left] .out(out_10));[/align]
[align=left] [/align]
[align=left]assign out = {out_6,out_10};[/align]
[align=left] [/align]
[align=left]endmodule[/align]
[align=left] [/align]
[align=left]/*+FHDR--------------------------------------------------------[/align]
[align=left] file name: counter24.v[/align]
[align=left] Author: Clarke.Lee[/align]
[align=left] E-mail: clarke.lee@163.com[/align]
[align=left] --------------------------------------[/align]
[align=left] include: counter6.v[/align]
[align=left] counter4.v[/align]
[align=left] --------------------------------------[/align]
[align=left] Keywords: Counter[/align]
[align=left]//-FHDR---------------------------------------------------------*/ [/align]
[align=left] [/align]
[align=left]`timescale 1ns/1ns[/align]
[align=left]`include "counter6.v"[/align]
[align=left]`include "counter4.v"[/align]
[align=left] [/align]
[align=left]module counter24(clk,[/align]
[align=left] reset,[/align]
[align=left] cout,[/align]
[align=left] out);[/align]
[align=left] [/align]
[align=left]input clk;[/align]
[align=left]input reset;[/align]
[align=left]output cout;[/align]
[align=left]output [4:0] out;[/align]
[align=left] [/align]
[align=left]wire cout_6;[/align]
[align=left]wire cout_4;[/align]
[align=left]wire [2:0] out_6;[/align]
[align=left]wire [1:0] out_4;[/align]
[align=left] [/align]
[align=left]counter6 counter6 (.clk(clk),[/align]
[align=left] .reset(reset),[/align]
[align=left] .cout(cout_6),[/align]
[align=left] .out(out_6));[/align]
[align=left]counter10 counter4v(.clk(cout_6),[/align]
[align=left] .reset(reset),[/align]
[align=left] .cout(cout),[/align]
[align=left] .out(out_4));[/align]
[align=left] [/align]
[align=left]assign out = {out_6,out_4};[/align]
[align=left] [/align]
[align=left]endmodule[/align]
[align=left] [/align]
[align=left]/*+FHDR--------------------------------------------------------[/align]
[align=left] file name: counter6.v[/align]
[align=left] Author: Clarke.Lee[/align]
[align=left] E-mail: clarke.lee@163.com[/align]
[align=left] --------------------------------------[/align]
[align=left] Keywords: Counter[/align]
[align=left]//-FHDR---------------------------------------------------------*/ [/align]
[align=left] [/align]
[align=left]`timescale 1ns/1ns[/align]
[align=left] [/align]
[align=left]module counter6(clk,[/align]
[align=left] reset,[/align]
[align=left] cout,[/align]
[align=left] out)[/align]
[align=left] [/align]
[align=left]input clk;[/align]
[align=left]input reset;[/align]
[align=left]output cout;[/align]
[align=left]output [2:0] out;[/align]
[align=left] [/align]
[align=left]reg cout;[/align]
[align=left]reg [2:0] out; [/align]
[align=left] [/align]
[align=left]reg [2:0] counter;[/align]
[align=left] [/align]
[align=left]always@(posedge clk)[/align]
[align=left] if(!reset)[/align]
[align=left] counter <= 0;[/align]
[align=left] else[/align]
[align=left] for(;counter++;counter<6)[/align]
[align=left] out <= counter;[/align]
[align=left] [/align]
[align=left]endmodule[/align]
[align=left] [/align]
[align=left]/*+FHDR--------------------------------------------------------[/align]
[align=left] file name: counter10.v[/align]
[align=left] Author: Clarke.Lee[/align]
[align=left] E-mail: clarke.lee@163.com[/align]
[align=left] --------------------------------------[/align]
[align=left] Keywords: Counter[/align]
[align=left]//-FHDR---------------------------------------------------------*/ [/align]
[align=left] [/align]
[align=left]`timescale 1ns/1ns[/align]
[align=left] [/align]
[align=left]module counter6(clk,[/align]
[align=left] reset,[/align]
[align=left] cout,[/align]
[align=left] out)[/align]
[align=left] [/align]
[align=left]input clk;[/align]
[align=left]input reset;[/align]
[align=left]output cout;[/align]
[align=left]output [3:0] out;[/align]
[align=left] [/align]
[align=left]reg cout;[/align]
[align=left]reg [3:0] out;[/align]
[align=left] [/align]
[align=left]reg [3:0] counter;[/align]
[align=left] [/align]
[align=left]always@(posedge clk)[/align]
[align=left] if(!reset)[/align]
[align=left] counter <= 0;[/align]
[align=left] else[/align]
[align=left] for(;counter++;counter<10)[/align]
[align=left] out <= counter;[/align]
[align=left] [/align]
[align=left]endmodule[/align]
[align=left] [/align]
[align=left]/*+FHDR--------------------------------------------------------[/align]
[align=left] file name: counter4.v[/align]
[align=left] Author: Clarke.Lee[/align]
[align=left] E-mail: clarke.lee@163.com[/align]
[align=left] --------------------------------------[/align]
[align=left] Keywords: Counter[/align]
[align=left]//-FHDR---------------------------------------------------------*/ [/align]
[align=left] [/align]
[align=left]`timescale 1ns/1ns[/align]
[align=left] [/align]
[align=left]module counter4(clk,[/align]
[align=left] reset,[/align]
[align=left] cout,[/align]
[align=left] out)[/align]
[align=left] [/align]
[align=left]input clk;[/align]
[align=left]input reset;[/align]
[align=left]output cout;[/align]
[align=left]output [1:0] out;[/align]
[align=left] [/align]
[align=left]reg cout;[/align]
[align=left]reg [1:0] out;[/align]
[align=left] [/align]
[align=left]reg [1:0] counter;[/align]
[align=left] [/align]
[align=left]always@(posedge clk)[/align]
[align=left] if(!reset)[/align]
[align=left] counter <= 0;[/align]
[align=left] else[/align]
[align=left] for(;counter++;counter<4)[/align]
[align=left] out <= counter;[/align]
[align=left] [/align]
[align=left]endmodule[/align]
[align=left] [/align]
[align=left]编译结果:[/align]
[align=left]==ècounter6.v/counter4.v/counter10.v:[/align]
[align=left]1. 红色部分[N:0]掉了,编译通过了,功能仿真时报Pin不匹配;coding style;[/align]
[align=left]2. 红色always块中的for语句错误,后改成:[/align]
[align=left]always@(posedge clk)[/align]
[align=left]if(!reset)[/align]
[align=left] out <= 0;[/align]
[align=left]else[/align]
[align=left] for(counter=1;counter<n;counter=counter+1)[/align]
[align=left] out <= counter;[/align]
[align=left]==èclock.v:[/align]
[align=left]1. 上面的红色部分出错,编译错误说明是if的判断语句必须为一个确定的值,由于Fm_key和Fh_key并没有初始化,故此处错误。后单独写了一个选择器代替。[/align]
[align=left]2. 褐色部分好像不要也是可以的。但要着也不会出错。[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: