OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4296|回复: 1

[XILINX] 六位数码管动态显示,为什么仿真有不定值

[复制链接]

3

主题

6

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2019-4-27
在线时间
9 小时
发表于 2023-1-20 17:06:21 | 显示全部楼层 |阅读模式
各位大神:
      在做六位数码管动态显示时,有如下问题。
      数码显示的源码如下:

     module smg(
    input sys_clk,          //输入时钟
         input rst_n,            //复位信号,进行同步复位
         input [16:0] timedata,  //时间数值,程序里暂未使用
         output reg [5:0] smg_wei, //数码管的位选端
         output reg [7:0] smg_data //数码管的段选端
    );


parameter       MS_1 = 100;        //动态扫描时间间隔参数定义
parameter       ZERO    =8'b0011_1111, //段码
                ONE     =8'b0000_0110,
                TWO     =8'b0101_1011,
                THREE   =8'b0100_1111,
                FOUR    =8'b0110_0110,
                FIVE    =8'b0110_1101,
                SIX     =8'b0111_1101,
                SEVEN   =8'b0000_0111,
                EIGHT   =8'b0111_1111,
                NINE    =8'b0110_1111,
                TEN     =8'b0111_0111,
                ELEVEN  =8'b0111_1100,
                TWELVE  =8'b0011_1001,
                THIRTEEN=8'b0101_1110,
                FOURTEEN=8'b0111_1001,
                FIFTEEN =8'b0111_0001;
                                         

               reg [19:0] sys_smg_count=0;    //系统时钟计数器
               reg [2:0]  scan_count = 0;     //扫描计数,需要扫描六位数码管
               reg        show_char_flag=1;   //一维寄存器组,赋值标志,0 赋值阿拉伯数字,1赋值英文字母
               reg [7:0]  smg_show_data[5:0]; //一维寄存器

always @(posedge sys_clk)      //寄存器组赋值
   begin
            if(show_char_flag == 0)
                    begin
                           smg_show_data[5] <= ZERO;
                                smg_show_data[4] <= ONE;
                           smg_show_data[3] <= TWO;
                                smg_show_data[2] <= THREE;
                                smg_show_data[1] <= FOUR;
                                smg_show_data[0] <= FIVE;
                         end
                 else
          begin
            smg_show_data[5] <= TEN;
                                smg_show_data[4] <= ELEVEN;
                           smg_show_data[3] <= TWELVE;
                                smg_show_data[2] <= THIRTEEN;
                                smg_show_data[1] <= FOURTEEN;
                                smg_show_data[0] <= FIFTEEN;
          end                         
       
        end
       
//送数显示        
always @(posedge sys_clk)
    begin
             if(rst_n == 1'b0)  //复位时,位选赋值,高电平,对应位的数码管工作
                    begin
                          smg_wei <= 6'b000001;
                         end
                  else
          begin                  
                          sys_smg_count <= sys_smg_count + 1;   //时钟计数
                          if(sys_smg_count == MS_1)             //到达位选计时,要位选移位,并发送对应的段选数据
                                 begin
                                          smg_wei <= smg_wei << 1;        //位选移位
                                          smg_data <= smg_show_data[scan_count+1];        //送对应的段选数据
                                          scan_count <= scan_count + 1;        //扫描计数加一
                                          if(scan_count == 7)           //7才可以六位数码管正常显示,6或5都不可以正常显示
                                                  begin                                 
                                                        scan_count <= 0;         //扫描变量清零
                                                        smg_wei <= 6'b000001;    //位选重新置位
                                                  end       
                                                       
                                         sys_smg_count <= 0;        //位选计时清零
                         end
                  end         
    end         
endmodule

为什么判定 scan_count == 7 时,才可以正常显示ABCDEF

仿真代码如下:

module smg_tb;

        // Inputs
        reg sys_clk;
        reg rst_n;
        reg [16:0] timedata;
        reg show_char_flag=1;
       
       

        // Outputs
        wire [5:0] smg_wei;
        wire [7:0] smg_data;

        // Instantiate the Unit Under Test (UUT)
        smg uut (
                .sys_clk(sys_clk),
                .rst_n(rst_n),
                .timedata(timedata),
                .smg_wei(smg_wei),
                .smg_data(smg_data)
        );

        initial begin
                // Initialize Inputs
                sys_clk = 0;
                rst_n = 0;
                timedata = 0;

                // Wait 100 ns for global reset to finish
                #100;
      rst_n = 1;  
                // Add stimulus here

        end

always #10 sys_clk = ~sys_clk;

endmodule


在仿真波形时,发现smg_data存在不定值的状态,不知道什么原因
wave.png

感谢指教!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

1979

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5520
金钱
5520
注册时间
2018-10-21
在线时间
1561 小时
发表于 2023-1-30 11:22:04 | 显示全部楼层
scan_count的变化范围是0~7,所以smg_show_data[scan_count+1]的值是smg_show_data[1]~[8],但是你程序里只对smg_show_data[0]~[5]赋了初始值,所以smg_show_data[6]~[8]的初始值是不定态X
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-10-4 04:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表