Counters

 Exams/ece241 2014 q7a(Counter 1-12)

module top_module (
    input clk,
    input reset,
    input enable,
    output [3:0] Q,
    output c_enable,
    output c_load,
    output [3:0] c_d
); //
    
    count4 count12(.clk(clk), .enable(c_enable), .load(c_load), .d(c_d), .Q(Q) );
    
    assign c_enable = enable;
    //使能信号一致;
    assign c_load = reset | (enable && Q == 4'd12); 
    //load代表重新加载,即回到初始值;① reset为1时,c_load高,重新加载;② enable使能,且Q到12,c_load高,重新加载;
    assign c_d = c_load?4'b1:4'bz;
    //特殊c_load高,c_d重新加载为1;其他情况c_d不管;

endmodule

Exams/ece241 2014 q7b(Counter 1000)

法一:参考

module top_module (
    input clk,
    input reset,
    output OneHertz,
    output [2:0] c_enable
); //
    
    reg[3:0] q0,q1,q2;
    
    always@(*)begin
        if(reset)begin
            c_enable<=0; //reset时,使能000;
        end
        else begin
            c_enable[0]<=1'b1;
            if(q0==4'd9)begin //q0数到9,开始下一级即q1计数,c_enable[1]使能;
                c_enable[1]<=1'b1;
            end
            else begin
                c_enable[1]<=1'b0;
            end
            if(q1==4'd9 && q0==4'd9)begin
                c_enable[2]<=1'b1;
            end
            else begin
                c_enable[2]<=1'b0;
            end
        end
    end
    
    assign OneHertz = (q2==4'd9) && (q1==4'd9) && (q0==4'd9); //9 9 9,到OneHertz周期;
    
    bcdcount counter0 (clk, reset, c_enable[0], q0);
    bcdcount counter1 (clk, reset, c_enable[1], q1);
    bcdcount counter2 (clk, reset, c_enable[2], q2);

endmodule

法二:来源

module top_module (
    input clk,
    input reset,
    output OneHertz,
    output [2:0] c_enable
); //
    
    reg[3:0] q0,q1,q2;
    
    assign c_enable = {q1==4'd9&&q0==4'd9, q0==4'd9, 1'b1};
    
    assign OneHertz = (q2==4'd9) && (q1==4'd9) && (q0==4'd9); //9 9 9,到OneHertz周期;
    
    bcdcount counter0 (clk, reset, c_enable[0], q0);
    bcdcount counter1 (clk, reset, c_enable[1], q1);
    bcdcount counter2 (clk, reset, c_enable[2], q2);

endmodule

Countbcd

module top_module (
    input clk,
    input reset,   // Synchronous active-high reset
    output [3:1] ena,
    output [15:0] q);
    
    always@(posedge clk)begin
        if(reset)begin
            ena<=0;
        end
        else begin
            if(q[3:0]==4'd8)begin
            	ena[1]<=1'b1;
            end
            else begin
            	ena[1]<=1'b0;
            end
            if(q[7:4]==4'd9 && q[3:0]==4'd8)begin
            	ena[2]<=1'b1;
            end
            else begin
            	ena[2]<=1'b0;
            end
            if(q[11:8]==4'd9 && q[7:4]==4'd9 && q[3:0]==4'd8)begin
                ena[3]<=1'b1;
            end
            else begin
                ena[3]<=1'b0;
            end
        end
    end
    
    decade_con decade_con1(.clk(clk), .reset(reset), .enable(1'b1), .q(q[3:0]));
    decade_con decade_con2(.clk(clk), .reset(reset), .enable(ena[1]), .q(q[7:4]));
    decade_con decade_con3(.clk(clk), .reset(reset), .enable(ena[2]), .q(q[11:8]));
    decade_con decade_con4(.clk(clk), .reset(reset), .enable(ena[3]), .q(q[15:12]));

endmodule
// 带使能端口的十进制计数器
module decade_con (
    input clk,
    input reset,        // Synchronous active-high reset
    input enable,
    output [3:0] q);
    
    always@(posedge clk)begin
        if(reset)begin
            q<=0;
        end
        else begin
            if(enable)begin
                if(q==9)begin //q数到9,下一个归零;
            		q<=0;
            	end
            	else begin
                	q<=q+1;
            	end
            end
        end
    end

endmodule

Count clock

12 h-clock,am/pm ,fast-running clk驱动,时钟clk每增加一次(即每增加秒一次),ena脉冲1。

复位信号将时钟复位为 12:00 AM。0:AM,1:PM。hh、mm 和 ss 是两个 BCD(二进制编码十进制)数字,分别表示小时 (01-12)、分钟 (00-59) 及秒 (00-59)。

复位信号的优先级高于ena,即使ena无效,也可能发生复位。

以下时序图显示了从AM 11:59:59 到PM 12:00:00 的翻转行为以及同步复位和使能行为。

module top_module(
    input clk,
    input reset,
    input ena,
    output pm,
    output [7:0] hh,
    output [7:0] mm,
    output [7:0] ss); 
    
    always@(posedge clk)begin
        if(reset)begin	//reset resets the clock to 12:00 AM.
            pm<=1'h0;	//0:am 1:pm
            hh<={4'd1, 4'd2};
            mm<={4'd0, 4'd0}; 
            ss<={4'd0, 4'd0}; 
        end
        else begin
            //pm变换,0:am 1:pm
            if(hh=={4'd1, 4'd1} && mm=={4'd5, 4'd9} && ss=={4'd5, 4'd9})begin
            	pm<=~pm;
            end
            else begin
                pm<=pm;
            end
            //ena作用
            if(~ena)begin
                hh<=hh;
            	mm<=mm; 
            	ss<=ss;
            end
            else begin	//ena使能
                //ss
                if(ss=={4'd5, 4'd9})begin	//ss=59;
                	ss<={4'd0, 4'd0};
                    mm[3:0]<=mm[3:0]+1'b1;	//mm个位数加1;
            	end
            	else begin
                    if(ss[3:0]==4'd9)begin	//ss=z9;
                    	ss[7:4]<=ss[7:4]+1'b1;
                    	ss[3:0]<=4'd0;
                	end
                    else begin	//ss={z,<9};
                    	ss[3:0]<=ss[3:0]+1'b1;
                	end
            	end
            	//mm
                if(mm=={4'd5, 4'd9} && ss=={4'd5, 4'd9})begin	//mm=59,ss=59
                    mm<={4'd0, 4'd0}; //mm清零,hh加一;只需mm清零,ss怎么清零前面已经定义;
                	hh[3:0]<=hh[3:0]+1'b1;
            	end
            	else begin
                    if(mm[3:0]==4'd9 && ss=={4'd5, 4'd9})begin	//mm=z9,ss=59
                        mm[7:4]<=mm[7:4]+1'b1;	//mm高位加1,低位清零;
                    	mm[3:0]<=4'd0;
                	end
                    //mm={z,<9},ss=59 35行已经定义,固此处不再重复定义;
            	end
            	//hh
                if(hh=={4'd1, 4'd2} && mm=={4'd5, 4'd9} && ss=={4'd5, 4'd9})begin
                    hh<={4'd0, 4'd1};	//12:59:59,只需hh变为01,mm、ss怎么清零已经定义;
            	end
            	else begin
                    if(hh=={4'd0, 4'd9} && mm=={4'd5, 4'd9} && ss=={4'd5, 4'd9})begin
                        hh<={4'd1, 4'd0};	//09:59:59 (hh=z9,z只能=0), hh=10;
                	end
                    //mm={0,<9},ss=59 49行已经定义,固此处不再重复定义;
            	end
            end
            
        end
    end
   
endmodule

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值