课 程 设 计 任 务 书
课程名称 | EDA与数字系统课程设计 |
学生姓名 | |
学 号 | |
专业班级 | |
指导教师 |
用VHDL实现数字时钟的设计
胡升
摘要:以一款数字钟设计为例,较详细的介绍了如何用VHDL语言设计数字电路,并给出了部分程序、仿真
波形图,并在MAX+pluslI中进行编译、仿真、下载。由此说明利用VHDL开发数字电路的优点。
关键词:VHDL;设计;数字钟;应用电路
0 引言
VHDL硬件描述语言在电子设计自动化(EDA)中扮演
着重要的角色,它的出现极大的改变了传统的设计方法、设
计过程乃至设计观念。由于采用了“自顶向下”(Top一13own)
的全新设计方法,使设计师们摆脱了大量的辅助设计工作,
而把精力集中于创造性的方案与概念构思上,用新的思路来
发掘硬件设备的潜力,从而极大地提高了设计效率,缩短了
产品的研制周期。
这种设计方法首先从系统设计人手,在顶层进行功能方
框图的划分和结构设计。在方框图一级进行仿真、纠错,并
用硬件描述语言对高层次的系统行为进行描述,在系统一级
进行验证。然后用综合优化工具生成具体门电路的网表,其
对应的物理实现级可以是印刷电路板或专用集成电路。由
于设计的主要仿真和调试过程是在高层次上完成的,这不仅
有利于早期发现结构设计上的错误,避免设计工作的浪费,而
且也减少了逻辑功能仿真的工作量,提高了设计的一次成功率。
1 用vHDL设计一款数字钟
我们设计的数字时钟原理框图如图1。其基本功能划
分为:计数模块(包括秒、分、时)、译码模块、扫描显示控制模
块。计数模块由两个60进制计数器和一个12进制计数器组
成,分别对秒、分、小时进行计数,当计数到23点59分59秒
的时候,即一天结束,计数器清零,新的一天重新开始计数。
⋯ ‘ - - 一一 ’ - - 一一一一一一 ‘ - 一’ ^
图1 数字时钟原理框图
秒计数器的计数时钟信号为1Hz的标准信号,可以由系
统板上提供的4MHz信号通过2 分频得到。秒计数器的进
位输出信号作为分钟计数器的计数信号,分钟计数器的进位
输出信号又作为小时计数器的计数信号。设计一个同时显示时、分、秒6个数字的数字钟,则需要6个七段显示器。若
同时点亮这6个七段显示器,则电路中会产生一个比较大的
电流,很容易造成电路烧坏,我们通过扫描电路来解决这一
问题,通过产生一个扫描信号CS(0)一CS(5)来控制6个七
段显示器,依次点亮6个七段显示器,也就是每次只点亮一
个七段显示器。只要扫描信号cs(0)一cs(5)的频率超过人
的眼睛视觉暂留频率24Hz以上,就可以达到尽管每次点亮
单个七段显示器,却能具有6个同时显示的视觉效果,而且
显示也不致闪烁抖动。
其中6位扫描信号一方面控制七段显示器依次点亮,一
方面控制6选1选择器输出相应显示数字。
2 模块设计
2.1 VHDL语言的基本结构
一个的设计实体通常包括:实体(ENTITY)、结构
体(ARcHITECrURE)、配置(CONFIGI瓜AT10N)、包集合
(PAcKGE)、和库(LIB1 )5个部分。其中实体用于描述
所设计的系统的外部接口信号;构造体用于描述系统内部的
结构和行为;建立输入和输出之间的关系;配置语句安装具
体元件到实体一结构体对,可以被看作是设计的零件清单;
包集合存放各个设计模块共享的数据类型、常数和子程序
等;库是专门存放预编译程序包的地方
2.2.1 计数模块(建立VHDL语言的工程文件)
计数模块由两个60进制计数器和一个24进制计数器
组成,分别对秒、分、小时进行计数。其VHDL源程序相差
不大由于篇幅有限,这里我们以秒模块的实现为例。程序如
下:十二进制计数器
module jsq12(qh,ql,clk,reset);
output[3:0]qh;
output[3:0]ql;
reg[3:0]qh;
reg[3:0]ql;
input clk,reset;
always@(posedge clk or negedge reset)
begin
if(~reset){qh,ql}<=1;
else begin
if({qh,ql}==8'h12){qh,ql}<=1;
else begin
if(ql==9)begin ql<=0;qh<=qh+1;end
else
ql<=ql+1;
end
end
end
endmodule
六十进制计数器
module jsq60(qh,ql,jw,clk,reset);
output[3:0]qh;
output[3:0]ql;
output jw;
input clk,reset;
reg[3:0]qh;
reg[3:0]ql;
reg jw;
always@(posedge clk or negedge reset)
begin
if(~reset){qh,ql,jw}<=0;
else begin
if({qh,ql}==8'h59) begin{qh,ql}<=0;jw<=1;end
else begin
if(ql==9)begin ql<=0;qh<=qh+1;jw<=0;end
else
ql<=ql+1;jw<=0;
end
end
end
endmodule
数码显示模块
module sel(in1,in2,in3,in4,in5,in6,in7,in8,clk,ms1,ms2,
ms3,ms4,ms5,ms6,ms7,ms8,a,b,c,d,e,f,g);
input clk;
input [3:0] in1,in2,in3,in4,in5,in6,in7,in8;
output ms1,ms2,ms3,ms4,ms5,ms6,ms7,ms8,a,b,c,d,e,f,g;
reg ms1,ms2,ms3,ms4,ms5,ms6,ms7,ms8,a,b,c,d,e,f,g;
reg [3:0] temp,flag;
always@(posedge clk)
begin
{ms1,ms2,ms3,ms4,ms5,ms6,ms7,ms8}=8'b00000000;
flag=flag+1;
case (flag)
0:begin temp=in1;ms1=1;end
1:begin temp=in2;ms2=1;end
2:begin temp=in3;ms3=1;end
3:begin temp=in4;ms4=1;end
4:begin temp=in5;ms5=1;end
5:begin temp=in6;ms6=1;end
6:begin temp=in7;ms7=1;end
7:begin temp=in8;ms8=1;end
endcase
case(temp)
4'd0:{a,b,c,d,e,f,g}=7'b1111110;
4'd1:{a,b,c,d,e,f,g}=7'b0110000;
4'd2:{a,b,c,d,e,f,g}=7'b1101101;
4'd3:{a,b,c,d,e,f,g}=7'b1111001;
4'd4:{a,b,c,d,e,f,g}=7'b0110011;
4'd5:{a,b,c,d,e,f,g}=7'b1011011;
4'd6:{a,b,c,d,e,f,g}=7'b1011111;
4'd7:{a,b,c,d,e,f,g}=7'b1110000;
4'd8:{a,b,c,d,e,f,g}=7'b1111111;
4'd9:{a,b,c,d,e,f,g}=7'b1111011;
4'hA:{a,b,c,d,e,f,g}=7'b1110111;
4'hB:{a,b,c,d,e,f,g}=7'b0011111;
4'hC:{a,b,c,d,e,f,g}=7'b1001110;
4'hD:{a,b,c,d,e,f,g}=7'b0111101;
4'hE:{a,b,c,d,e,f,g}=7'b1001111;
4'hF:{a,b,c,d,e,f,g}=7'b1000111;
default:{a,b,c,d,e,f,g}=7'b1111110;
endcase
end
endmodule
3 各模块的编译、仿真
各模块设计完成后,就要对其进行功能仿真。打开
MAX+plusII,选择菜单File/New命令,进入出现对话框选
择中选择“Text Editor File”选项,即进入文本编辑方式新建
一个工程。在编译之前要此工程设置为当前工程。若没有
错误则编译通过。新建仿真文件,输入保存。
4 综合
在编译各模块的同时,生成符号文件,把各符号文件按照
逻辑功能连接起来(如图4),当然也可以利用元件例化语句进
行,然后加上输入输出端口构成顶层系统然后在进行编译。
程序下载至芯片
1)点击主菜单Assign/Pin/Location/Chip进行芯片脚位
设置。2)将实体定义的端口名字和下载芯片的管脚进行具
体对应。3)最后再进行一次编译,这时系统将产生可以向
EPFIOKIO下载的文件。4)将带芯片的实验板通过下载电
缆与计算机并口相连,然后给实验板通电。5)打开下载窗
口选择下载方式、下载器件型号最后点击Configure按钮将
程序写入芯片中。连接外围器件即可工作。
6 结束语
本文通过数字钟实现的例子展现出了现代电子设计新
方法一EDA技术的灵活性,层次化设计方式的优点。VHDL
语言具有很强的电路描述和建模能力,能从多个层次对数字
系统进行建模和描述,从而大大简化了硬件设计任务,提高
了设计效率和可靠性。用VHDL语言实现电路
参考文献
EDA数字系统设计。机械工业出版社(李国立 朱维勇 李铭)