摘要:随着电子科技的高速发展,传统的电子技术逐渐被电子线路设计自动化所取代,以FPGA/CPLD为硬件,以verilog语言为软件的EDA技术应用越来越广泛,本文旨在以一个具体的数码时钟设计为例,将以硬件描述语言来设计特定芯片的流程呈现给大家。
关键词:verilog;数码时钟;动态扫描;EDA
引言
何谓verilog?Verilog HDL硬件描述语言的应用是业界最为广泛的。Verilog语言可用来设计各种层次的数字电路,还可以进行数字系统的综合,验证仿真调试和时序逻辑分析等。Verilog语言适合各个层次的描述及设计,如算法级,寄存器级,逻辑级,门级和版图级等。Verilog语言进行设计的优点与工艺性无关。硬件工程师设计系统,验证逻辑阶段可较少考虑工艺实现的具体细节,只要根据系统需求加以各种约束条件,就可设计出满足需要的电路[1]。Verilog语言是为了制作各层级的逻辑电路,从而用来描述ASICs和FPGA的设计。Verilog的设计者可以用C编程语言的语法作为基础,使得从业者比较容易掌握。目前专用集成电路(ASIC)的从业人员,都需要掌握verilog语言,在芯片设计领域,有超过90%的公司是用verilog语言进行芯片设计和开发。从业人员使用电脑对verilog仿真和综合,可以高效的设计出数字系统及产品。[2]
1、Verilog时钟设计原理
(1)基本时钟信号的产生电路,首先由晶体振荡器产生的固定频率的脉冲信号,经整形电路、滤波电路后,产生一个频率为 1Hz的稳定的时钟脉冲作为基准时钟信号。
(2)逻辑控制模块电路,能进行小时调节、分钟调节和数码管的位选信号。
时钟调节的产生方式,首先从计数器的计数方式得知,在计数的时候,每当秒计到59时,接着一个脉冲,将秒计数器归零,进入新一轮的时钟计数,将进位位作为分计数器的计数脉冲,将分计数加1。将电路稍作变动:将秒的进位信号和频率2Hz的脉冲信号并接到一个两选一数据选择器的数据输入端口,同时位选信号接到脉冲按键开关,每当按键弹起时,该数据选择器把秒的进位信号送至分计数位,如此,数字钟就正常工作;每当按键按下去的时候,那么数据选择器就把另一个频率为2Hz信号当作分的计数脉冲,将计数频率加快,达到正确时间后,松开开关,来达到调时目的。调节小时的方法同上。[3]
(3)显示电路的构成,主要由计数部分、选择器、译码电路组成,为时钟的核心模块。计数部分是由两个60进制计数器和一个24位进制计数器构成,该60进制计数器可用6进制计数器和10进制计数器组成;24进制的小时计数可用6进制计数器和10进制计数器合成,方法是当计数到24时,将“2”和“4”进行清零,就可实现24进制计数。
1.2 自顶向下设计分割图
2、具体实现步骤
2.1 开发板硬件电路连接
(1) 将EP1C3适配板左下角的JTAG用十芯排线和万用下载区左下角的SOPC JTAG口连接起来,下载区的电源开关拨到 SOPC下载的一边。
(2) 请将JPLED1短路帽右插,JPLED的短路帽全部上插,开发板右下方频率源 CLK1接任意频率作为扫描频率。
(3) 将开发板左端的JP103全部用短路帽接上(共八个)。
2.2 部分核心代码
Module timer(clk5,clk3,rst,seg_sel,seg_da);input clk5;input clk3;input rst;output [2:0] seg_sel;output [7:0] seg_da; cnt10 u1(.clk(clk5),.rst(rst),.cnt_val(seg_buf1),. cout(cout[0]),.cin(1'b1));
cnt6u2(.clk(clk5),.rst(rst),.cnt_val(seg_buf2),.cout(cout[1]),. cin(cout[0])); reg [2:0] sel_cnt;
if (rst)sel_cnt <= 3'h0;else sel_cnt <= sel_cnt + 1'b1;
always @ (sel_cnt or seg_buf1 or seg_buf2 or seg_buf3 or seg_buf4 or seg_buf5 or seg_buf6 or seg_buf7 or seg_buf8) case(sel_cnt)
3'h0: seg_da_temp = seg_buf1;3'h1: seg_da_temp = seg_buf2;
3'h2: seg_da_temp = seg_buf3;3'h3: seg_da_temp = seg_buf4;
always @ (seg_da_temp) case (seg_da_temp) 4'b0000 : seg_da = 8'b00111111; 4'b0001 : seg_da = 8'b00000110;
4b1000 : seg_da = 8'b01111111;
4'b1001 : seg_da = 8'b01101111; 4'b1010 : seg_da = 8'b01110111;
4'b1011 : seg_da = 8'b01111100; 4'b1100 : seg_da = 8'b00111001;
4'b1101 : seg_da = 8'b01011110;
4'b1110 : seg_da = 8'b01111001; 4'b1111 : seg_da = 8'b00000000;
module cnt10(clk,rst,cnt_val,cout,cin);input clk;input rst;
always @ (posedge clk or posedge rst)if (rst)cnt_val <= 4'h0;
else if (cin) begin if (cnt_val >= 5) cnt_val <= 4'h0;
else cnt_val <= cnt_val + 1'b1; end else cnt_val <= cnt_val;
assign cout = (cnt_val == 4'h5) && cin;
endmodule module cnt2(clk,rst,cnt_val,cout,cin);
input clk;input rst;input cin;output [3:0] cnt_val;output cout; reg [3:0] cnt_val;always @ (posedge clk or posedge rst) if (rst)
cnt_val <= 4'h0;else if (cin)begin if (cnt_val >= 2)cnt_val <= 4'h0; elsecnt_val <= cnt_val + 1'b1;endelse cnt_val <= cnt_val;
assign cout = (cnt_val == 4'h2) && cin; endmodule
2.3 芯片引脚分配
管脚标号seg_d0到seg_d 6分别接到LED的8位段码中的7位上,sel0到sel2接到开发板中74ls138的输入端;clk为LED显示时钟输入,接到频率源clk1。clk5为电子时钟的震荡频率,100脚接key0用作系统复位。
3、结论
经过软硬件设计和联调,在对应平台的数码管上,会显示当前的时钟值,格式为11 11 11. 会有两个数码管是熄灭的,作为小时和分钟的间隔,分钟和秒钟的间隔。需要注意的是,时钟频率不要选择太高,可以选择几百赫兹的频率。以上是笔者通过实践得出的一点经验,希望能对读者有所帮助,疏漏之处在所难免,敬请批评指正。
参考文献:
[1] 祁晓磊. 用Verilog HDL进行FPGA设计的原则与方法. 电子测试(期刊).2008(03);
[2]周小仨.EDA技术在数字电子技术实验中的应用.电子制作(期刊). 2014(15);
[3] 王旖旎. 基于时钟漂移率的时钟同步及稳定性分析.北京化工大学(期刊).2008(06);
作者简介:周小仨,硕士,黄冈职业技术学院讲师;研究领域:嵌入式,EDA,单片机技术开发。