⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bin_bcd_2.v

📁 基于Verilog-HDL的硬件电路的实现 9.2 具有LCD显示单元的可编程单脉冲发生器   9.2.1 LCD显示单元的工作原理   9.2.2 显示逻辑设计的思路与流程   9.
💻 V
字号:

/* 输入0-99999, 用BCD码显示 */

module  BIN_BCD_2  (CLK, A, BW, BQ, BB, BS, BG);
    input     CLK;
    input     [16:0] A;                      // 输入0-99999
    output    [3:0] BW, BQ, BB, BS, BG; 
    reg       [3:0] BW, BQ, BB, BS, BG; 
    reg       [13:0] MQ;                     // MQ表示具有千位的数
    reg       [9:0] MB;                         // MB表示具有百位的数
    reg       [7:0] MS;                         // MS表示具有十位的数


/********************判断0-99, 并运算得出个位和十位********************/

    task INB;                   // 100之内数的处理
      input   [7:0] MS;
      output  [3:0] BS, BG;
        
      begin
           if (MS<8'd10)              // 0<MS<10, 个位BG=MS, 十位BS=0
              begin
                BS=4'd0;
                BG=MS;
              end
            else if (MS<8'd20)        // 10<MS<20, 个位BG=MS-10, 十位BS=1
              begin
                BS=4'd1;
                BG=MS-8'd10;          
              end
            else if (MS<8'd30)        // 20<MS<30, 个位BG=MS-20, 十位=2
              begin
                BS=4'd2;
                BG=MS-8'd20;     
              end
            else if (MS<8'd40)        // 30<MS<40, 个位BG=MS-30, 十位BS=3
              begin
                BS=4'd3;
                BG=MS-8'd30;        
              end
            else if (MS<8'd50)        // 40<MS<50, 个位BG=MS-40, 十位BS=4
              begin
                BS=4'd4;
                BG=MS-8'd40;      
              end
            else if (MS<8'd60)        // 50<MS<60, 个位BG=MS-50, 十位BS=5
              begin
                BS=4'd5;
                BG=MS-8'd50;      
              end
            else if (MS<8'd70)        // 60<MS<70, 个位BG=MS-60, 十位BS=6
              begin
                BS=4'd6;
                BG=MS-8'd60;      
              end
            else if (MS<8'd80)        // 70<MS<80, 个位BG=MS-70, 十位BS=7
              begin
                BS=4'd7;
                BG=MS-8'd70;       
              end
            else if (MS<8'd90)        // 80<MS<90, 个位BG=MS-80, 十位BS=8
              begin
                BS=4'd8;
                BG=MS-8'd80;       
              end
            else                       // 90<MS<100, 个位BG=MS-90, 十位BS=9
              begin
                BS=4'd9;
                BG=MS-8'd90;       
              end
      end
    endtask


/********************判断0-999, 并运算得出百位******************************/

    task INQ;                      // 1000之内数的处理
      input   [9:0] MB;
      output  [3:0] BB, BS, BG;

      begin
        if ( MB<10'd100 )              // 0<MB<100, 百位BB=0, MS=MB-0, 0<MS<99
          begin
            BB=4'd0; 
            MS=MB-10'd0; 
            INB (MS, BS, BG);
          end
        else  if (MB<10'd200 )         // 100<MB<200, 百位BB=1, MS=MB-100, 0<MS<99
          begin
            BB=4'd1;
            MS=MB-10'd100;                      
            INB (MS, BS, BG);
          end
        else  if (MB<10'd300 )         // 200<MB<300, 百位BB=2, MS=MB-200, 0<MS<99
          begin
            BB=4'd2;
            MS=MB-10'd200;                      
            INB (MS, BS, BG);
          end
        else  if (MB<10'd400 )         // 300<MB<400, 百位BB=3, MS=MB-300, 0<MS<99
          begin
            BB=4'd3;
            MS=MB-10'd300;                      
            INB (MS, BS, BG);
          end
        else  if (MB<10'd500 )         // 400<MB<500, 百位BB=4, MS=MB-400, 0<MS<99
          begin
            BB=4'd4;
            MS=MB-10'd400;                      
            INB (MS, BS, BG);
          end
        else  if (MB<10'd600 )        // 500<MB<600, 百位BB=5, MS=MB-500, 0<MS<99
          begin
            BB=4'd5;
            MS=MB-10'd500;                      
            INB (MS, BS, BG);
          end
        else  if (MB<10'd700 )        // 600<MB<700, 百位BB=6, MS=MB-600, 0<MS<99
          begin
            BB=4'd6;
            MS=MB-10'd600;                      
            INB (MS, BS, BG);
          end
        else  if (MB<10'd800 )        // 700<MB<800, 百位BB=7, MS=MB-700, 0<MS<99
          begin
            BB=4'd7;
            MS=MB-10'd700;                      
            INB (MS, BS, BG);
          end
        else  if (MB<10'd900 )        // 800<MB<900, 百位BB=8, MS=MB-800, 0<MS<99
          begin
            BB=4'd8;
            MS=MB-10'd800;                      
            INB (MS, BS, BG);
          end
        else                          // 900<MB<1000, 百位BB=9, MS=MB-900, 0<MS<99
          begin
            BB=4'd9;
            MS=MB-10'd900;                      
            INB (MS, BS, BG);
          end
      end
    endtask


/********************判断0-9999, 并运算得出千位******************************/


    task INW;                         // 10000之内数的处理
      input   [13:0] MQ;
      output  [3:0] BQ, BB, BS, BG;

      begin
        if (MQ<14'd1000 )             // 0<MQ<1000, 千位BQ=0, MB=MQ-0, 0<MB<999
          begin
            BQ=4'd0;
            MB=MQ-14'd0;
            INQ (MB, BB, BS, BG);
          end
        else if (MQ<14'd2000 )        // 1000<MQ<2000, 千位BQ=1, MB=MQ-1000, 0<MB<999
          begin
            BQ=4'd1;
            MB=MQ-14'd1000;
            INQ (MB, BB, BS, BG);
          end
        else if (MQ<14'd3000 )        // 2000<MQ<3000, 千位BQ=2, MB=MQ-2000, 0<MB<999
          begin
            BQ=4'd2;
            MB=MQ-14'd2000;
            INQ (MB, BB, BS, BG);
          end
        else if (MQ<14'd4000 )        // 3000<MQ<4000, 千位BQ=3, MB=MQ-3000, 0<MB<999
          begin
            BQ=4'd3;
            MB=MQ-14'd3000;
            INQ (MB, BB, BS, BG);
          end
        else if (MQ<14'd5000 )        // 4000<MQ<5000, 千位BQ=4, MB=MQ-4000, 0<MB<999
          begin
            BQ=4'd4;
            MB=MQ-14'd4000;
            INQ (MB, BB, BS, BG);
          end
        else if (MQ<14'd6000 )        // 5000<MQ<6000, 千位BQ=5, MB=MQ-5000, 0<MB<999
          begin
            BQ=4'd5;
            MB=MQ-14'd5000;
            INQ (MB, BB, BS, BG);
          end
        else if (MQ<14'd7000 )        // 6000<MQ<7000, 千位BQ=6, MB=MQ-6000, 0<MB<999
          begin
            BQ=4'd6;
            MB=MQ-14'd6000;
            INQ (MB, BB, BS, BG);
          end
        else if (MQ<14'd8000 )        // 7000<MQ<8000, 千位BQ=7, MB=MQ-7000, 0<MB<999
          begin
            BQ=4'd7;
            MB=MQ-14'd7000;
            INQ (MB, BB, BS, BG);
          end
        else if (MQ<14'd9000 )        // 8000<MQ<9000, 千位BQ=8, MB=MQ-8000, 0<MB<999
          begin
            BQ=4'd8;
            MB=MQ-14'd8000;
            INQ (MB, BB, BS, BG);
          end
        else                         // 9000<MQ<10000, 千位BQ=9, MB=MQ-9000, 0<MB<999
          begin
            BQ=4'd9;
            MB=MQ-14'd9000;
            INQ (MB, BB, BS, BG);
          end
      end
    endtask


/********************判断0-99999, 并运算得出万位******************************/

    always @ (posedge CLK)
      begin
        if (A<17'd10000 )             // 0<A<10000, 万位BW=0, MQ=A-0, 0<MQ<9999
          begin
            BW=4'd0;
            MQ=A-17'd0;
            INW (MQ, BQ, BB, BS, BG);
          end
        else if (A<17'd20000 )        // 10000<A<20000, 万位BW=1, MQ=A-10000, 0<MQ<9999
          begin
            BW=4'd1;
            MQ=A-17'd10000;
            INW (MQ, BQ, BB, BS, BG);
          end
        else if (A<17'd30000 )        // 20000<A<30000, 万位BW=2, MQ=A-20000, 0<MQ<9999
          begin
            BW=4'd2;
            MQ=A-17'd20000;
            INW (MQ, BQ, BB, BS, BG);
          end
        else if (A<17'd40000 )        // 30000<A<40000, 万位BW=3, MQ=A-30000, 0<MQ<9999
          begin
            BW=4'd3;
            MQ=A-17'd30000;
            INW (MQ, BQ, BB, BS, BG);
          end
        else if (A<17'd50000 )        // 40000<A<50000, 万位BW=4, MQ=A-40000, 0<MQ<9999
          begin
            BW=4'd4;
            MQ=A-17'd40000;
            INW (MQ, BQ, BB, BS, BG);
          end
        else if (A<17'd60000 )        // 50000<A<60000, 万位BW=5, MQ=A-50000, 0<MQ<9999
          begin
            BW=4'd5;
            MQ=A-17'd50000;
            INW (MQ, BQ, BB, BS, BG);
          end
        else if (A<17'd70000 )        // 60000<A<70000, 万位BW=6, MQ=A-60000, 0<MQ<9999
          begin
            BW=4'd6;
            MQ=A-17'd60000;
            INW (MQ, BQ, BB, BS, BG);
          end
        else if (A<17'd80000 )        // 70000<A<80000, 万位BW=7, MQ=A-70000, 0<MQ<9999
          begin
            BW=4'd7;
            MQ=A-17'd70000;
            INW (MQ, BQ, BB, BS, BG);
          end
        else if (A<17'd90000 )        // 80000<A<90000, 万位BW=8, MQ=A-80000, 0<MQ<9999
          begin
            BW=4'd8;
            MQ=A-17'd80000;
            INW (MQ, BQ, BB, BS, BG);
          end
        else                           // 90000<A<100000, 万位BW=9, MQ=A-90000, 0<MQ<9999
          begin
            BW=4'd9;
            MQ=A-17'd90000;
            INW (MQ, BQ, BB, BS, BG);
          end
      end
        
endmodule
               



      
 
  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -