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

2019-07-16 01:53发布

最近学习数码管显示的代码编写,出现了一个问题有些绕,望大家细细听我到来;
是这样的小弟有一块学习板,然后呢上面的数码管有八个,很普通的需要先进行位选然后才是段选,
然后我有个代码里面需要完成的是同时选中四个数码管然后在一个状态下让这四个数码管同时工作,但是他们又要显示不一样的数字出来,
想问问这个功能实现起来要如何做,能否简单的写一下:
比如现在我定义了一个reg [7:0] sig;reg[7:0] dig;其中sig信号是用来位选的也就是这儿需要选择前面四个数码管,低电位工作;
然后dig信号用于段选,这儿我们需要让前两个数码管显示0.5,后两个数码管显示1.0;
这儿我想强调一下,主要是显示这样的一个状态是在同一个状态或者说时刻下显示的,希望有大大能帮忙讲解一下,在此谢过啦~
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
布可取代
1楼-- · 2019-07-16 07:30
没大神帮助吗?
布可取代
2楼-- · 2019-07-16 10:09
现在有八个数码管,我想让前两个数码管显示0.5,最后两个数码管显示3.0,而且是在同一个时候哦,而且这个是在很多状态下的一个状态这样显示,就是我外面写了一个状态机的,下一个状态又让前两个数码管显示1.0,最后两个数码管显示0.5,所以现在这个地方卡住了没有办法继续了,就想请问一下这个要如何编写代码实现
布可取代
3楼-- · 2019-07-16 12:51
代码根据动态显示的方式写了一下,麻烦给看一下,谢谢啦~
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
4楼-- · 2019-07-16 16:26
 精彩回答 2  元偷偷看……
布可取代
5楼-- · 2019-07-16 20:20
居然还是没人懂?不要啊~~~~给位大虾花点儿时间给个提示啊~~~~
布可取代
6楼-- · 2019-07-17 01:23
还是没人给个回应?

一周热门 更多>