找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5145|回復(fù): 0
收起左側(cè)

數(shù)碼管的動(dòng)態(tài)刷新Verilog源程序

[復(fù)制鏈接]
ID:546381 發(fā)表于 2019-5-28 17:15 | 顯示全部樓層 |閱讀模式
六位八段數(shù)碼管,最后兩位自加首先循環(huán),同時(shí)在到特定的數(shù)字調(diào)用蜂鳴器“嗶~”
0.png

源程序如下:
  1. module Project_Segled2
  2. (        
  3.         //輸入端口
  4.         CLK_50M,CLK_1S,RST_N,
  5.         //輸出端口
  6.         SEG_DATA,SEG_EN,FM
  7. );
  8.         
  9. //---------------------------------------------------------------------------
  10. //--        外部端口聲明
  11. //---------------------------------------------------------------------------
  12. input                                         CLK_50M;                                //時(shí)鐘的端口,開發(fā)板用的50M晶振
  13. input                CLK_1S;
  14. input                                                RST_N;                                //復(fù)位的端口,低電平復(fù)位
  15. output reg         [ 5:0]         SEG_EN;                                //數(shù)碼管使能端口
  16. output reg         [ 7:0]         SEG_DATA;                        //數(shù)碼管數(shù)據(jù)端口(查看管腳分配文檔或者原理圖)
  17. output reg          FM;               //控制蜂鳴器

  18. //---------------------------------------------------------------------------
  19. //--        內(nèi)部端口聲明
  20. //---------------------------------------------------------------------------
  21. reg                        [15:0]        time_cnt;                        //用來(lái)控制數(shù)碼管閃爍頻率的定時(shí)計(jì)數(shù)器
  22. reg                        [15:0]        time_cnt_n;                        //time_cnt的下一個(gè)狀態(tài)
  23. reg                        [ 2:0]        led_cnt;                                //用來(lái)控制數(shù)碼管亮滅及顯示數(shù)據(jù)的顯示計(jì)數(shù)器
  24. reg                        [ 2:0]        led_cnt_n;                        //led_cnt的下一個(gè)狀態(tài)
  25. reg                                           [3:0]         gewei;                                       // 后兩位的個(gè)位
  26. reg                                           [3:0]         shiwei;                                      //后兩位的十位
  27. reg                                           [7:0]         GE_DATA;                                //個(gè)位數(shù)碼管數(shù)據(jù)
  28. reg                                           [7:0]         SHI_DATA;                                //十位數(shù)碼管數(shù)據(jù)
  29. reg                                           [3:0]         gewei_n;                                       // 后兩位的個(gè)位  
  30. reg                                        beep_reg;                                //用來(lái)控制蜂鳴器發(fā)聲的寄存器
  31. reg                                        beep_reg_n;                                //beep_reg的下一個(gè)狀態(tài)

  32. //設(shè)置定時(shí)器的時(shí)間為1ms,計(jì)算方法為  (1*10^3)us / (1/50)us  50MHz為開發(fā)板晶振
  33. parameter SET_TIME_1MS = 16'd50_000;
  34. parameter freq = 16'd47774;
  35. initial
  36. begin
  37. gewei = 4'h5;                                                                          //初始化個(gè)位十位的值
  38. shiwei=4'h0;
  39. gewei_n=4'h5;
  40. end               

  41. //---------------------------------------------------------------------------
  42. //--        邏輯功能實(shí)現(xiàn)        
  43. //---------------------------------------------------------------------------
  44. //時(shí)序電路,用來(lái)給time_cnt寄存器賦值
  45. always @ (posedge CLK_50M or negedge RST_N)  
  46. begin
  47.         if(!RST_N)                                                                        //判斷復(fù)位
  48.                 time_cnt <= 16'h0;                                        //初始化time_cnt值
  49.         else
  50.                 time_cnt <= time_cnt_n;                                //用來(lái)給time_cnt賦值
  51. end


  52. always @ (posedge CLK_50M)  
  53. begin
  54.         if(time_cnt == SET_TIME_1MS)                        //判斷1ms時(shí)間
  55.                 time_cnt_n = 16'h0;                                        //如果到達(dá)1ms,定時(shí)計(jì)數(shù)器將會(huì)被清零
  56.         else
  57.                 time_cnt_n = time_cnt + 27'h1;        //如果未到1ms,定時(shí)計(jì)數(shù)器將會(huì)繼續(xù)累加
  58. end





  59. //時(shí)序電路,用來(lái)給led_cnt寄存器賦值
  60. always @ (posedge CLK_1S or negedge RST_N)  
  61. begin
  62.         if(!RST_N )                                                                        //判斷復(fù)位
  63. begin        
  64.                     gewei = 4'h5;                                                                          //初始化個(gè)位十位的值
  65.                 shiwei=4'h0;
  66. end        
  67.         else if(gewei==4'b1001)
  68. begin                 
  69.                 gewei=4'h0;
  70.                 shiwei=shiwei+1'h1;                                                           //如果個(gè)位到十就歸0且讓十位加一
  71. end
  72.    else if(shiwei==4'b0100)
  73. begin               
  74.                  shiwei=4'h0;                                                                        //判斷十位的值如果到4就歸0
  75. end
  76.    else
  77.        gewei=gewei_n;        
  78. end
  79. //組合電路,判斷時(shí)間,實(shí)現(xiàn)控制顯示計(jì)數(shù)器累加
  80. always @ (negedge CLK_1S)  
  81. begin

  82.                 gewei_n = gewei + 1'h1;                //如果到達(dá)1s,計(jì)數(shù)器進(jìn)行累加
  83.         
  84.               
  85. end


  86. //時(shí)序電路,用來(lái)給gewei寄存器賦值
  87. always @ (posedge CLK_50M or negedge RST_N)  
  88. begin
  89.         if(!RST_N)                                                                        //判斷復(fù)位
  90.                 led_cnt <= 3'h0;                                                //初始化led_cnt值
  91.         else
  92.                 led_cnt <= led_cnt_n;                                //用來(lái)給led_cnt賦值
  93. end

  94. //組合電路,判斷時(shí)間,實(shí)現(xiàn)控制顯示計(jì)數(shù)器累加
  95. always @ (posedge CLK_50M)  
  96. begin
  97.         if(time_cnt == SET_TIME_1MS)                        //判斷1Ms時(shí)間        
  98.                 led_cnt_n = led_cnt + 1'h1;                //如果到達(dá)1ms,計(jì)數(shù)器進(jìn)行累加
  99.         else
  100.                 led_cnt_n = led_cnt;                                        //如果未到1ms,計(jì)數(shù)器保持不變
  101. end
  102. //實(shí)現(xiàn)gewei數(shù)據(jù)到數(shù)碼管碼數(shù)的一致
  103. always @ (posedge CLK_50M)
  104. begin
  105.                case(gewei)
  106.                            4'b0000:GE_DATA= 8'b00111111;        //0
  107.                            4'b0001:GE_DATA= 8'b00000110;        //1
  108.                            4'b0010:GE_DATA= 8'b01011011;        //2
  109.                            4'b0011:GE_DATA= 8'b01001111;        //3
  110.                            4'b0100:GE_DATA= 8'b01100110;        //4
  111.                            4'b0101:GE_DATA= 8'b01101101;        //5
  112.                            4'b0110:GE_DATA= 8'b01111101;        //6
  113.                             4'b0111:GE_DATA= 8'b00000111;       //7
  114.                            4'b1000:GE_DATA= 8'b01111111;        //8
  115.                             4'b1001:GE_DATA= 8'b01101111;       //9
  116.                             default:GE_DATA=8'b10111111;
  117.                endcase
  118. end

  119. //實(shí)現(xiàn)shiwei數(shù)據(jù)到數(shù)碼管數(shù)的一致
  120. always @ (posedge CLK_50M)
  121. begin
  122.                case(shiwei)
  123.                             4'b0000:SHI_DATA= 8'b00111111;        //0
  124.                            4'b0001:SHI_DATA= 8'b00000110;        //1
  125.                            4'b0010:SHI_DATA= 8'b01011011;        //2
  126.                            4'b0011:SHI_DATA= 8'b01001111;        //3
  127.                            4'b0100:SHI_DATA= 8'b01100110;        //4
  128.                            default:SHI_DATA=8'b10111111;
  129.                endcase
  130. end

  131. //組合電路,實(shí)現(xiàn)數(shù)碼管的數(shù)字顯示
  132. always @ (posedge CLK_50M)
  133. begin
  134.         case (led_cnt)  
  135.                 3'b000 : SEG_DATA = 8'b00000111;        //當(dāng)計(jì)數(shù)器為0時(shí),數(shù)碼管將會(huì)顯示 "7"
  136.                 3'b001 : SEG_DATA = 8'b00000110;        //當(dāng)計(jì)數(shù)器為1時(shí),數(shù)碼管將會(huì)顯示 "1"
  137.                 3'b010 : SEG_DATA = 8'b01100110;        //當(dāng)計(jì)數(shù)器為2時(shí),數(shù)碼管將會(huì)顯示 "4"
  138.                 3'b011 : SEG_DATA = 8'b00111111;        //當(dāng)計(jì)數(shù)器為3時(shí),數(shù)碼管將會(huì)顯示 "0"
  139.                 3'b100 : SEG_DATA = SHI_DATA;                       //當(dāng)計(jì)數(shù)器為4時(shí),數(shù)碼管將會(huì)顯示 "十位"
  140.                 3'b101 : SEG_DATA = GE_DATA;                       //當(dāng)計(jì)數(shù)器為5時(shí),數(shù)碼管將會(huì)顯示 "個(gè)位"        
  141.                 default: SEG_DATA = 8'b10111111;        
  142.         endcase         
  143. end






  144. always @ (posedge CLK_50M)
  145. begin
  146.         case (led_cnt)  
  147.                 3'b000 : SEG_EN = 6'b111110;                //當(dāng)計(jì)數(shù)器為0時(shí),數(shù)碼管SEG1顯示
  148.                 3'b001 : SEG_EN = 6'b111101;                //當(dāng)計(jì)數(shù)器為1時(shí),數(shù)碼管SEG2顯示
  149.                 3'b010 : SEG_EN = 6'b111011;                 //當(dāng)計(jì)數(shù)器為2時(shí),數(shù)碼管SEG3顯示
  150.                 3'b011 : SEG_EN = 6'b110111;          //當(dāng)計(jì)數(shù)器為3時(shí),數(shù)碼管SEG4顯示
  151.                 3'b100 : SEG_EN = 6'b101111;                //當(dāng)計(jì)數(shù)器為4時(shí),數(shù)碼管SEG5顯示
  152.                 3'b101 : SEG_EN = 6'b011111;          //當(dāng)計(jì)數(shù)器為5時(shí),數(shù)碼管SEG6顯示               
  153.                 default: SEG_EN = 6'b111111;                        
  154.         endcase         
  155. end









  156. //控制蜂鳴器
  157. always @ (posedge CLK_50M or negedge RST_N)
  158. begin
  159.         if(!RST_N)                                                                        //判斷復(fù)位
  160.                 beep_reg <= 1'b0;                                                //初始化beep_reg值
  161.         else
  162.                 beep_reg <= beep_reg_n;                                //用來(lái)給beep_reg賦值
  163. end

  164. //組合電路,判斷頻率,使蜂鳴器發(fā)聲
  165. always @ (posedge CLK_50M)
  166. begin
  167.         if(time_cnt == freq)                                                //判斷分頻值
  168.                 beep_reg_n = ~beep_reg;                                //改變蜂鳴器的狀態(tài)
  169.         else
  170.                 beep_reg_n = beep_reg;                                //蜂鳴器的狀態(tài)保持不變
  171. end
  172. always @  (posedge CLK_50M)
  173. begin
  174.   if(gewei==4'h5 && shiwei==4'h0)
  175.   FM = beep_reg;
  176. end

  177. endmodule
復(fù)制代碼

所有資料51hei提供下載:
final.zip (3.37 MB, 下載次數(shù): 10)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表