打印

verilog四位计数器求解

[复制链接]
3250|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wdliming|  楼主 | 2012-6-7 12:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 wdliming 于 2012-6-7 12:37 编辑

小弟verilog用编译了一个四位计数器0~9999的,可是运行的结果有问题,在每当到9,10,11的时候(即每当进位的时候),数码管的动作如下:
0009-0000-0010-0011,不知道如何解决啊?哪位高手指点一下啊??谢谢
代码:
/*
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 [7:0] sega7;
reg [7:0]   sega7;
output [7:0] segb7;
reg [7:0]   segb7;
output [7:0] segc7;
reg [7:0]   segc7;
output [7:0] segd7;
reg [7: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 <= 8'b0100_0000;
   segb7 <= 8'b0111_1001;
   segc7 <= 8'b0010_0100;
   segd7 <= 8'b0011_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,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
  /*
   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'd10)
    begin
     num_ge <= 4'd0;
     num_shi <= num_shi + 4'd1;
    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 = 8'b0100_0000;
    4'h1: sega7 = 8'b0111_1001;    // ---a----   0x40
    4'h2: sega7 = 8'b0010_0100;    // |      |   0x70
    4'h3: sega7 = 8'b0011_0000;    // f     b      0x24
    4'h4: sega7 = 8'b0001_1001;    // |      |   0x30
    4'h5: sega7 = 8'b0001_0010;    // ---g----   0x19
    4'h6: sega7 = 8'b0000_0010;    // |      |     0x12
    4'h7: sega7 = 8'b0111_1000;    // e     c      0x02
    4'h8: sega7 = 8'b0000_0000;    // |      |     0x78
    4'h9: sega7 = 8'b0001_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 = 8'b0100_0000; // 0x40
   endcase                     
  end
  
//display shi wei
always @(num_shi)
  begin
   case(num_shi)
    4'h0: segb7 = 8'b0100_0000;
    4'h1: segb7 = 8'b0111_1001;    // ---a----   0x40
    4'h2: segb7 = 8'b0010_0100;    // |      |   0x70
    4'h3: segb7 = 8'b0011_0000;    // f     b      0x24
    4'h4: segb7 = 8'b0001_1001;    // |      |   0x30
    4'h5: segb7 = 8'b0001_0010;    // ---g----   0x19
    4'h6: segb7 = 8'b0000_0010;    // |      |     0x12
    4'h7: segb7 = 8'b0111_1000;    // e     c      0x02
    4'h8: segb7 = 8'b0000_0000;    // |      |     0x78
    4'h9: segb7 = 8'b0001_0000;    // ---d----.    0x00
    default: segb7 = 8'b0100_0000; // 0x40
   endcase                     
  end
//display bai wei
always @(num_bai)
  begin
   case(num_bai)
    4'h0: segc7 = 8'b0100_0000;
    4'h1: segc7 = 8'b0111_1001;    // ---a----   0x40
    4'h2: segc7 = 8'b0010_0100;    // |      |   0x70
    4'h3: segc7 = 8'b0011_0000;    // f     b      0x24
    4'h4: segc7 = 8'b0001_1001;    // |      |   0x30
    4'h5: segc7 = 8'b0001_0010;    // ---g----   0x19
    4'h6: segc7 = 8'b0000_0010;    // |      |     0x12
    4'h7: segc7 = 8'b0111_1000;    // e     c      0x02
    4'h8: segc7 = 8'b0000_0000;    // |      |     0x78
    4'h9: segc7 = 8'b0001_0000;    // ---d----.    0x00
    default: segc7 = 8'b0100_0000; // 0x40
   endcase                     
  end
//display qian wei
always @(num_qian)
  begin
   case(num_qian)
    4'h0: segd7 = 8'b0100_0000;
    4'h1: segd7 = 8'b0111_1001;    // ---a----   0x40
    4'h2: segd7 = 8'b0010_0100;    // |      |   0x70
    4'h3: segd7 = 8'b0011_0000;    // f     b      0x24
    4'h4: segd7 = 8'b0001_1001;    // |      |   0x30
    4'h5: segd7 = 8'b0001_0010;    // ---g----   0x19
    4'h6: segd7 = 8'b0000_0010;    // |      |     0x12
    4'h7: segd7 = 8'b0111_1000;    // e     c      0x02
    4'h8: segd7 = 8'b0000_0000;    // |      |     0x78
    4'h9: segd7 = 8'b0001_0000;    // ---d----.    0x00
    default: segd7 = 8'b0100_0000; // 0x40
   endcase                     
  end
endmodule

相关帖子

沙发
Backkom80| | 2012-6-7 13:24 | 只看该作者
计数的范围有错了吧,0-9计数,在9时清零,不是在10时清零,你应该不至在个位进位有错,在十位,百位,进位全都错了吧,
主要原因,不理解时序电路,数电没学好吧,
嘻嘻,

使用特权

评论回复
板凳
GoldSunMonkey| | 2012-6-7 17:52 | 只看该作者
计数的范围有错了吧,0-9计数,在9时清零,不是在10时清零,你应该不至在个位进位有错,在十位,百位,进位全都错了吧,
主要原因,不理解时序电路,数电没学好吧,
嘻嘻, ...
Backkom80 发表于 2012-6-7 13:24
嗯,是呀。黑黑,看看进位的时间。

使用特权

评论回复
地板
wdliming|  楼主 | 2012-6-7 18:53 | 只看该作者
诶呦喂。。谢谢上面两位的指点,有点糊涂了,亮进位都搞糊涂了!!哈哈!

使用特权

评论回复
5
GoldSunMonkey| | 2012-6-8 17:24 | 只看该作者
:lol

使用特权

评论回复
6
hwboy05| | 2012-6-17 19:35 | 只看该作者
always @(posedge clk1hz)
在每个秒脉冲下,个位都应该加一吧,所以个位自加不要放在else里

使用特权

评论回复
7
GoldSunMonkey| | 2012-6-18 11:56 | 只看该作者
:L他问题都解决了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:我的未来不是梦

76

主题

913

帖子

4

粉丝