Verilog语言fpga小脚丫数字时钟(整点报时,调时,显示秒钟等功能)

这篇具有很好参考价值的文章主要介绍了Verilog语言fpga小脚丫数字时钟(整点报时,调时,显示秒钟等功能)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

学弟加油!                                                                       ———来自科大焯人

最近刚好学习了数电有关知识,就做了这个项目(闹钟过于繁琐就没有做了)

希望给还在学习的大伙一点参考,完整代码在最后

在这里先附上两串代码分别是debounce(按键消抖)和divide(分频)

这两个在小脚丫的示例中都可以找到,但我还是先附在这

//按键消抖
module debounce (clk,rst,key,key_pulse);
 
        parameter       N  =  1;                      //要消除的按键的数量
 
	input             clk;
    input             rst;
    input 	[N-1:0]   key;                        //输入的按键					
	output  [N-1:0]   key_pulse;                  //按键动作产生的脉冲	
 
        reg     [N-1:0]   key_rst_pre;                //定义一个寄存器型变量存储上一个触发时的按键值
        reg     [N-1:0]   key_rst;                    //定义一个寄存器变量储存储当前时刻触发的按键值
 
        wire    [N-1:0]   key_edge;                   //检测到按键由高到低变化是产生一个高脉冲
 
        //利用非阻塞赋值特点,将两个时钟触发时按键状态存储在两个寄存器变量中
        always @(posedge clk  or  negedge rst)
          begin
             if (!rst) begin
                 key_rst <= {N{1'b1}};                //初始化时给key_rst赋值全为1,{}中表示N个1
                 key_rst_pre <= {N{1'b1}};
             end
             else begin
                 key_rst <= key;                     //第一个时钟上升沿触发之后key的值赋给key_rst,同时key_rst的值赋给key_rst_pre
                 key_rst_pre <= key_rst;             //非阻塞赋值。相当于经过两个时钟触发,key_rst存储的是当前时刻key的值,key_rst_pre存储的是前一个时钟的key的值
             end    
           end
 
        assign  key_edge = key_rst_pre & (~key_rst);//脉冲边沿检测。当key检测到下降沿时,key_edge产生一个时钟周期的高电平
 
        reg	[17:0]	  cnt;                       //产生延时所用的计数器,系统时钟12MHz,要延时20ms左右时间,至少需要18位计数器     
 
        //产生20ms延时,当检测到key_edge有效是计数器清零开始计数
        always @(posedge clk or negedge rst)
           begin
             if(!rst)
                cnt <= 18'h0;
             else if(key_edge)
                cnt <= 18'h0;
             else
                cnt <= cnt + 1'h1;
             end  
 
        reg     [N-1:0]   key_sec_pre;                //延时后检测电平寄存器变量
        reg     [N-1:0]   key_sec;                    
 
 
        //延时后检测key,如果按键状态变低产生一个时钟的高脉冲。如果按键状态是高的话说明按键无效
        always @(posedge clk  or  negedge rst)
          begin
             if (!rst) 
                 key_sec <= {N{1'b1}};                
             else if (cnt==18'h3ffff)
                 key_sec <= key;  
          end
       always @(posedge clk  or  negedge rst)
          begin
             if (!rst)
                 key_sec_pre <= {N{1'b1}};
             else                   
                 key_sec_pre <= key_sec;             
         end      
       assign  key_pulse = key_sec_pre & (~key_sec);     
 
endmodule
//分频
module divide (	clk,rst_n,clkout);
 
        input 	clk,rst_n;                       //输入信号,其中clk连接到FPGA的C1脚,频率为12MHz
        output	clkout;                          //输出信号,可以连接到LED观察分频的时钟
 
        //parameter是verilog里常数语句
	parameter	WIDTH	= 24;             //计数器的位数,计数的最大值为 2**WIDTH-1
	parameter	N	= 12_000_000;             //分频系数,请确保 N < 2**WIDTH-1,否则计数会溢出
 
	reg 	[WIDTH-1:0]	cnt_p,cnt_n;     //cnt_p为上升沿触发时的计数器,cnt_n为下降沿触发时的计数器
	reg			clk_p,clk_n;     //clk_p为上升沿触发时分频时钟,clk_n为下降沿触发时分频时钟
 
	//上升沿触发时计数器的控制
	always @ (posedge clk or negedge rst_n )         //posedge和negedge是verilog表示信号上升沿和下降沿
                                                         //当clk上升沿来临或者rst_n变低的时候执行一次always里的语句
		begin
			if(!rst_n)
				cnt_p<=0;
			else if (cnt_p==(N-1))
				cnt_p<=0;
			else cnt_p<=cnt_p+1;             //计数器一直计数,当计数到N-1的时候清零,这是一个模N的计数器
		end
 
         //上升沿触发的分频时钟输出,如果N为奇数得到的时钟占空比不是50%;如果N为偶数得到的时钟占空比为50%
         always @ (posedge clk or negedge rst_n)
		begin
			if(!rst_n)
				clk_p<=0;
			else if (cnt_p<(N>>1))          //N>>1表示右移一位,相当于除以2去掉余数
				clk_p<=0;
			else 
				clk_p<=1;               //得到的分频时钟正周期比负周期多一个clk时钟
		end
 
        //下降沿触发时计数器的控制        	
	always @ (negedge clk or negedge rst_n)
		begin
			if(!rst_n)
				cnt_n<=0;
			else if (cnt_n==(N-1))
				cnt_n<=0;
			else cnt_n<=cnt_n+1;
		end
 
        //下降沿触发的分频时钟输出,和clk_p相差半个时钟
	always @ (negedge clk)
		begin
			if(!rst_n)
				clk_n<=0;
			else if (cnt_n<(N>>1))  
				clk_n<=0;
			else 
				clk_n<=1;                //得到的分频时钟正周期比负周期多一个clk时钟
		end
 
        assign clkout = (N==1)?clk:(N[0])?(clk_p&clk_n):clk_p;      //条件判断表达式
                                                                    //当N=1时,直接输出clk
                                                                    //当N为偶数也就是N的最低位为0,N(0)=0,输出clk_p
                                                                    //当N为奇数也就是N最低位为1,N(0)=1,输出clk_p&clk_n。正周期多所以是相与
endmodule 

将上述两个代码文件准备好就可以开始编写我们的主体程序了。

既然是数字时钟,首先我们应当通过分频器产生1s中的信号,代码中的clk1h是我用分频器产生的1Hz信号。每经过1Hz的上升沿秒钟进一位,在秒钟个位为9且十位不为5时,下一次进位个位要变为0,十位要加1,若是59秒时则应当都置零。同时,分钟的计时和时钟的计时实现思路与秒钟计时类似,但需要额外进行判断,比如说分钟进位要在秒钟均为0时才产生进位,时钟进位要在分钟秒钟全为0时才进位。

时钟和分钟的敏感信号为clk,这是小脚丫自带的时钟信号12MHz。由于clk频率极高,在1s中内能够触发分钟和时钟计时模块多次,为实现分钟和时钟在进位时仅进位一次,我额外增加了两个判断位,分别为pan(分钟)和pan1(时钟)。在pan和pan1为0时才能分别触发分钟和时钟进位,并且触发一次进位后pan或pan1置1,直到秒钟或者分钟不全为0时pan或pan1才会重新置0。

具体代码如下

//60秒计时控制
	always @ (posedge clk1h ) begin
        if(cnt_shi==5 && cnt_ge==9) begin
			cnt_shi <= 0;
			cnt_ge <= 0;
			end
		else if(cnt_shi==0 && cnt_ge==0) begin
			cnt_shi <= 0;
			cnt_ge <= 1;
			end
		else if(cnt_ge==9)begin
			cnt_ge <= 0;
			cnt_shi <= cnt_shi+1;
			end
		else
			cnt_ge <= cnt_ge +1;
		end
//60分计时控制
	always @ (posedge clk)begin
	    if((cnt_ge==0)&&(cnt_shi==0)&&(pan==0))begin
	       pan<=1;
	       if(minute_shi==5 && minute_ge==9) begin
			    minute_shi <= 0;
			    minute_ge <= 0;
			    end
		   else if(minute_ge==9)begin
			    minute_ge <= 4'd0;
			    minute_shi <= minute_shi+1;
			    end
		   else
			    minute_ge <= minute_ge +1;
		   end
		else
		    if((cnt_ge!=0) || (cnt_shi!=0))begin
		        pan<=0;
		    end
//24小时计时与加减法模块
	always @ (posedge clk ) begin
		if ((minute_ge==0)&&(minute_shi==0)&&(pan1==0)&&(cnt_shi==0)&&(cnt_ge==0)) begin
		    pan1<=1;
			if(hour_shi==2 && hour_ge==3) begin
			    hour_shi <= 0;
			    hour_ge <= 0;
			    end
		    else if(hour_ge==9)begin
			    hour_ge <= 4'd0;
			    hour_shi <= hour_shi+1;
			    end
		    else
			    hour_ge <= hour_ge +1;
		    end
		else
		    if((minute_ge!=0) || (minute_shi!=0))begin
		        pan1<=0;
		        end

至此,我们已经基本实现了数字时钟的运行,但还需要将时钟信息显示在数码管上。

我将按键触发的信号位记作change和change2。当change2为高电平且change为低电平时,数码管显示分钟;当change2为高电平且change为高电平时,数码管显示时钟;而当change2为低电平时,不论change电平,均显示秒钟。

//数码管显示数字
		seg[0] = 7'h3f;	   //  0
		seg[1] = 7'h06;	   //  1
		seg[2] = 7'h5b;	   //  2
		seg[3] = 7'h4f;	   //  3
		seg[4] = 7'h66;	   //  4
		seg[5] = 7'h6d;	   //  5
		seg[6] = 7'h7d;	   //  6
		seg[7] = 7'h07;	   //  7
		seg[8] = 7'h7f;	   //  8
		seg[9] = 7'h6f;	   //  9
        
//选择显示
	always @ (posedge clk)begin
	    if((change==0)&&(change2==1))begin
            seg_led_1<= seg[hour_ge];
            seg_led_2<= seg[hour_shi];
            end
        else if((change==1)&&(change2==1))
            begin
	        seg_led_1<= seg[minute_ge];
            seg_led_2<= seg[minute_shi];
            end
        else if(change2==0)begin
            seg_led_1<= seg[cnt_ge];
            seg_led_2<= seg[cnt_shi];
            end
        end

所有基础功能都已经实现,现在还需要进阶,也就是调时和整点报时的实现。

我们先讲调时的实现

我在实现加减法的时候均用了两个计数器add、add1和jian、jian1。

add和jian分别为按键按下次数的计数器,而add1和jian1则分别为add和jian的匹配计数器。

当add1不等于add时,将时钟进一位,并且add1+1;当jian1不等于jian时,将时钟退一位,再将jian1+1,便可以实现调时的功能。

我在写代码的时候是将调时模块整合在计时模块中的,时钟调时与分钟调时的原理是相同的。

        if((add1!=add)&&(change==1)) begin
            add1<=add1+1;
            if(minute_shi==5 && minute_ge==9) begin
			    minute_shi <= 0;
			    minute_ge <= 0;
			    end
		    else if(minute_ge==9)begin
			    minute_ge <= 4'd0;
			    minute_shi <= minute_shi+1;
			    end
		    else
			    minute_ge <= minute_ge +1;
		    end
        if((jian1!=jian)&&(change==1))begin
            jian1<=jian1+1;
            if(minute_shi==0 && minute_ge==0)begin
                minute_ge<=9;
                minute_shi<=5;
                end
            else if(minute_ge==0)begin
                minute_ge<=9;
                minute_shi<=minute_shi-1;
                end
            else
                minute_ge<=minute_ge-1;
            end

最后便是整点报时的实现

整点报时需要让灯光按照1Hz的频率闪烁,那么我们便可以用一个2Hz的时钟信号作为敏感信号来触发灯光闪烁。

首先只有在秒钟分钟均为0时才算作整点,在这个条件下我又用到了两个计数器cnt、cnt1与加减法的计数器功能一致,cnt1为当前整点数的两倍(因为一亮一灭需要灯光反转两次),cnt为匹配计数器,当cnt不等于cnt1时灯光反转一次,并且cnt+1。具体代码实现如下。

 //整点报时
    always @(posedge clk0)begin
        led=~led;
        if((minute_shi==0)&&(minute_ge==0)&&(cnt_shi==0)&&(cnt_ge==0))begin
            cnt1=2*(10*hour_shi+hour_ge);
            end
        if(cnt!=cnt1)begin
            rgb=~rgb;
            cnt<=cnt+1;
            end
        else if(cnt==cnt1)begin
            cnt<=0;
            cnt1<=0;
            end
        end

以上就是整个数字时钟的设计,最后附上数字时钟的全部代码(记得把文首的debounce和devide两个代码也装上,不然数字时钟代码无法成功编译)

module counter
(
	clk				,    //时钟
	rst				,    //复位
	plus            ,    //加法为
	cut             ,    //减法位
	change			,    //显示转化按键1
	change2         ,    //显示转化按键2
	seg_led_1		,    //数码管1
	seg_led_2		,    //数码管2
	rgb             ,    //rgb灯光
	led                  //led
);
 
	input 	clk,rst;
	input	change;
	input   change2;
    input   plus,cut;
	output 	reg [8:0]	seg_led_1,seg_led_2;
	output 	reg	[7:0]	led;
	output  reg [5:0]   rgb;
    wire        clk0;         //0.5秒时钟
	wire		clk1h;        //1秒钟时钟
	wire		change_pulse; //转换按键消抖后信号
	wire        plus_pulse;   //加法按键消抖后信号
	wire        cut_pulse;    //减法按键消抖后信号
	reg			change_flag;  //转换按键标志位
	reg         plus_flag;    //加法按键标志位
	reg         cut_flag;     //减法按键标志位
	reg         pan;          //判断分钟进位
	reg         pan1;         //判断时钟进位     
	reg         add;          //分钟加法按键按下计数
	reg         add1;         //分钟加法按键匹配计数
	reg         add10;        //时钟加法按键按下计数     
	reg         add11;        //时钟加法按键匹配计数
	reg         jian10;       //时钟减法按键按下计数  
	reg         jian11;       //时钟减法按键匹配计数  
	reg         jian;         //分钟减法按键按下计数
	reg         jian1;        //分钟减法按键匹配计数
	reg         [5:0]   cnt=0;          //记录当前小时数
	reg         [5:0]   cnt1=0;         //小时匹配数
	reg   		[6:0]   seg		[9:0];  //数码管
	reg			[3:0]	cnt_ge;         //秒钟个位
	reg			[3:0]	cnt_shi;        //秒钟十位
	reg			[3:0]	minute_ge;      //分钟个位
	reg			[3:0]	minute_shi;     //分钟十位
	reg			[3:0]	hour_ge;        //小时个位
	reg			[3:0]	hour_shi;       //小时十位 
	initial 
	begin
		seg[0] = 7'h3f;	   //  0
		seg[1] = 7'h06;	   //  1
		seg[2] = 7'h5b;	   //  2
		seg[3] = 7'h4f;	   //  3
		seg[4] = 7'h66;	   //  4
		seg[5] = 7'h6d;	   //  5
		seg[6] = 7'h7d;	   //  6
		seg[7] = 7'h07;	   //  7
		seg[8] = 7'h7f;	   //  8
		seg[9] = 7'h6f;	   //  9
        
	end
 
 
 
	// 启动/暂停按键进行消抖
	debounce  U2 (
				.clk(clk),
				.rst(rst),
				.key(change),
				.key_pulse(change_pulse)
				);
	debounce  U6 (
				.clk(clk),
				.rst(rst),
				.key(plus),
				.key_pulse(plus_pulse)
				);
	debounce  U7 (
				.clk(clk),
				.rst(rst),
				.key(cut),
				.key_pulse(cut_pulse)
				);
	// 用于分出一个1Hz的频率	
	divide #(.WIDTH(32),.N(12000000)) U1 ( 
			.clk(clk),
			.rst_n(rst),      
			.clkout(clk1h)
			);
	// 用于分出一个2Hz的频率
	divide #(.WIDTH(32),.N(6000000)) U5 ( 
			.clk(clk),
			.rst_n(rst),      
			.clkout(clk0)
			);
    //按键动作标志信号产生
	always @ (posedge change_pulse)begin	
	    if(!rst==1)
			change_flag <= 0;
		else
		    change_flag <= ~change_flag;
		end
	always @ (posedge plus_pulse)begin	
	    if(!rst==1)
			plus_flag <= 0;
		else
		    plus_flag <= ~plus_flag;
		    if(change==1)begin
		        add<=add+1;
		        end
		    else if(change==0)begin
		        add10<=add10+1;
		        end
		end
	always @ (posedge cut_pulse)begin	
	    if(!rst==1)
			cut_flag <= 0;
		else
		    cut_flag <= ~cut_flag;
		    if(change==1)begin
		        jian<=jian+1;
		        end
		    else if(change==0)begin
		        jian10<=jian10+1;
		        end
		end
    //60秒计时控制
	always @ (posedge clk1h ) begin
        if(cnt_shi==5 && cnt_ge==9) begin
			cnt_shi <= 0;
			cnt_ge <= 0;
			end
		else if(cnt_shi==0 && cnt_ge==0) begin
			cnt_shi <= 0;
			cnt_ge <= 1;
			end
		else if(cnt_ge==9)begin
			cnt_ge <= 0;
			cnt_shi <= cnt_shi+1;
			end
		else
			cnt_ge <= cnt_ge +1;
		end
	//60分钟计时与加减法模块
	always @ (posedge clk)begin
	    if((cnt_ge==0)&&(cnt_shi==0)&&(pan==0))begin
	       pan<=1;
	       if(minute_shi==5 && minute_ge==9) begin
			    minute_shi <= 0;
			    minute_ge <= 0;
			    end
		   else if(minute_ge==9)begin
			    minute_ge <= 4'd0;
			    minute_shi <= minute_shi+1;
			    end
		   else
			    minute_ge <= minute_ge +1;
		   end
		else
		    if((cnt_ge!=0) || (cnt_shi!=0))begin
		        pan<=0;
		    end
        if((add1!=add)&&(change==1)) begin
            add1<=add1+1;
            if(minute_shi==5 && minute_ge==9) begin
			    minute_shi <= 0;
			    minute_ge <= 0;
			    end
		    else if(minute_ge==9)begin
			    minute_ge <= 4'd0;
			    minute_shi <= minute_shi+1;
			    end
		    else
			    minute_ge <= minute_ge +1;
		    end
        if((jian1!=jian)&&(change==1))begin
            jian1<=jian1+1;
            if(minute_shi==0 && minute_ge==0)begin
                minute_ge<=9;
                minute_shi<=5;
                end
            else if(minute_ge==0)begin
                minute_ge<=9;
                minute_shi<=minute_shi-1;
                end
            else
                minute_ge<=minute_ge-1;
            end
        end
	//24小时计时与加减法模块
	always @ (posedge clk ) begin
		if ((minute_ge==0)&&(minute_shi==0)&&(pan1==0)&&(cnt_shi==0)&&(cnt_ge==0)) begin
		    pan1<=1;
			if(hour_shi==2 && hour_ge==3) begin
			    hour_shi <= 0;
			    hour_ge <= 0;
			    end
		    else if(hour_ge==9)begin
			    hour_ge <= 4'd0;
			    hour_shi <= hour_shi+1;
			    end
		    else
			    hour_ge <= hour_ge +1;
		    end
		else
		    if((minute_ge!=0) || (minute_shi!=0))begin
		        pan1<=0;
		        end
		if((add11!=add10)&&(change==0))begin
		    add11<=add11+1;
		    if(hour_shi==2 && hour_ge==3) begin
			    hour_shi <= 0;
			    hour_ge <= 0;
			    end
		    else if(hour_ge==9)begin
			    hour_ge <= 4'd0;
			    hour_shi <= hour_shi+1;
			    end
		    else
			    hour_ge <= hour_ge +1;
		    end
		if((jian11!=jian10)&&(change==0))begin
            jian11<=jian11+1;
            if(hour_shi==0 && hour_ge==0)begin
                hour_ge<=3;
                hour_shi<=2;
                end
            else if(hour_ge==0)begin
                hour_ge<=9;
                hour_shi<=hour_shi-1;
                end
            else
                hour_ge<=hour_ge-1;
            end
        end
	//选择显示
	always @ (posedge clk)begin
	    if((change==0)&&(change2==1))begin
            seg_led_1<= seg[hour_ge];
            seg_led_2<= seg[hour_shi];
            end
        else if((change==1)&&(change2==1))
            begin
	        seg_led_1<= seg[minute_ge];
            seg_led_2<= seg[minute_shi];
            end
        else if(change2==0)begin
            seg_led_1<= seg[cnt_ge];
            seg_led_2<= seg[cnt_shi];
            end
        end
    //整点报时
    always @(posedge clk0)begin
        led=~led;
        if((minute_shi==0)&&(minute_ge==0)&&(cnt_shi==0)&&(cnt_ge==0))begin
            cnt1=2*(10*hour_shi+hour_ge);
            end
        if(cnt!=cnt1)begin
            rgb=~rgb;
            cnt<=cnt+1;
            end
        else if(cnt==cnt1)begin
            cnt<=0;
            cnt1<=0;
            end
        end
 
endmodule

管脚分配如下

整点报时代码,fpga开发

 整点报时代码,fpga开发

有疑惑或者问题欢迎一起讨论文章来源地址https://www.toymoban.com/news/detail-726935.html

到了这里,关于Verilog语言fpga小脚丫数字时钟(整点报时,调时,显示秒钟等功能)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于vivado(语言Verilog)的FPGA学习(5)——跨时钟处理

    慢时钟到快时钟一般都不需要处理,关键需要解决从快时钟到慢时钟的问题,因为可能会漏信号或者失真,比如: 第一种办法是开环解决方案,也就是人为设置目标信号脉宽大于1.5倍的周期。但是容易和设计要求冲突 所以第二个大方法是闭环解决方案,也就是从改善同步方

    2024年02月03日
    浏览(37)
  • FPGA的数字钟带校时闹钟报时功能VHDL

    名称:基于FPGA的数字钟具有校时闹钟报时功能 软件:Quartus 语言:VHDL 要求:   1、计时功能:这是数字钟设计的基本功能,每秒钟更新一次,并且能在显示屏上显示当前的时间。   2、闹钟功能:如果当前的时间与闹钟设置的时间相同,则扬声器发出闹音。   3、校时设置:用户可

    2024年02月04日
    浏览(29)
  • FPGA课程设计——数字电子时钟VERILOG(基于正点原子新起点开发板,支持8位或6位共阳极数码管显示时分秒毫秒,可校时,可设闹钟,闹钟开关,led指示)

    2019   级    电子科学与技术   专业FPGA课程设计 报   告 2022  年 5 月 20 日 多功能数字电子钟的设计 摘要 电子设计自动化(EDA)是一种实现电子系统或电子产品自动化设计的技术,使用EDA技术设计的结果既可以用FPGA / CPLD来实施验证,也可以直接做成专用集成电路(ASIC)。

    2024年02月03日
    浏览(36)
  • 基于FPGA的数字电子琴——数电小系统设计【数字电子技术】(使用Vivado中的verilog语言)含piano代码文件(全)

    目录 一、电路功能描述 二、方案设计 1. 总体设计方案 2. 对原理框图或程序流程图做出简单解释 3. 各模块介绍 3.1 音频驱动模块 3.2 LED显示模块 3.3 数码管显示模块 3.4 矩阵键盘模块 3.5 PS2机械键盘模块 3.6 时钟分频模块 3.7 曲谱生成模块 三、总结 数码管和LED显示模块 矩阵键盘

    2024年02月06日
    浏览(33)
  • Verilog设计数字时钟

    目录 一、设计要求 二、模块总和 三、模块设计 1.顶层模块 2.秒分频模块 3.秒计数模块 4.分钟分频模块 5.分钟计数模块 6.小时分频模块 7.小时计数模块 8.数据分配数码管模块 9.数码管显示模块 10.管脚约束代码 四、引脚分配 1.利用 NEXYS4 DDR 开发板设计一款数字时钟,能够正确

    2024年02月06日
    浏览(31)
  • FPGA(Verilog)时钟无缝切换设计与验证

    时钟切换基本模型,本文围绕“ 基本组合电路切换、解决前毛刺切换、解决后毛刺切换 ”三方面完成时钟无缝切换。 组合逻辑切换,本质就是二选一多路器 如下图,CLK_SEL 0与1分别控制时钟CLK_A CLK_B输出。 组合逻辑输出只跟当前输入状态有关,CLK_SEL异步不可控导致输出毛刺

    2023年04月10日
    浏览(31)
  • FPGA项目设计:数字时钟

    项目要求: 设计一个数字时钟,数码管前两位显示小时,数码管中间两位显示分钟,数码管后面两位显示秒。 项目设计: 系统框架图: 计数模块时序图: 代码实现: 计数模块: 数码管显示模块: 顶层文件:

    2024年02月14日
    浏览(33)
  • 【FPGA & Modsim】数字时钟

    实验题目:    数字时钟设计                                   实验目的:    掌握数字时钟的工作原理;掌握使用数字逻辑设计集成开发环境分模块设计数字时钟的方法。                           实验内容: 1、创建一个数字时钟工程,使用

    2024年01月18日
    浏览(27)
  • 基于FPGA的数字时钟系统设计

    在FPGA的学习中,数字时钟是一个比较基础的实验案例,通过该实验可以更好的锻炼初学者的框架设计能力以及逻辑思维能力,从而打好坚实的基本功,接下来就开始我们的学习吧! 1.数码管介绍 数码管通俗理解就是将8个LED(包含dp部分)灯拼接到一起组成的,分别标号为a~g。前

    2024年02月06日
    浏览(34)
  • 【数字IC手撕代码】Verilog无毛刺时钟切换电路|题目|原理|设计|仿真

    芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区 联合力荐 !近500篇 数字IC精品文章收录 ! 【数字IC精品文章收录】学习路线·基础知识·总线·脚本语言·芯片求职·EDA工具·低功耗设计Verilog·STA·设计·验证·FPGA·架构·AMBA·书籍 本系列旨在提

    2023年04月08日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包