zoukankan      html  css  js  c++  java
  • (原创)多功能数字钟(Digital Logic)(DE2)(QuartusII)

    Abstract

    将电路分成不同的层次和模块分别进行设计,然后组合,实现电路功能。

    Instruction

    数字钟的功能:

    1. 准确计时,以数字显示时、分、秒;
    2. 具有分、时校时功能;
    3. 整点报时;
    4. 闹钟;

    指定:

    /////////////////////////////////////////////////////////////////////
       管脚               //     端口
    -----------------------------------------------------------
       SW0                       复位(0有效)
    -----------------------------------------------------------
       SW1                       校时调分钟
    ----------------------------------------------------------
       SW2                       校时调小时
    ----------------------------------------------------------
       SW3                       mode(闹钟定时模式)
    ----------------------------------------------------------
       SW4                       设置闹钟的分钟
    ----------------------------------------------------------
       SW5                       设置闹钟的小时
    ----------------------------------------------------------
       SW6                       ctrl_bell(关闭闹钟0有效)
    ----------------------------------------------------------
       SW7                       输出时钟选择(0-1hz,1-5hz)
    ----------------------------------------------------------
       CLOCK_50                  输入时钟
    ----------------------------------------------------------
       HEX5--4                   显示小时
    ----------------------------------------------------------
       HEX3--2                   显示分钟
    ----------------------------------------------------------
       HEX1--0                   显示秒
    ----------------------------------------------------------
       LEDG8                     表示闹钟或整点报时
    ////////////////////////////////////////////////////////////////////

    分析:

    数字钟组成框图

     

    数字钟主体电路的设计

    1. 模24计数器

    //counter24.v

    1 //filename :counter24.v (BCD : 0--23)
    2 module counter24(CntH,CntL,ncR,EN,CP);
    3 input CP,ncR,EN;
    4 output [3:0]CntH,CntL;
    5 reg [3:0]CntH,CntL;
    6
    7 always @(posedge CP,negedge ncR)
    8 begin
    9 if(~ncR)
    10 {CntH,CntL}<=8'h00;
    11 else if(~EN)
    12 {CntH,CntL}<={CntH,CntL};
    13 else if((CntH>2)||(CntL>9)||((CntH==2)&&(CntL>=3)))
    14 {CntH,CntL}<=8'h00;
    15 else if((CntH==2)&&(CntL<3))
    16 begin
    17 CntH<=CntH;
    18 CntL<=CntL+1'b1;
    19 end
    20 else if(CntL==9)
    21 begin
    22 CntH<=CntH+1'b1;
    23 CntL<=4'b0000;
    24 end
    25 else
    26 begin
    27 CntH<=CntH;
    28 CntL<=CntL+1'b1;
    29 end
    30 end
    31
    32 endmodule

    2. 模60计数器

    60进制计数器的层次结构

    //counter60.v

     

    1 //countuer 60
    2
    3 //counter10.v (BCD: 0--9)
    4 module counter10(Q,ncR,EN,CP);
    5 input CP,ncR,EN;
    6 output reg [3:0]Q;
    7
    8 always @(posedge CP,negedge ncR)
    9 begin
    10 if(~ncR)
    11 Q<=4'b0000;
    12 else if(~EN)
    13 Q<=Q;
    14 else if(Q==4'b1001)
    15 Q<=4'b0000;
    16 else
    17 Q<=Q+1'b1;
    18 end
    19 endmodule
    20
    21 //counter6.v(BCD: 0--5)
    22 module counter6(Q,ncR,EN,CP);
    23 input CP,ncR,EN;
    24 output reg [3:0]Q;
    25
    26 always @(posedge CP,negedge ncR)
    27 begin
    28 if(~ncR)
    29 Q<=4'b0000;
    30 else if(~EN)
    31 Q<=Q;
    32 else if(Q==4'b0101)
    33 Q<=4'b0000;
    34 else
    35 Q<=Q+1'b1;
    36 end
    37 endmodule
    38
    39 //counter60.v(BCD:0--59)
    40 module counter60(Cnt,ncR,EN,CP);
    41 input CP,ncR,EN;
    42 output [7:0]Cnt;
    43 wire [7:0]Cnt;
    44 wire ENP;
    45
    46 counter10 UC0(Cnt[3:0],ncR,EN,CP);
    47 counter6 UC1(Cnt[7:4],ncR,ENP,CP);
    48
    49 assign ENP=(Cnt[3:0]==4'h9);
    50 endmodule

    3. 主体电路

    //top_clock.v

     
    1 //top_clock.v
    2 module top_clock(Hour,Minute,Second,_1HZ,ncR,AdjMinKey,AdjHrKey);
    3 input _1HZ,ncR,AdjMinKey,AdjHrKey;
    4 output wire [7:0]Hour,Minute,Second;
    5 supply1 Vdd;
    6 wire MinCP,HrCP;
    7
    8 //Hour:Minute:Second counter
    9 counter60 UT1(Second,ncR,Vdd,_1HZ); //second counter
    10 counter60 UT2(Minute,ncR,Vdd,~MinCP); //minute counter
    11 counter24 UT3(Hour[7:4],Hour[3:0],ncR,Vdd,~HrCP); //hour counter
    12
    13 //generate singal of minute counter
    14 assign MinCP=AdjMinKey?_1HZ:(Second==8'h59);
    15 //generate singal of hour counter
    16 assign HrCP=AdjHrKey?_1HZ:({Minute,Second}==16'h5959);
    17
    18 endmodule
     

    方框图:

    top_clock方框

    仿真结果

    top_clock_01

    top_clock_02

    4. 分频模块

    //参考无双的万用分频器

    扩展电路的设计

    1. 整点报时

    //radio.v

    1 //Radio.v
    2 module Radio(alarm_radio,minute,second,_1khz,_500hz);
    3 input _1khz,_500hz;
    4 input [7:0]minute,second;
    5 output reg alarm_radio;
    6
    7 always @(minute or second)
    8 if(minute==8'h59)
    9 case(second)
    10 8'h51,
    11 8'h53,
    12 8'h55,
    13 8'h57:alarm_radio=_500hz;
    14 8'h59:alarm_radio=_1khz;
    15 default:alarm_radio=1'b0;
    16 endcase
    17 else alarm_radio=1'b0;
    18
    19 endmodule

    2.闹钟

    //bell.v

     

    1 //Bell.v
    2 module Bell(alarm_clock,set_hr,set_min,hour,minute,
    3 second,sethrkey,setminkey,_1khz,_500hz,
    4 _1hz,ctrlbell);
    5 output alarm_clock;
    6 output [7:0]set_hr,set_min;
    7 wire alarm_clock;
    8 input _1khz,_500hz,_1hz;
    9 input sethrkey,setminkey;
    10 input ctrlbell;
    11 input [7:0]hour,minute,second;
    12
    13 supply1 Vdd;
    14 wire hrh_equ,hrl_equ,minh_equ,minl_equ;
    15 wire time_equ;
    16
    17 counter60 SU1(set_min,Vdd,setminkey,_1hz);
    18 counter24 SU2(set_hr[7:4],set_hr[3:0],Vdd,sethrkey,_1hz);
    19
    20 //comparate the set time
    21 _4bitcomparator SU4(hrh_equ,set_hr[7:4],hour[7:4]);
    22 _4bitcomparator SU5(hrl_equ,set_hr[3:0],hour[3:0]);
    23 _4bitcomparator SU6(minh_equ,set_min[7:4],minute[7:4]);
    24 _4bitcomparator SU7(minl_equ,set_min[3:0],minute[3:0]);
    25
    26 assign time_equ=(hrh_equ && hrl_equ && minh_equ && minl_equ);
    27 assign alarm_clock=ctrlbell?(time_equ&&(((second[0]==1'b1)&&_500hz)
    28 ||((second[0]==1'b0)&&_1khz))):1'b0;
    29 endmodule
    30
    31 //4bitcomparator.v
    32 module _4bitcomparator(equ,a,b);
    33 input [3:0]a,b;
    34 output equ;
    35
    36 assign equ=(a==b);
    37 endmodule

    多功能数字钟顶层电路设计

    //complete_clock.v

    另一种实现方式:方框图

    complete_clock

    Conclusion

    数字钟也算是一个经典的课设,尝试在DE2上实现。当然功能还可扩展,唯一待解决的问题是DE2没有配置蜂鸣器,暂时用LEDG8接收500hz和1Khz的频率来代替蜂鸣器的效果。(不够完美:()。

    Reference

    罗杰 <Verilog HDL与数字ASIC设计基础> 华科

  • 相关阅读:
    (Java) LeetCode 44. Wildcard Matching —— 通配符匹配
    (Java) LeetCode 30. Substring with Concatenation of All Words —— 与所有单词相关联的字串
    (Java) LeetCode 515. Find Largest Value in Each Tree Row —— 在每个树行中找最大值
    (Java) LeetCode 433. Minimum Genetic Mutation —— 最小基因变化
    (Java) LeetCode 413. Arithmetic Slices —— 等差数列划分
    (Java) LeetCode 289. Game of Life —— 生命游戏
    (Java) LeetCode 337. House Robber III —— 打家劫舍 III
    (Java) LeetCode 213. House Robber II —— 打家劫舍 II
    (Java) LeetCode 198. House Robber —— 打家劫舍
    (Java) LeetCode 152. Maximum Product Subarray —— 乘积最大子序列
  • 原文地址:https://www.cnblogs.com/halflife/p/1706789.html
Copyright © 2011-2022 走看看