FPGA|CPLD|ASICwilliam hill官网
直播中

何蕊

13年用户 9经验值
擅长:数字及可编程逻辑
私信 关注
[问答]

求教一个关于FPGA数码管显示问题,望大家多多帮忙,再次...

最近学习数码管显示的代码编写,出现了一个问题有些绕,望大家细细听我到来;
是这样的小弟有一块学习板,然后呢上面的数码管有八个,很普通的需要先进行位选然后才是段选,
然后我有个代码里面需要完成的是同时选中四个数码管然后在一个状态下让这四个数码管同时工作,但是他们又要显示不一样的数字出来,
想问问这个功能实现起来要如何做,能否简单的写一下:
比如现在我定义了一个reg [7:0] sig;reg[7:0] dig;其中sig信号是用来位选的也就是这儿需要选择前面四个数码管,低电位工作;
然后dig信号用于段选,这儿我们需要让前两个数码管显示0.5,后两个数码管显示1.0;
这儿我想强调一下,主要是显示这样的一个状态是在同一个状态或者说时刻下显示的,希望有大大能帮忙讲解一下,在此谢过啦~

回帖(8)

何蕊

2013-3-1 11:14:46
没大神帮助吗?
举报

何蕊

2013-3-1 14:12:00
现在有八个数码管,我想让前两个数码管显示0.5,最后两个数码管显示3.0,而且是在同一个时候哦,而且这个是在很多状态下的一个状态这样显示,就是我外面写了一个状态机的,下一个状态又让前两个数码管显示1.0,最后两个数码管显示0.5,所以现在这个地方卡住了没有办法继续了,就想请问一下这个要如何编写代码实现
举报

何蕊

2013-3-4 10:25:09
代码根据动态显示的方式写了一下,麻烦给看一下,谢谢啦~
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
举报

xmcao

2013-3-4 10:40:14
举报

何蕊

2013-3-4 15:30:00
居然还是没人懂?不要啊~~~~给位大虾花点儿时间给个提示啊~~~~
举报

何蕊

2013-3-5 10:20:38
还是没人给个回应?
举报

h1654155747.3209

2013-3-6 12:43:29
首先,你要多花点时间搞懂什么是数码管的动态显示和静态显示。而你需要的是动态显示。给你打个比方,台下有八个评委,从左到右依次举牌,依次举得是ABCDEFGH,但是,你一次只看到了一个评委举牌,因为那是他们举牌的时间间隔大。如果让每个评委依次以20ms的间隔举牌,你的眼睛就会反映不过来,看到的就是全部都在举牌。。。懂了吧

而你要显示的内容就事先“分发”给各个评委,等你下达指令再举牌,这下清楚了吧。。。

回帖第一次打这么多字、
举报

hchwwlhm

2013-3-9 10:21:38
举报

更多回帖

发帖
×
20
完善资料,
赚取积分