<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        LED陣列之FPGA顯示

        作者:kb129   來源:kb129   點擊數:  更新時間:2014年06月08日   【字體:
           LED陣列已經普遍使用在我們生活中,出去逛逛隨處可見。不太清楚業內是使用什么來控制顯示的,估計用單片機,畢竟便宜多了。作為一個搞電子的,一定要了解LED陣列顯示。我的理解:LED陣列顯示主要有兩種:靜態顯示,滾動顯示。

        一:靜態顯示    

          LED陣列顯示有些類似于數碼管顯示,都是掃描顯示。這里略講講原理:在我們看到的LED陣列顯示一個畫面或是一行字,其實在硬件顯示的時候,應該是一行一行或是一列一列來顯示。例如8*8led陣列,在我使用過程中,顯示方式是一列一列的顯示,也就是先點亮第一列led,其他列都不亮,然后點亮第二列led,其他列都不亮,依次到第八列,然后又回來點亮第一列,以此循環。這樣就能實現led陣列的靜態顯示。

        二:左移或右移顯示   

              led滾動顯示是一個不容易理解的顯示方式。實際使用中,可以看到,led陣列都是一行字緩慢的向左或是向右移動。

              顯示方法:一列一列顯示。(如果是上下移動,則選擇一行一行顯示)

        思考的方向:單獨考慮每一列數值的改變,先考慮第一列在滾動顯示過程中數值有哪些。

        舉例說明:


        就像上圖我們要滾動顯示一個字母T,從最上面圖1一直右移到最后一個圖,然后又回到了圖1,這就是典型的滾動循環顯示。
        按照上面的思考方法來做,假定最左邊為第一列,最右邊為第八列。首先考慮在滾動顯示中第一列的數據變化:

            8'h00,  8'h00,  8'h00,  8'h40,  8'h40,  8'h7e,  8'h40,  8'h40

        第二列數據變化:

            8'h40,   8'h00, 8'h00,  8'h00,  8'h40,  8'h40,  8'h7e,  8'h40

        對比第一列數據和第二列數據,會發現第一列第一張圖的數據8'h00,是第二列第二張圖的數據8'h00.


        由此可知:對于右移滾動循環顯示,所有列的數據都是同樣的,也就是,如果把列出現的所有數據存在一個數組或是庫里面,所有列的數據都可以在該數組或是庫取。這就誕生了網上很多字模軟件,我們只要知道第一張圖上面所有列的數據,然后存在一個數組里面,顯示的時候只需要每一列取不同的值即可。

        具體代碼沒有保存,故不貼出來。

        三:最外圍順時針滾動顯示

              之所以特別說說這個顯示,是因為上周末,和朋友逛校園。走到體育館,她指著體育館門口的led,跟我講,最外圍的那一圈一直在順時針旋轉怎么做到的。當時覺得很少見,琢磨難道是橫著的設置為左右移動,豎著的設置為上下移動。接著就想,那么怎么在同一個顯示中,既使用上下移動模式,又使用左右移動模式,想了很久。昨晚自己在紙上亂畫了一下,發現方法還是和上面一樣。


        其實在旋轉過程中,每一列的數據還是周期發生變化,

        拿第一列(最左邊一列)舉例:變化的值為:8'h99, 8'h33,8'h66,8'hCC.這樣就可以將問題轉換到第二種顯示,所以在led陣列顯示中,如果是一列一列的顯示,需要著重考慮每一列的數據的變化;如果是一行一行的顯示,需要著重考慮的是每一行的數據變化。

        verilog代碼為:(其中中行為1,列為0則led亮)

        //pro : 8*8 led show
        //data: 2014-04-23 qs336
        //info: this is a pro exe that play the show of 8*8 led
        module led88(
            input                     clk,
            output     reg [7:0] R,   //this is row
            output     reg [7:0] L
        );
        integer cnt1,cnt2,cnt3;
        reg clk_lk,clk_h;
        reg [2:0] p;
        reg [1:0] i;
        reg [7:0] char0[3:0];
        reg [7:0] char1[3:0];
        reg [7:0] char2[3:0];
        reg [7:0] char3[3:0];
        reg [7:0] char4[3:0];
        reg [7:0] char5[3:0];
        reg [7:0] char6[3:0];
        reg [7:0] char7[3:0];

        always@(posedge clk )
        begin
              char0[0] <= 8'b1001_1001; char0[1] <= 8'b0011_0011; char0[2] <= 8'b0110_0110; char0[3]<= 8'b1100_1100;
              char1[0] <= 8'b1000_0001; char1[1] <= 8'b1000_0000; char1[2] <= 8'b0000_0000; char1[3] <= 8'b0000_0001;
              char2[0] <= 8'b0000_0000; char2[1] <= 8'b1000_0000; char2[2] <= 8'b1000_0001; char2[3] <= 8'b0000_0001;
              char3[0] <= 8'b0000_0000; char3[1] <= 8'b0000_0001; char3[2] <= 8'b1000_0001; char3[3] <= 8'b1000_0000;
              char4[0] <= 8'b1000_0001; char4[1] <= 8'b0000_0001; char4[2] <= 8'b0000_0000; char4[3] <= 8'b1000_0000;
              char5[0] <= 8'b1000_0001; char5[1] <= 8'b1000_0000; char5[2] <= 8'b0000_0000; char5[3] <= 8'b0000_0001;
              char6[0] <= 8'b0000_0000; char6[1] <= 8'b1000_0000; char6[2] <= 8'b1000_0001; char6[3] <= 8'b0000_0001;
              char7[0] <= 8'b0110_0110; char7[1] <= 8'b0011_0011; char7[2] <= 8'b1001_1001; char7[3] <= 8'b1100_1100;
         if(cnt1==8'd124)
               begin
                         cnt1 <= 0;
                         if(cnt2==8'd199)
                         begin
                               clk_lk <= ~clk_lk;
                               cnt2 <= 0;
                         end
                        else cnt2 <= cnt2+1;
               end
         else cnt1 <= cnt1+1;
        end

        always@(posedge clk_lk)
        begin
                 if(cnt3==8'd70)
                 begin
                      cnt3   <= 0;
                      clk_h  <= ~clk_h;
                 end
                 else  cnt3 <= cnt3+1;
                 if(p==3'b111) p <= 0;
                 else                p <= p+1;

        end
        always@(p)
        case(p)
            3'b000:begin    
                            L <= 8'b1111_1110;
                            R[7:0] <= char0[i];
                       end
            3'b001:begin    
                            L <= 8'b1111_1101;
                            R[7:0] <= char1[i];  
                       end  
            3'b010:begin    
                            L <= 8'b1111_1011;
                            R[7:0] <= char2[i];  
                      end 
            3'b011:begin    
                            L <= 8'b1111_0111;
                            R[7:0] <= char3[i];   
                      end 
            3'b100:begin    
                            L <= 8'b1110_1111;
                            R[7:0] <= char4[i];   
                       end 
            3'b101:begin    
                             L <= 8'b1101_1111;
                             R[7:0] <= char5[i];   
                      end    
             3'b110:begin    
                             L <= 8'b1011_1111;
                             R[7:0] <= char6[i];   
                        end    
              3'b111:begin    
                             L <= 8'b0111_1111;
                             R[7:0] <= char7[i];  
                         end      
        endcase

        always@(posedge clk_h)
        begin
                i <= i+1;

        end

        endmodule
        其實led陣列顯示有很多種方法,上面介紹的是一個很容易理解的方法,可以以此為基本來靈活改變顯示方法。

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮