-
FPGA 数字时钟
2018-04-26 10:54:05基于verilog的FPGA数字时钟,如果安装了ISE可以直接打开.xise文件下载到FPGA板上,否则可以找文件夹中的.v文件使用 -
FPGA数字时钟
2014-08-10 23:37:35FPGA 数字时钟VERILOGHDL程序设计实例,包括测试时序,初学者可很好的翻照学习。 -
FPGA数字时钟计数器
2018-11-08 17:58:47FPGA数字时钟计数器 好久没有登博客了,周末出去浪了一转!!! 今天给大家讲一下数字时钟计数器,上个月写的。只是简单的数字时钟计数,没有设置闹钟、设置时间和秒表的功能,下次我会发一个带有功能的数字时钟,...FPGA数字时钟计数器
好久没有登博客了,周末出去浪了一转!!!
今天给大家讲一下数字时钟计数器,上个月写的。只是简单的数字时钟计数,没有设置闹钟、设置时间和秒表的功能,下次我会发一个带有功能的数字时钟,今天只是简单的数字时钟计数器。
由于我的板子只有4位数码管,因此该数字时钟我将用两位数码管进行分钟显示,两位数码管进行时钟显示,用一个LED灯进行秒钟闪烁。
(1)分频
数字时钟计数器,最重要的是分频系数。数字时钟所要进行的计数有秒钟计数、分钟计数、和时钟计数。
①
我所使用的板子内部时钟是50Mhz,首先要进行秒钟分频,由于要利用LED灯闪烁一次(高电平、低电平交替一次)代表1s,因此秒钟输出Ts=0.5s为一个周期,fs=1/Ts = 2Hz,分频系数为n_s=50Mhz/2hz-1=24999999;
②
接下来是时钟分频,时钟分频由秒钟输出时钟来计算,当秒钟上升沿到30次时,分钟时钟翻转一次,到59次时,再翻转一次,实现分钟计数(分钟时钟高电平、低电平交替一次为1分钟);
③
接下来是时钟分频,时钟分频原理类似于由秒钟时钟分频分钟时钟。(2)有了秒钟时钟、分钟时钟、小时时钟,可以在各自的always块中设置对应数码管显示的参数,秒钟到分钟数字进制为60进制,分钟到时钟数字进制为60进制,时钟到天的数字进制为24进制,由于个位、十位在数码管上分开显示,我使用个位、十位分别计数(hg,hs,sg,ss)。
(3)然后我们还需要一个数码管动态显示的时钟,分频系数我设置为499,这个时钟大家可以根据人眼暂停原理自己设置满足该定理的分频系数即可。
(4)最后就是我们的动态显示,利用case语句和设置i变量循环实现动态显示。
代码如下:// // Company: // Engineer: Grace // // Create Date: 19:59:03 10/17/2018 // Design Name: // Module Name: D_CLOCK // Project Name: D_clock // Target Devices: // Tool versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // // module D_CLOCK( input clk, //系统时钟输入 output reg [3:0] wei, //数码管位选 output reg [6:0] data_out, //数码管段选 output reg clk_s //秒钟输出 ); parameter n_s=24999999; //秒钟分频系数 parameter n_m=59; //分钟计数系数 parameter n_h=23; //时钟计数系数 parameter n_kj=499; //数码管显示时钟系数 reg clk_m; //分钟时钟 reg clk_h; //时钟时钟 reg [24:0] counts ; //秒钟计数器 reg [5:0] countm ; //分钟计数器 reg [4:0] counth ; //时钟计数器 reg [5:0] count_s; //秒钟计数器2,当此计数器为59时,分钟计数器+1 reg [5:0] count_m; //分钟计数器2,当此计数器为59时,时钟计数器+1 reg [3:0] hg; //时钟个位(用于显示) reg [3:0] hs; //时钟十位(用于显示) reg [3:0] mg; //分钟个位(用于显示) reg [3:0] ms; //分钟十位(用于显示) reg [8:0] count_kj; //数码管显示计数 reg clk_kj; //数码管显示时钟 integer i = 0; initial //初始化个计数器 begin counts = 25'b0; counth = 5'b0; countm = 6'b0; count_s = 6'b0; count_m = 6'b0; clk_h = 1'b1; clk_m = 1'b1; hg = 4'b0; hs = 4'b0; ms = 4'b0; mg = 4'b0; end /********************************************************************************** 数码管显示时钟分频 ***********************************************************************************/ always @(posedge clk) begin if (count_kj == n_kj) begin clk_kj <= ~clk_kj; count_kj <= 9'b0; end else count_kj <= count_kj + 1'b1; end /*********************************************************************************** 秒钟分频 ***********************************************************************************/ always @(posedge clk) begin if (counts == n_s) //当秒钟计数到达时 begin clk_s <= ~clk_s; //秒钟电平翻转,秒钟灯暗(亮) counts <=25'b0; //秒钟计数器清零,用于重新计数 end else //若秒钟计数未达到翻转值 counts <= counts + 1'b1; //秒钟计数+1 end /************************************************************************************ 分钟分频 ************************************************************************************/ always @(posedge clk_s) begin count_s <= count_s + 1'b1; if(count_s == 5'd30) begin count_s <= 6'b0; clk_m <= ~clk_m; end else if(count_s == 6'd59) begin count_s <= 6'b0; clk_m <= ~clk_m; end else count_s <= count_s +1'b1; end end /************************************************************************************* 分钟计数显示 *************************************************************************************/ always @(posedge clk_m) begin countm <= countm +1'b1; if(count_m == n_m) begin countm <= 6'b0; mg <= 6'b0; ms <= 6'b0; end else begin mg <= mg +1'b1; if(mg == 4'd9) begin mg <= 4'd0; ms <= ms +1'b1; end end end /**************************************************************************************** 时钟计数分频 ****************************************************************************************/ always @(posedge clk_m) begin count_m <= count_m + 1'b1; if(count_m == 5'd30) begin count_m <= 6'b0; clk_h <= ~clk_h; end else if(count_m == 6'd59) begin count_m <= 6'b0; clk_h <= ~clk_h; end else count_m <= count_m +1'b1; end /**************************************************************************************** 时钟计数显示 ****************************************************************************************/ always @(posedge clk_h) begin counth <= counth +1'b1; if(counth == n_h) begin counth <= 6'b0; hg <= 6'b0; hs <= 6'b0; end begin hg <= hg +1'b1; if(hg == 4'd9) begin hg <= 4'd0; hs <= hs +1'b1; end end end /****************************************************************************************** 数码管显示 *******************************************************************************************/ always @(posedge clk_kj) begin i = i +1; if(i == 1) begin wei <= 4'b1110; case (mg) 4'b0000: data_out <= 7'b1000000; // 0 4'b0001: data_out <= 7'b1111001; // 1 4'b0010: data_out <= 7'b0100100; // 2 4'b0011: data_out <= 7'b0110000; // 3 4'b0100: data_out <= 7'b0011001; // 4 4'b0101: data_out <= 7'b0010010; // 5 4'b0110: data_out <= 7'b0000011; // 6 4'b0111: data_out <= 7'b1111000; // 7 4'b1000: data_out <= 7'b0000000; // 8 4'b1001: data_out <= 7'b0011000; // 9 default: data_out <= 7'b1000000; // 0 endcase end else if(i == 2) begin wei <= 4'b1101; case (ms) 4'b0000: data_out <= 7'b1000000; // 0 4'b0001: data_out <= 7'b1111001; // 1 4'b0010: data_out <= 7'b0100100; // 2 4'b0011: data_out <= 7'b0110000; // 3 4'b0100: data_out <= 7'b0011001; // 4 4'b0101: data_out <= 7'b0010010; // 5 default: data_out <= 7'b1000000; // 0 endcase end if(i == 3) begin wei <= 4'b1011; case (hg) 4'b0000: data_out <= 7'b1000000; // 0 4'b0001: data_out <= 7'b1111001; // 1 4'b0010: data_out <= 7'b0100100; // 2 4'b0011: data_out <= 7'b0110000; // 3 4'b0100: data_out <= 7'b0011001; // 4 4'b0101: data_out <= 7'b0010010; // 5 4'b0110: data_out <= 7'b0000011; // 6 4'b0111: data_out <= 7'b1111000; // 7 4'b1000: data_out <= 7'b0000000; // 8 4'b1001: data_out <= 7'b0011000; // 9 default: data_out <= 7'b1000000; // 0 endcase end else if(i == 4) begin wei <= 4'b0111; case (hs) 4'b0000: data_out <= 7'b1000000; // 0 4'b0001: data_out <= 7'b1111001; // 1 4'b0010: data_out <= 7'b0100100; // 2 default: data_out <= 7'b1000000; // 0 endcase i = 0; end end endmodule
-
基于FPGA数字时钟的设计(附源码)
2020-04-21 10:09:16今天给大侠带来基于FPGA数字时钟的设计,附源码,获取源码,请在“FPGA技术江湖”公众号内回复“基于FPGA数字时钟的设计源码”,可获取源码文件。话不多说,上货。 本次的设计的数字钟思路描述如下,使用3个key按键...大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注“FPGA技术江湖”微信公众号,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。
今天给大侠带来基于FPGA数字时钟的设计,附源码,获取源码,请在“FPGA技术江湖”公众号内回复“基于FPGA数字时钟的设计源码”,可获取源码文件。话不多说,上货。
本次的设计的数字钟思路描述如下,使用3个key按键,上电后,需要先配置数字时钟的时分秒,设计一个按键来控制数字时钟的时,第二个按键来控制数字时钟的分,本次设计没有用按键控制数字时钟的秒,原理一样,大家可以自己做拓展设计再使用一个按键控制数字时钟的,然后用第三个按键来控制数字时钟的运行。采取"Top to down"设计思想,分模块设计,由于本次设计比较简单,这里就没有设计总设计框架图,上面也大致描述了设计思路,给大家截取RTL级视图提供参考,具体设计如下:
附设计代码:(源码文件可从公众号内部获取)
总模块:
按键模块:
消抖模块:
数码管模块:
控制模块:
大侠们,江湖偌大,继续闯荡,愿一切安好,有缘再见!
-
FPGA数字时钟计数器 Verilog实现
2018-11-08 18:07:25FPGA基于Verilog语言的普通数字时钟计数器代码 -
FPGA数字时钟(含闹钟)
2019-12-11 19:40:086位数字时钟,verilog实现,方便移植,含闹钟设置,代码中闹钟部分以led闪烁表示,可修改,欢迎提问 -
FPGA数字时钟代码与原理
2013-12-22 01:10:39基于FPGA的数字时钟代码与原理,每一步的开发过程与原理都有。在数码管实时显示时钟。 -
FPGA数字时钟全部代码、包括引脚映射等全部
2010-04-28 11:52:36FPGA数字时钟全部代码、包括引脚映射等全部,支持EP2C8芯片。 -
FPGA数字时钟系统-设计教程
2019-07-29 23:06:20数字钟是一个常用的数字系统,其主要功能是计时和显示时间。这里通过一个数字钟表的模块化设计方法,说明自顶向下的模块化设计方法和实现一个项目的设计步骤。这里实现的电子表具有显...博主福利:100G+电子设计学习资源包!
http://mp.weixin.qq.com/mp/homepage?__biz=MzU3OTczMzk5Mg==&hid=7&sn=ad5d5d0f15df84f4a92ebf72f88d4ee8&scene=18#wechat_redirect
--------------------------------------------------------------------------------------------------------------------------数字钟是一个常用的数字系统,其主要功能是计时和显示时间。这里通过一个数字钟表的模块化设计方法,说明自顶向下的模块化设计方法和实现一个项目的设计步骤。
这里实现的电子表具有显示和调时的基本功能,可以显示时、分、秒和毫秒,并通过按键进行工作模式选择,工作模式有4种,分别是正常计时模式、调时模式、调分模式、调秒模式。
构成电子表的基本基本模块有四个,分别是时钟调校及计时模块myclock、整数分频模块int_div、时钟信号选择模块clkgen和七段显示模块disp_dec。
1、时钟调校及计时模块
时钟调校及计时模块myclock实现的功能是根据当前的工作状态进行时、分、秒的调整或正常的计时。代码端口说明如下:
输入信号:
RSTn—复位信号;
CLK—100Hz时钟信号;
FLAG[1:0]—工作模式控制信号,模式定义为:00表示正常显示,01表示调时,10表示调分,11表示调秒;
UP—调校模式时以加1方式调节信号;
DN—调校模式时以减1方式调节信号。
输出信号:
H[7:0]—“时”数据(十六进制);
M[7:0]—“分”数据(十六进制);
S[7:0]——“秒”数据(十六进制);
MS[7:0]—“百分秒”数据(十六进制)。
该模块的设计思路是,当复位信号RSTn有效时,时、分、秒信号清零,否则工作模式控制信号FLAG的值决定当前的工作状态。
当FLAG=2’b00时,电子表工作在正常计时状态,对输入的100Hz的时钟信号clk进行计数,修改当前的百分秒(MS)、秒(S)、分(M)和时(H)的计数值;
当FLAG信号=2’b01时,电子表工作在“时”校正状态,若此时UP信号有效则H加1,若此时DN信号有效则H减1,;
当FLAG信号=1’b10时,电子表工作在“分” 校正状态,若此时UP信号有效则M加1,若此时DN信号有效则M减1;
当FLAG=2’b11时,电子表工作在“秒”校正状态,其UP和DN的控制过程与“时”、“分”类似。
module myclock(RSTn,CLK,FLAG,UP,DN,H,M,S,MS); inputRSTn,CLK,UP,DN; output[7:0] H,M,S; output[7:0] MS; input[1:0]FLAG; reg[5:0] m_H,m_M,m_S; reg[6:0] m_MS; assignH = m_H; assignM = m_M; assignS = m_S; assignMS = m_MS; always@(posedge CLK) if(~RSTn) begin m_H<= 8'd23; m_M<= 8'd52; m_S<= 8'b0; m_MS<= 8'b0; end else if(FLAG==2'b01)begin//调时状态 if(UP)begin if(m_H==8'd23) m_H <=8'd0; else m_H = m_H + 1'b1; end else if(DN) begin if(m_H==8'h00) m_H <=8'd23; else m_H <= m_H - 1'b1; end end elseif(FLAG==2'b10) begin //调分状态 if(UP) if(m_M==8'd59) m_M <=8'd0; else m_M <= m_M + 1'b1; elseif(DN) if(m_M==8'h00) m_M <=8'd59; else m_M <= m_M - 1'b1; end else if(FLAG==2'b11)begin //调秒状态 if(UP) if(m_S==8'd59) m_S <=8'b0; else m_S <= m_S+ 1'b1; else if(DN) if(m_S==8'h00) m_S <=8'd59; else m_S <= m_S- 1'b1; end else begin //正常计时状态 if(m_MS==8'd99) begin m_MS <=8'd0; if(m_S==8'd59) begin m_S <= 8'd0; if(m_M==8'd59) begin m_M<=8'd0; if(m_H==8'd23) m_H <= 0; else m_H <= m_H+ 1'b1; end else m_M<= m_M + 8'd1; end else m_S<=m_S+1'b1; end else m_MS<=m_MS+1'b1; end endmodule
( 文中代码框,均可横向滑动 )
2、整数分频模块
由于数字系统提供的基准时钟信号频率往往较高,因此需要分频模块产生所需频率的失踪信号,例如上面时钟校正及计时模块所需的100Hz的时钟信号。
整数分频模块int_div可以实现对输入时钟clock进行F_DIV分频后输出clk_out。F_DIV分频系数范围为1~2^n(n=F_DIV_WIDTH),若要改变分频系数,改变参数F_DIV或F_DIV_WIDTH到相应范围即可。
若分频系数为偶数,则输出时钟占空比为50%;若分频系数为奇数,则输出的时钟占空比取决于输入的时钟占空比和分频系数(当输入为50%时,输出也是50%)。
module int_div(clock,clk_out); parameter F_DIV=48000000; //分频系数 parameter F_DIV_WIDTH=32; //分频计数器宽度 input clock; //输入时钟 output clk_out; //输出时钟 reg clk_p_r; reg clk_n_r; reg[F_DIV_WIDTH-1:0] count_p; reg[F_DIV_WIDTH-1:0] count_n; wire full_div_p; //上升沿计数满标志 wire half_div_p; //上升沿计数半满标志 wire full_div_n; //下降沿计数满标志 wire half_div_n; //下降沿计数半满标志 //判断计数标志位置位与否 assign full_div_p=(count_p<F_DIV-1); assign half_div_p=(count_p<(F_DIV>>1)-1); assign full_div_n=(count_n<F_DIV-1); assign half_div_n=(count_n<(F_DIV>>1)-1); //时钟输出 assignclk_out=(F_DIV==1)?clock:(F_DIV[0]?(clk_p_r&clk_n_r):clk_p_r); //上升沿脉冲计数 always @(posedge clock) begin if(full_div_p) begin count_p<=count_p+1'b1; if(half_div_p) clk_p_r<=1'b0; else clk_p_r<=1'b1; end else begin count_p<=0; clk_p_r<=1'b0; end end //下降沿脉冲计数 always @(negedge clock) begin if(full_div_n)begin count_n<=count_n+1'b1; if(half_div_n) clk_n_r<=1'b0; else clk_n_r=1'b1; end else begin count_n<=0; clk_n_r<=1'b0; end end endmodule
3、时钟信号选择模块
时钟信号选择模块clkgen实际上时一个二选一电路,用于提供时钟调校及计时时模块所需的时钟脉冲。
当电子表工作在正常计时状态时选择100Hz时钟信号;当电子表工作在调时、调分、调秒是那种设置模式时,如果采用100Hz时钟信号,那么手动一次按键可能引起设置数据的一串跳变,因此为了方便按键时动作对时间的设置,这里采用2Hz的时钟信号。
其端口说明如下:
flag—时钟选择输入信号;
clk_100Hz—输入100Hz的时钟信号;
clk_2Hz—输入2Hz的时钟信号;
Clkout—输出时钟信号。
module clkgen(flag,clk_100hz,clk_2hz,clkout); input[1:0] flag; //若flag=0则clkout=100Hz,否则clkout=2Hz input clk_100hz,clk_2hz; output clkout; assign clkout=(flag==2'b00)?clk_100hz:clk_2hz; endmodule
4、七段显示设置
为了对时钟时、分、秒和毫秒数据输出显示,需要将时、分、秒和毫秒的二进制转换为十进制数。由于时、分、秒最大到60,毫秒最大到99,所以十进制数选择2位就能满足要求。为了在七段数码管输出时间数据,还需要将显示的十进制数转化为七段段码。以上功能分别由BCD码显示模块和七段译码管模块来实现。
4.1 BCD码显示模块
BCD码显示模块的功能是将8位二进制数转化为2位十进制数后,进行七段段译码显示。为了实现显示功能,在其内部调用了dual_hex 2位七段显示模块。
其端口说明如下:
输入信号:hex—2位8421BCD码输入。
输出信号:dispout—2位8421码对应的七段数码管段码。
module disp_dec(hex,dispout); input[7:0] hex; //八位二进制输入数据 output[15:0] dispout; //2位十进制的七段段码显示数据 reg[7:0] dec; //8位二进制数转化为2位BCD码 always @(hex) begin dec[7:4]=hex/4'd10; dec[3:0]=hex%4'd10; end //调用2位共阳极七段显示模块 dual_hex u1(1'b0,dec,dispout); endmodule
4.2 二位七段显示模块
二位七段显示模块的功能是将2进制或十六进制数转化为对应的七段段码,内部调用了一位七段译码模块seg_decoder。
module dual_hex(iflag,datain,dispout); input iflag; //共阴或共阳输出选择 input[7:0] datain; //2位的十进制或十六进制数据 output[15:0] dispout; //2个七段段码数据 seg_decoderu1(iflag,datain[7:4],dispout[15:8]); seg_decoder u2(iflag,datain[3:0],dispout[7:0]); endmodule
4.3 一位七段译码模块
一位七段译码模块的功能是将4位二进制数转化为对应的共阴或共阳七段段码。
module seg_decoder(iflag,iA,oY); input iflag; //共阴或共阳输出选择 input[3:0] iA; //4位二进制数据 output reg[7:0] oY; //七段段码显示数据 always @(iflag,iA) begin case(iA) //共阴级七段输出 4'b0000:oY=8'h3f; 4'b0001:oY=8'h06; 4'b0010:oY=8'h5b; 4'b0011:oY=8'h4f; 4'b0100:oY=8'h66; 4'b0101:oY=8'h6d; 4'b0110:oY=8'h7d; 4'b0111:oY=8'h27; 4'b1000:oY=8'h7f; 4'b1001:oY=8'h6f; 4'b1010:oY=8'h77; 4'b1011:oY=8'h7c; 4'b1100:oY=8'h58; 4'b1101:oY=8'h5e; 4'b1110:oY=8'h79; 4'b1111:oY=8'h71; endcase if(!iflag) oY=~oY; //共阳极七段输出 end endmodule
5、顶层模块的实现
顶层模块是将各功能模块连接起来,实现电子表的完整功能。其端口信号说明如下:
输入信号:
iCLK—50—50MHz时钟信号;
RSTn—复位信号;
FLAG—工作模式控制信号,模式定义为:00表示正常显示,01表示调时,10表示调分,11调秒;
UP—调校模式时以加1方式调节信号;
DN—调校模式时以减1方式调节信号。
输出信号:
H_dis—“小时”数据的七段数码管数据;
M_dis—“分钟”数据的七段数码管数据;
S_dis—“秒”数据的七段译码管数据;
MS_dis—“百分秒”数据的七段译码管数据;
Mode—工作模式输出;
H—“时”数据(十六进制);
M—“分”数据(十六进制);
S—“秒”数据(十六进制);
MS—“百分秒”数据(十六进制)。
moduleclock(iCLK_50,RSTn,FLAG,UP,DN,H_dis,M_dis,S_dis,MS_dis,Mode,H,M,S); inputiCLK_50; inputRSTn,UP,DN; input[1:0] FLAG; output[1:0] Mode; output[15:0] H_dis,M_dis,S_dis,MS_dis; output[7:0] H,M,S; wire[7:0] MS; wireclk_100hz,clk_2hz; wireclk; assignMode=FLAG; int_div#(500000,32) nclk100(iCLK_50,clk_100hz); int_div#(50000000,32) nclk2(iCLK_50,clk_2hz); clkgenu0(FLAG,clk_100ha,clk_2hz,clk); myclocku1(RSTn,clk,FLAG,UP,DN,H,M,S,MS); disp_decHour(H,H_dis); disp_decMinute(M,M_dis); disp_decSecond(S,S_dis); disp_dechour(MS,MS_dis); endmodule
-
FPGA VHDL 数字时钟
2013-03-16 10:39:06FPGA VHDL 数字时钟 FPGA VHDL 数字时钟 -
FPGA课设数字时钟
2018-07-09 22:25:13本文档包含了FPGA课设数字时钟仿真的完整代码和报告。采用ISE软件,用verilog语言写成,可成功仿真出波形。(附有每个模块的测试代码) -
基于FPGA的数字时钟
2015-08-06 20:31:01基于FPGA的数字时钟,采用状态机的程序 -
基于FPGA的数字时钟实现
2021-03-06 16:25:18基于FPGA的数字时钟实现:有校时、闹钟响铃等功能。用开发板具体功能可实现。开发板型号ALINX -
基于FPGA 的数字时钟
2012-03-02 15:54:07基于fpga的数字时钟,采用VHDL语言编写,可校时、校分,整点报时。 -
数字时钟设计verilog_基于FPGA的数字时钟
2020-11-19 18:50:40一、FPGA的基本知识1、可编程逻辑器件的概况可编程逻辑器件主要分为FPGA和CPLD两种,两者的功能基本相同 。 FPGA--现场可编程门阵列的简称CPLD--复杂可编程逻辑器件的简称2、FPGA芯片及其最小系统(1)FPGA芯片它的外形...一、FPGA的基本知识
1、可编程逻辑器件的概况可编程逻辑器件主要分为FPGA和CPLD两种,两者的功能基本相同 。
FPGA--现场可编程门阵列的简称
CPLD--复杂可编程逻辑器件的简称
2、FPGA芯片及其最小系统
(1)FPGA芯片
它的外形与普通嵌入式处理器芯片相同采用PGA(Organic pin grid Array,有机管脚阵列)的封装形式,但可以通过烧写特殊程序改变其内部结构,实现专门的电路功能。
(2)FPGA最小系统
FPGA的最小系统主要由以下四大部分组成:
1)FPGA芯片
2)下载电路
3)外部时钟电路
4)电源与复位电路
基本组成框图如下:
二、FPGA的设计方法
1、编程语言
FPGA的主流程序设计语言主要有VHDL语言与Verilog语言两种。本课题采用VHDL语言进行编写。
VHDL--用简洁明确的源代码来描述复杂的逻辑控制。它具有多层次的设计描述功能,层层细化,最后可直接生成电路级描述。
Verilog--一种基本语法与C语言相近,相比较于C语言更容易理解,
2、图形化程序设计(设计效率低)
三、软件开发环境
QuartusII是Altera提供的FPGA开发集成环境,它提供了一种与结构无关的设计环境,使设计者能方便地进行设计输入、快速处理和器件编程。它完全支持VHDL设计流程,其内部嵌有VHDL逻辑综合器。
QuartusII编译主界面
四、数字钟功能模块认识
数字时钟的设计采用了自顶向下分模块的设计。底层是实现各功能的模块,各模块由VHDL语言编程实现顶层采用原理图形式调用。具体的设计框图:
各模块原理剖析:
(1)在七段数码管上具有时--分--秒的依次显示;
(2)时、分、秒的个位记满十向高位进一,分、秒的十位记满五向高位进一,小时按24进制计数,分、秒按60进制计数;
(3)整点报时,当计数到整点时扬声器发出响声;
(4)时间设置:可以通过按键手动调节秒和分的数值。此功能中可通过按键实现整体清零和暂停的功能。
一、数字时钟的设计与仿真
1、模块设计与实现
(1)建立工程
1)建立工程文件,双击桌面上的Quartus II的图标运行此软件。
2)选择File下拉菜单中的New Project Wizard,新建工程,生成项目工程。
Quartus II新建工程向导
3)进入工作目录,进入工程文件的配置选项,依次点击“Next”。
4)第一个输入框为工程目录输入框,用来指定工程存放路径(建议修改存放路径),第二个输入框为工程名称输入框。第三个输入框为顶层实体名称输入框。(确保工程名称与顶层实体名称一致)。
5)设计中需要包含的其它设计文件,在此对话框中不做任何修改,直接点击next。
6)在弹出的对话框中进行器件的选择,根据自己的需要选择器件。
7)出现新建工程所有的信息后,点击finish完成新建工程的建立。
-
基于FPGA的数字时钟设计
2012-11-05 21:04:02基于FPGA的数字时钟设计,verilog HDL语言 -
数字时钟 fpga
2009-12-17 09:55:09数字时钟 fpga 完整电路 多功能 vhdl -
FPGA实现的数字时钟
2018-08-18 10:54:03经过一段时间的学习,自己写的FPGA实现的数字时钟,已经验证过了 -
基于FPGA设计数字时钟(ego1开发板)
2020-12-20 22:04:20基于FPGA设计数字时钟(ego1开发板),使用vivado2018.1开发 -
基于FPGA的全数字时钟生成方法
2021-03-06 10:29:55基于FPGA的全数字时钟生成方法 -
基于fpga的数字时钟实现
2012-02-19 10:12:13用fpga实现的高精度的数字时钟,用verilog编写的,但是有的地方出现了问题,望高手不吝赐教啊 -
基于FPGA的数字时钟数码管显示
2020-08-26 09:31:43这是两年前开始学习FPGA的时候做的实验,已经好久没有接触FPGA了,板卡也积灰不少了,是时候安排时间重新拾起曾经美好的回忆了。下面是曾经的实验笔记。