verilog之计数器0~9999——数码管显示

verilog的语法是比较好理解的,当然是相对于VHDL楼,废话不说,直接上代码:

/*
file name     :     led4_cnt.v(for 4-bit)
author        :    LiMing
date        :    2012/06/07
description    :     Light one bit 7-segment and display 0 1 2 ... e f. in every constant time
fpga        :    Cyclone III    EP3C16F484C6
board        :    DE0 (ter-asic Ltd.)

successful!!! in DE0 board

unsigned char code[]=
{
    0x40, 0x79, 0x24, 
    0x30, 0x19, 0x12,
    0x02, 0x78, 0x00,
    0x10, 0x08, 0x03,
    0x46, 0x21, 0x06,
    0x0e       
};
*/

module led4_cnt(clk_50, sega7, segb7, segc7, segd7);
    
    input          clk_50;
    output [6:0] sega7;
    reg [6:0]      sega7;
    output [6:0] segb7;
    reg [6:0]      segb7;
    output [6:0] segc7;
    reg [6:0]      segc7;
    output [6:0] segd7;
    reg [6:0]      segd7;
    
    reg clk1k;    //frequency division //1khz 
    reg clk1hz;    //second clk signal
    
    reg [14:0]     count_1khz;    //count for frequency division 
    //reg [24:0]    count_1hz;    
    reg [8:0]    count_1hz;    
    
    reg [3:0]     num_ge;
    reg [3:0]    num_shi;
    reg [3:0]    num_bai;
    reg [3:0]    num_qian;
    
    parameter time_limited_1khz = 15'd25_000;
    //parameter time_limited_1hz = 25'd25_000_000;
    parameter time_limited_1hz = 9'd500;
    
    
    initial 
        begin
            sega7 <= 7'b100_0000;
            segb7 <= 7'b111_1001;
            segc7 <= 7'b010_0100;
            segd7 <= 7'b011_0000;
            num_ge = 4'd0;
            num_shi = 4'd0;
            num_bai = 4'd0;
            num_qian = 4'd0;
            clk1k = 1'd0;
            clk1hz = 1'd0;
        end
    
    //分频电时钟模块路 generate 1khz
    always@(posedge clk_50)//50M-1k,50M/1k/2//分频,50Mhz~1khz,占空比50% 
        begin 
            if(count_1khz == time_limited_1khz) 
                begin
                    clk1k <= ~clk1k; 
                    count_1khz <= 0; 
                end
            else
                count_1khz <= count_1khz + 1'd1; 
        end 
        
    //分频电时钟模块路 generate 1hz
    /*
    always@(posedge clk_50)//50M-1hHz,50M/1Hz/2//分频,50Mhz~1khz,占空比50% 
        begin
            if(count_1hz == time_limited_1hz)
                begin
                    clk1hz <= ~clk1hz;
                    count_1hz <= 0;
                end
            else
                count_1hz <= count_1hz + 1'd1;
        end
        */
    //分频电时钟模块路 generate 1hz
    always@(posedge clk1k)//1kHz~1Hz,占空比50% 
        begin
            if(count_1hz == time_limited_1hz)
                begin
                    clk1hz <= ~clk1hz;
                    count_1hz <= 0;
                end
            else
                count_1hz <= count_1hz + 1'd1;
        end
        /*    
            if(count == time_limited_1hz) 
                begin
                    clk1hz <= ~clk1hz; 
                    count <= 0; 
                end
            else
                count <= count + 1'b1; 
        */    
    //
    always @(posedge clk1hz)
        begin
            //if(num_ge==4'd10 && num_shi<4'd10)
            if(num_ge==4'd9 && num_shi<4'd10 && num_bai<4'd10 && num_qian<4'd10)
                begin
                    num_ge <= 4'd0;
                    num_shi <= num_shi + 4'd1;
                    if(num_shi == 4'd9 && num_bai<4'd10 && num_qian<4'd10)
                        begin
                            num_shi <= 4'd0;
                            num_bai <= num_bai + 4'd1;
                        end
                    if(num_bai == 4'd9 && num_qian<4'd10)
                        begin
                            num_bai <= 4'd0;
                            num_qian <= num_qian + 4'd1;
                        end
                end
            /*    
            //else if(num_shi==4'd10 && num_bai<4'd10)
            else if(num_shi==4'd10)
                begin
                    num_shi <= 4'd0;
                    num_bai <= num_bai + 4'd1;
                end
            //else if(num_bai==4'd10 && num_qian<4'd10)            
            else if(num_bai==4'd10)            
                begin
                    num_bai <= 4'd0;
                    num_qian <= num_qian + 4'd1;
                end
            */
            else if(num_qian==4'd10 && num_bai==4'd9 && num_shi==4'd9 && num_ge==4'd9)
                begin
                    num_ge <= 4'd0;
                    num_shi <= 4'd0;
                    num_bai <= 4'd0;
                    num_qian <= 4'd0;
                end
            else
                begin
                    num_ge <= num_ge + 4'd1;                
                end
        end
        
    /*always @(posedge clk_50)
        begin
            if(count < time_limited)
                begin
                    count <= count + 1'b1;
                    flag = 1'b0;
                end
            else
                begin
                    count = 24'd0;
                    flag = 1'b1;
                end
        end
        
    always @(posedge flag)
        begin
            if (num < 4'hf)
                num <= num + 1'b1;
            else
                num <= 4'd0;
        end
    */
    
    //display ge wei
    always @(num_ge)
        begin
            case(num_ge)
                4'h0: sega7 = 7'b100_0000;
                4'h1: sega7 = 7'b111_1001;    // ---a----      0x40
                4'h2: sega7 = 7'b010_0100;    // |      |      0x70
                4'h3: sega7 = 7'b011_0000;    // f     b      0x24
                4'h4: sega7 = 7'b001_1001;    // |      |      0x30
                4'h5: sega7 = 7'b001_0010;    // ---g----      0x19
                4'h6: sega7 = 7'b000_0010;    // |      |     0x12
                4'h7: sega7 = 7'b111_1000;    // e     c      0x02
                4'h8: sega7 = 7'b000_0000;    // |      |     0x78
                4'h9: sega7 = 7'b001_0000;    // ---d----.    0x00
                /*4'ha: sega7 = 8'b0001_0000;      // 0x10
                4'hb: sega7 = 8'b0000_1000;    // 0x08
                4'hc: sega7 = 8'b0000_0011;    // 0x03
                4'hd: sega7 = 8'b0100_0110;    // 0x46
                4'he: sega7 = 8'b0010_0001;    // 0x21
                4'hf: sega7 = 8'b0000_0110;    // 0x06*/
                default: sega7 = 7'b100_0000; // 0x40
            endcase                     
        end
        
    //display shi wei
    always @(num_shi)
        begin
            case(num_shi)
                4'h0: segb7 = 7'b100_0000;
                4'h1: segb7 = 7'b111_1001;    // ---a----      0x40
                4'h2: segb7 = 7'b010_0100;    // |      |      0x70
                4'h3: segb7 = 7'b011_0000;    // f     b      0x24
                4'h4: segb7 = 7'b001_1001;    // |      |      0x30
                4'h5: segb7 = 7'b001_0010;    // ---g----      0x19
                4'h6: segb7 = 7'b000_0010;    // |      |     0x12
                4'h7: segb7 = 7'b111_1000;    // e     c      0x02
                4'h8: segb7 = 7'b000_0000;    // |      |     0x78
                4'h9: segb7 = 7'b001_0000;    // ---d----.    0x00
                default: segb7 = 7'b100_0000; // 0x40
            endcase                     
        end
    //display bai wei
    always @(num_bai)
        begin
            case(num_bai)
                4'h0: segc7 = 7'b100_0000;
                4'h1: segc7 = 7'b111_1001;    // ---a----      0x40
                4'h2: segc7 = 7'b010_0100;    // |      |      0x70
                4'h3: segc7 = 7'b011_0000;    // f     b      0x24
                4'h4: segc7 = 7'b001_1001;    // |      |      0x30
                4'h5: segc7 = 7'b001_0010;    // ---g----      0x19
                4'h6: segc7 = 7'b000_0010;    // |      |     0x12
                4'h7: segc7 = 7'b111_1000;    // e     c      0x02
                4'h8: segc7 = 7'b000_0000;    // |      |     0x78
                4'h9: segc7 = 7'b001_0000;    // ---d----.    0x00
                default: segc7 = 7'b100_0000; // 0x40
            endcase                     
        end
    //display qian wei
    always @(num_qian)
        begin
            case(num_qian)
                4'h0: segd7 = 7'b100_0000;
                4'h1: segd7 = 7'b111_1001;    // ---a----      0x40
                4'h2: segd7 = 7'b010_0100;    // |      |      0x70
                4'h3: segd7 = 7'b011_0000;    // f     b      0x24
                4'h4: segd7 = 7'b001_1001;    // |      |      0x30
                4'h5: segd7 = 7'b001_0010;    // ---g----      0x19
                4'h6: segd7 = 7'b000_0010;    // |      |     0x12
                4'h7: segd7 = 7'b111_1000;    // e     c      0x02
                4'h8: segd7 = 7'b000_0000;    // |      |     0x78
                4'h9: segd7 = 7'b001_0000;    // ---d----.    0x00
                default: segd7 = 7'b100_0000; // 0x40
            endcase                     
        end
endmodule

有一点要注意的就是,几个always语句是并行执行的,和C语言有区别,当然这个代码也只是个Demo板,还有待于优化和模块化管理,硬件运行的环境是DE0开发板,如代码的开头处所说,软件环境是Quartus II web-edition 8.1,呵呵虽说是网络版,但是还是可以用滴!不过在引脚分配的时候,有点不一样,于是我用了Tcl脚本来实现之:

set_location_assignment PIN_E11 -to sega7[0]
set_location_assignment PIN_F11 -to sega7[1]
set_location_assignment PIN_H12 -to sega7[2]
set_location_assignment PIN_H13 -to sega7[3]
set_location_assignment PIN_G12 -to sega7[4]
set_location_assignment PIN_F12 -to sega7[5]
set_location_assignment PIN_F13 -to sega7[6]
#set_location_assignment PIN_D13 -to sega7[7]

set_location_assignment PIN_A13 -to segb7[0]
set_location_assignment PIN_B13 -to segb7[1]
set_location_assignment PIN_C13 -to segb7[2]
set_location_assignment PIN_A14 -to segb7[3]
set_location_assignment PIN_B14 -to segb7[4]
set_location_assignment PIN_E14 -to segb7[5]
set_location_assignment PIN_A15 -to segb7[6]
#set_location_assignment PIN_B15 -to segb7[7]

set_location_assignment PIN_D15 -to segc7[0]
set_location_assignment PIN_A16 -to segc7[1]
set_location_assignment PIN_B16 -to segc7[2]
set_location_assignment PIN_E15 -to segc7[3]
set_location_assignment PIN_A17 -to segc7[4]
set_location_assignment PIN_B17 -to segc7[5]
set_location_assignment PIN_F14 -to segc7[6]
#set_location_assignment PIN_A18 -to segc7[7]

set_location_assignment PIN_B18 -to segd7[0]
set_location_assignment PIN_F15 -to segd7[1]
set_location_assignment PIN_A19 -to segd7[2]
set_location_assignment PIN_B19 -to segd7[3]
set_location_assignment PIN_C19 -to segd7[4]
set_location_assignment PIN_D19 -to segd7[5]
set_location_assignment PIN_G15 -to segd7[6]
#set_location_assignment PIN_G16 -to segd7[7]

set_location_assignment PIN_G21 -to clk_50

点击进行如下步骤,当前激活为verilog文件:

这样就会产生一个当前verilog文件的针对原理图文件的symbol。

新建一个原理图文件,插入所需的文件,

然后运行Tcl文件,tools->Tcl scripts:

最后下载,结果如下:

哈哈,请各位看官点评哦!

posted @ 2012-06-07 19:35  wdliming  阅读(11709)  评论(1编辑  收藏  举报