• 数码管实验——简易秒表


    秒表的制作并非一帆风顺,中间遇到了许多问题

    比如计数寄存器的位数设置

    reg     [?:0]    c1;

    参考别人的代码写为31了,虽然最后成功了,但却不知道原因。。。

    基础Verilog知识还是有待学习啊~‘

     

    最终代码:

    //=======================================================
    //  This code is generated by Terasic System Builder
    //=======================================================
    
    module myDT(
    
        //////////// CLOCK //////////
        CLOCK_50,
        RSTn,
        
        //////////// LED //////////
        LEDG,
        LEDR,
        
        //////////// SEG7 //////////
        HEX0,
        HEX1,
        HEX2,
        HEX3,
        HEX4,
        HEX5,
        HEX6,
        HEX7 
    );
    
    //=======================================================
    //  PARAMETER declarations
    //=======================================================
    
    parameter _0 = 7'b100_000_0, _1 = 7'b111_100_1, _2= 7'b010_010_0, _3 = 7'b011_000_0,
                 _4 = 7'b001_100_1, _5 = 7'b001_001_0, _6= 7'b000_001_0, _7 = 7'b111_100_0,
                 _8 = 7'b000_000_0, _9 = 7'b001_000_0;
    
    
    //=======================================================
    //  PORT declarations
    //=======================================================
    
    //////////// CLOCK //////////
    input                          CLOCK_50;
    input                          RSTn;
    
    //////////// LED //////////
    output             [8:0]        LEDG;
    output            [17:0]        LEDR;
    
    //////////// SEG7 //////////
    output             [6:0]        HEX0;
    output             [6:0]        HEX1;
    output             [6:0]        HEX2;
    output             [6:0]        HEX3;
    output             [6:0]        HEX4;
    output             [6:0]        HEX5;
    output             [6:0]        HEX6;
    output             [6:0]        HEX7;
    
    
    //=======================================================
    //  REG/WIRE declarations
    //=======================================================
    reg      [31:0]      C7;
    reg      [31:0]      C6;
    reg      [31:0]      C5;
    reg      [31:0]      C4;
    reg      [31:0]      C3;
    reg      [31:0]      C2;
    reg      [31:0]      C1;
    reg      [31:0]      C0;
    
    reg             [6:0]        rHEX0;
    reg             [6:0]        rHEX1;
    reg             [6:0]        rHEX2;
    reg             [6:0]        rHEX3;
    reg             [6:0]        rHEX4;
    reg             [6:0]        rHEX5;
    reg             [6:0]        rHEX6;
    reg             [6:0]        rHEX7;
    
    
    //=======================================================
    //  Structural coding
    //=======================================================
    
    //----1MS定时器
    parameter T1MS = 16'd49_999;
    reg   [16:0]     Count1;
    always@(posedge CLOCK_50 or negedge RSTn)
        if(!RSTn)
            Count1 <= 16'd0;
        else if(Count1 == T1MS)
            Count1 <= 16'd0;
        else
            Count1 <= Count1 + 16'd1;        
            
    //----MS定时器
    reg    [16:0]  Count_MS;
    always@(posedge CLOCK_50 or negedge RSTn)
        if(!RSTn)
            Count_MS <= 16'd0;
        else if(Count_MS == 10'd1000)
            Count_MS <= 16'd0;
        else if(Count1 == T1MS)
            Count_MS <= Count_MS + 16'd1;
    
    //----S定时器
    reg  [16:0] Count_S;
    always@(posedge CLOCK_50 or negedge RSTn)
        if(!RSTn)
            Count_S <= 16'd0;
        else if(Count_S == 10'd60)
            Count_S <= 16'd0;
        else if(Count_MS == 16'd1000)
            Count_S <= Count_S + 16'd1;
    
    //----M定时器
    reg [16:0]    Count_M;
    always@(posedge CLOCK_50 or negedge RSTn)
        if(!RSTn)
            Count_M <= 16'd0;
        else if(Count_M == 10'd60)
            Count_M <= 16'd0;
        else if(Count_S == 10'd60)
            Count_M <= Count_M + 16'd1;
    
    
    //----数码管显示
    
    always @ (posedge CLOCK_50 or negedge RSTn) 
        if(!RSTn)
            begin
                C7 = 31'd0;
                C6 = 31'd0;
                C5 = 31'd0;
                C4 = 31'd0;
                C3 = 31'd0;
                C2 = 31'd0;
                C1 = 31'd0;
                C0 = 31'd0;
            end
        else
            begin
                C7 = Count_M/10;
                C6 = Count_M%10;
                C5 = Count_S/10;
                C4 = Count_S%10;
                C3 = Count_MS/1000;
                C2 = Count_MS/100%10;
                C1 = Count_MS%100/10;
                C0 = Count_MS%10;
            end
    
    
    
    always @ (posedge CLOCK_50 or negedge RSTn)
            case(C7)
                0 : rHEX7 = _0;
                1 : rHEX7 = _1;
                2 : rHEX7 = _2;
                3 : rHEX7 = _3;
                4 : rHEX7 = _4;
                5 : rHEX7 = _5;
                6 : rHEX7 = _6;
                7 : rHEX7 = _7;
                8 : rHEX7 = _8;
                9 : rHEX7 = _9;
            endcase
    
    always @ (posedge CLOCK_50 or negedge RSTn)        
            case(C6)
                0 : rHEX6 = _0;
                1 : rHEX6 = _1;
                2 : rHEX6 = _2;
                3 : rHEX6 = _3;
                4 : rHEX6 = _4;
                5 : rHEX6 = _5;
                6 : rHEX6 = _6;
                7 : rHEX6 = _7;
                8 : rHEX6 = _8;
                9 : rHEX6 = _9;
            endcase
    
    always @ (posedge CLOCK_50 or negedge RSTn)        
            case(C5)
                0 : rHEX5 = _0;
                1 : rHEX5 = _1;
                2 : rHEX5 = _2;
                3 : rHEX5 = _3;
                4 : rHEX5 = _4;
                5 : rHEX5 = _5;
                6 : rHEX5 = _6;
                7 : rHEX5 = _7;
                8 : rHEX5 = _8;
                9 : rHEX5 = _9;
            endcase
    
    always @ (posedge CLOCK_50 or negedge RSTn)        
            case(C4)
                0 : rHEX4 = _0;
                1 : rHEX4 = _1;
                2 : rHEX4 = _2;
                3 : rHEX4 = _3;
                4 : rHEX4 = _4;
                5 : rHEX4 = _5;
                6 : rHEX4 = _6;
                7 : rHEX4 = _7;
                8 : rHEX4 = _8;
                9 : rHEX4 = _9;
            endcase
    //尝试过加入这部分,但由于变化速度太快,视觉暂留什么的就导致后面4个数码管全部显示为8
    /* always @ (posedge CLOCK_50 or negedge RSTn) case(C3) 0 : rHEX3 = _0; 1 : rHEX3 = _1; 2 : rHEX3 = _2; 3 : rHEX3 = _3; 4 : rHEX3 = _4; 5 : rHEX3 = _5; 6 : rHEX3 = _6; 7 : rHEX3 = _7; 8 : rHEX3 = _8; 9 : rHEX3 = _9; endcase always @ (posedge CLOCK_50 or negedge RSTn) case(C2) 0 : rHEX2 = _0; 1 : rHEX2 = _1; 2 : rHEX2 = _2; 3 : rHEX2 = _3; 4 : rHEX2 = _4; 5 : rHEX2 = _5; 6 : rHEX2 = _6; 7 : rHEX2 = _7; 8 : rHEX2 = _8; 9 : rHEX2 = _9; endcase always @ (posedge CLOCK_50 or negedge RSTn) case(C1) 0 : rHEX1 = _0; 1 : rHEX1 = _1; 2 : rHEX1 = _2; 3 : rHEX1 = _3; 4 : rHEX1 = _4; 5 : rHEX1 = _5; 6 : rHEX1 = _6; 7 : rHEX1 = _7; 8 : rHEX1 = _8; 9 : rHEX1 = _9; endcase always @ (posedge CLOCK_50 or negedge RSTn) case(C0) 0 : rHEX0 = _0; 1 : rHEX0 = _1; 2 : rHEX0 = _2; 3 : rHEX0 = _3; 4 : rHEX0 = _4; 5 : rHEX0 = _5; 6 : rHEX0 = _6; 7 : rHEX0 = _7; 8 : rHEX0 = _8; 9 : rHEX0 = _9; endcase */ //输出赋值 /*assign HEX0 = rHEX0; assign HEX1 = rHEX0; assign HEX2 = rHEX0; assign HEX3 = rHEX0; */ assign HEX0 = 7'b111_111_1; assign HEX1 = 7'b111_111_1; assign HEX2 = 7'b111_111_1; assign HEX3 = 7'b111_111_1; assign HEX4 = rHEX4; assign HEX5 = rHEX5; assign HEX6 = rHEX6; assign HEX7 = rHEX7; endmodule

    总结:

    1.  就算已经定义了输出量,比如input  HEX7,后面always里面要用到的时候还是必须定义reg  [6:0]  rHEX7,而不能直接reg  [6:0]  HEX7

      然后最后还必须要assign  HEX7 = rHEX7

    2.  之前always里面一口气写了8个case,虽然编译时没有语法错误,但烧到板子上却运行不出想要的效果。后来分开写,就好了,原因不详

    3.  DE2-115用的的晶振是50MHZ的,利用晶振~定时器的用法很巧妙丫——频率是指1秒内振动的次数,而振动一次计数器就加1,1ms需要振动的次数为                50MHZ*0.01s,然后就有 parameter  T1MS=50MHZ*0.01s-1

    4.  要习惯用parameter,这样可读性更高,而且方便

    5.  关于计数器C1...reg的位数还有待进一步研究

    学习硬件描述语言要用并行思维!并行思维!

  • 相关阅读:
    移动端浏览器有哪些,内核分别是什么
    html5定位获取当前位置并在百度地图上显示
    HTML5实现获取地理位置信息并定位功能
    使用VUE开发
    Node 操作MySql数据库
    移动端布局必须注意的问题3
    移动端布局必须注意的问题2
    移动端布局必须注意的问题
    rem和em的用法
    关于圣杯、双飞翼布局
  • 原文地址:https://www.cnblogs.com/fengyanlover/p/5021522.html
Copyright © 2020-2023  润新知