在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
楼主: Synopsys-IC

[求助] 求教一个关于FPGA数码管显示问题,望大家多多帮忙,再次拜谢啦

[复制链接]
发表于 2013-3-3 22:44:56 | 显示全部楼层
回复 6# Synopsys-IC

我们所见到的同时指示频率快到一定程度,人眼分辨不出来刷新频率而已,这个和电视机或者电脑的显示原理一样,人眼看着同时,其实还是一个像素一个像素填充的。
 楼主| 发表于 2013-3-4 09:38:52 | 显示全部楼层
回复 10# xgdliujie

谢谢前辈的指点,没错,确实这个问题我也考虑了,所以我现在采用的是动态扫描的显示方式来实现数码管的显示,不过现在有个问题是关于时钟频率的,这个频率最好是多少才能实现四个管子在同时工作的时候显示的数据是完整的,我设置的时钟频率是50MHz,但是现在出现的实际效果是只有一个可以工作,很奇怪,还望指点,具体我的实现代码在后面还望前辈多多指教哦~
 楼主| 发表于 2013-3-4 10:01:06 | 显示全部楼层
回复 8# leona1527


    非常感谢leona1527在百忙之中的耐心指导,代码部分我看了一些书,里面有说到用动态显示的方式来实现数码管的显示,然后我按照我的要求也编写了一个,还望大神给指点一下代码如下:

module sell(reset,clk,seg,dig);
  input    reset,clk;
  output[7:0] seg;
  output[7:0] dig;
  
  reg[2:0] D;         //状态
  reg     temp1,temp2;      //引入临时变量主要是为了强调下降沿判断为激励有效信号,是其安全可靠
  reg[7:0] seg_r;         //定义数码管输出寄存器
  reg[7:0] dig_r;       //定义数码管选择输出寄存器
  reg[3:0] disp_dat;      //定义数码管显示数据寄存器  
  reg[1:0] count;       //定义计数寄存器
  
  parameter idle=0,half=1,one=2,two=3,three=4;   // idle,one,half,two,three为中间状态变量
  
  assign dig = dig_r;      //输出数码管选择
  assign seg = seg_r;      //输出数码管译码结果
  
  always@(posedge clk)      //数码管动态扫描显示计数
  begin
  count <= count+1'b1;
  end

  always@(posedge clk or negedge reset)
     begin
        if(!reset)       //下降沿复位信号有效
              begin
                D        <= idle;
                temp1    <= 0;
                temp2    <= 0;
    case(count)   //使八个数码管首位四个数码管显示0.0  0.0
    2'b00 : begin dig_r <= 8'b0111_1111; disp_dat <= 8'h0; end
    2'b01 : begin dig_r <= 8'b1011_1111; disp_dat <= 8'h9; end
    2'b10 : begin dig_r <= 8'b1111_1101; disp_dat <= 8'h0; end
    2'b11 : begin dig_r <= 8'b1111_1110; disp_dat <= 8'h9; end
    endcase   
              end

    case(D)
              idle:            
     if(temp1)
      begin
        case(count)   //使八个数码管首位四个数码管显示0.5  00
        2'b00 : begin dig_r <= 8'b0111_1111; disp_dat <= 8'h0; end
        2'b01 : begin dig_r <= 8'b1011_1111; disp_dat <= 8'h5; end
        2'b10 : begin dig_r <= 8'b1111_1101; disp_dat <= 8'h9; end
        2'b11 : begin dig_r <= 8'b1111_1110; disp_dat <= 8'h9; end
        endcase
        D          <= half;
      end
    else if(temp2)
      begin
        case(count)   //使八个数码管首位四个数码管显示1.0  00
        2'b00 : begin dig_r <= 8'b0111_1111; disp_dat <= 8'h1; end
        2'b01 : begin dig_r <= 8'b1011_1111; disp_dat <= 8'h9; end
        2'b10 : begin dig_r <= 8'b1111_1101; disp_dat <= 8'h9; end
        2'b11 : begin dig_r <= 8'b1111_1110; disp_dat <= 8'h9; end
        endcase
        D    <= one;
      end
              half:      
     if(temp1)
      begin
        case(count)   //使八个数码管首位四个数码管显示1.0  00
        2'b00 : begin dig_r <= 8'b0111_1111; disp_dat <= 8'h1; end
        2'b01 : begin dig_r <= 8'b1011_1111; disp_dat <= 8'h9; end
        2'b10 : begin dig_r <= 8'b1111_1101; disp_dat <= 8'h9; end
        2'b11 : begin dig_r <= 8'b1111_1110; disp_dat <= 8'h9; end
        endcase
        D    <= one;
         end
    else if(temp2)
      begin
        case(count)   //使八个数码管首位四个数码管显示1.5  00
        2'b00 : begin dig_r <= 8'b0111_1111; disp_dat <= 8'h1; end
        2'b01 : begin dig_r <= 8'b1011_1111; disp_dat <= 8'h5; end
        2'b10 : begin dig_r <= 8'b1111_1101; disp_dat <= 8'h9; end
        2'b11 : begin dig_r <= 8'b1111_1110; disp_dat <= 8'h9; end
        endcase
        D    <= two;
      end
              one:      
     if(temp1)
      begin
        case(count)   //使八个数码管首位四个数码管显示1.5  00
        2'b00 : begin dig_r <= 8'b0111_1111; disp_dat <= 8'h1; end
        2'b01 : begin dig_r <= 8'b1011_1111; disp_dat <= 8'h5; end
        2'b10 : begin dig_r <= 8'b1111_1101; disp_dat <= 8'h9; end
        2'b11 : begin dig_r <= 8'b1111_1110; disp_dat <= 8'h9; end
        endcase      
        D    <= two;
      end
     else if(temp2)
      begin
        case(count)   //使八个数码管首位四个数码管显示2.0  00
        2'b00 : begin dig_r <= 8'b0111_1111; disp_dat <= 8'h2; end
        2'b01 : begin dig_r <= 8'b1011_1111; disp_dat <= 8'h9; end
        2'b10 : begin dig_r <= 8'b1111_1101; disp_dat <= 8'h9; end
        2'b11 : begin dig_r <= 8'b1111_1110; disp_dat <= 8'h9; end
        endcase
        D    <= three;
      end
              two:      
     if(temp1)
      begin
        case(count)   //使八个数码管首位四个数码管显示2.0  00
        2'b00 : begin dig_r <= 8'b0111_1111; disp_dat <= 8'h2; end
        2'b01 : begin dig_r <= 8'b1011_1111; disp_dat <= 8'h9; end
        2'b10 : begin dig_r <= 8'b1111_1101; disp_dat <= 8'h9; end
        2'b11 : begin dig_r <= 8'b1111_1110; disp_dat <= 8'h9; end
        endcase
        D    <= three;
      end
    else if(temp2)
     begin      
        case(count)   //使八个数码管首位四个数码管显示2.5  00
        2'b00 : begin dig_r <= 8'b0111_1111; disp_dat <= 8'h2; end
        2'b01 : begin dig_r <= 8'b1011_1111; disp_dat <= 8'h5; end
        2'b10 : begin dig_r <= 8'b1111_1101; disp_dat <= 8'h9; end
        2'b11 : begin dig_r <= 8'b1111_1110; disp_dat <= 8'h9; end
        endcase
        D    <= idle;
    end
              three:      
     if(temp1)
      begin
        D    <= idle;
        case(count)   //使八个数码管首位四个数码管显示2.5  00
        2'b00 : begin dig_r <= 8'b0111_1111; disp_dat <= 8'h2; end
        2'b01 : begin dig_r <= 8'b1011_1111; disp_dat <= 8'h5; end
        2'b10 : begin dig_r <= 8'b1111_1101; disp_dat <= 8'h9; end
        2'b11 : begin dig_r <= 8'b1111_1110; disp_dat <= 8'h9; end
        endcase
      end
     else if({temp2,one_dollar}==2'b10)
       begin
        case(count)   //使八个数码管首位四个数码管显示3.0  0.5
        2'b00 : begin dig_r <= 8'b0111_1111; disp_dat <= 8'h3; end
        2'b01 : begin dig_r <= 8'b1011_1111; disp_dat <= 8'h9; end
        2'b10 : begin dig_r <= 8'b1111_1101; disp_dat <= 8'h0; end
        2'b11 : begin dig_r <= 8'b1111_1110; disp_dat <= 8'h5; end
        endcase
        D    <= idle;
       end

     default:
     begin
      case(count)   //使八个数码管首位四个数码管显示0.0  0.0
      2'b00 : begin dig_r <= 8'b0111_1111; disp_dat <= 8'h0; end
      2'b01 : begin dig_r <= 8'b1011_1111; disp_dat <= 8'h9; end
      2'b10 : begin dig_r <= 8'b1111_1101; disp_dat <= 8'h0; end
      2'b11 : begin dig_r <= 8'b1111_1110; disp_dat <= 8'h9; end
      endcase
      D <= idle;
     end
        endcase
  end

  always@(disp_dat)
begin
  case(disp_dat)     //八段译码  
   4'h0: seg_r = 8'h40;     //显示0.  
   4'h1: seg_r = 8'h79;  //显示1.
   4'h2: seg_r = 8'h24;  //显示2.  
   4'h3:   seg_r = 8'h30;  //显示3.  
   4'h4: seg_r = 8'h12;  //显示5.  
   4'h5: seg_r = 8'h92;      //显示5
   4'h6:   seg_r = 8'hb0;  //显示3
   4'h7:  seg_r = 8'ha4;  //显示2  
   4'h8: seg_r = 8'hf9;  //显示1  
   4'h9: seg_r = 8'hc0;  //显示0
      default: seg_r = 8'hff;  //不做显示  
  endcase
end   
endmodule      



代码里的具体触发条件前辈可以忽略,这里面关键的还是集中在数码管的显示上,望给出一些建议,谢谢
 楼主| 发表于 2013-3-4 10:04:05 | 显示全部楼层
回复 9# matrx


    现在主要是需要知道一个什么频率下会出现人的视觉效应,上面有我写的代码,还望大虾给看看,现在把程序烧在板子上出现了显示只能显示一个的情况
 楼主| 发表于 2013-3-4 10:19:50 | 显示全部楼层
回复 11# changying8866


    麻烦问一下,我后面修改的代码已经上传了,能不能麻烦看一下,现在的问题有个是关于这个代码里的时钟频率的问题,不知道这个频率设置什么大小合适,我板子上的时钟是50MHz
发表于 2013-3-4 13:13:19 | 显示全部楼层
人眼对25Hz以上频率的刷新基本就分不出来闪烁了,考虑人眼的舒适程度,一般显示器有50,60,75Hz等几个刷新频率,所以你的刷新频率选择这几个就可以,具体的实现假如用50Hz的时钟频率,一个2位计数器,0,1,2,3,各选择一个数码管,0的时候输出0数码管要显示的数,1的时候输出1数码管要显示的数,依次类推,就可以了,具体的实现请自行考虑
 楼主| 发表于 2013-3-4 13:51:41 | 显示全部楼层
回复 16# changying8866


    50Hz?这个频率越高是不是效果越好呢?我现在用的时钟CLK是50Mhz的频率,不知道可否满足呢?不知道前辈有没有看一下我前面的代码,你说的方式可能跟我的差不多,也是动态扫描显示这样的方式
 楼主| 发表于 2013-3-5 09:17:37 | 显示全部楼层
看着又要下沉了,立马顶起来,求解放啊~~~~大大们快来看看吧~~这个问题不至于那么难解吧?给信元啊~~~
 楼主| 发表于 2013-3-6 09:12:06 | 显示全部楼层
每天都来顶顶
 楼主| 发表于 2013-3-7 09:22:17 | 显示全部楼层
求解放啊~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

X

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-6-18 13:27 , Processed in 0.022471 second(s), 7 queries , Gzip On, MemCached On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表