久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7907|回復: 4
打印 上一主題 下一主題
收起左側

AD采樣的FPGA程序書寫 Verilog代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:522075 發表于 2019-4-26 11:05 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
提供一段AD采樣的FPGA程序
程序如下

Verilog源程序如下:
  1. //---------------------------------------------------------------------------
  2. //--        文件名                :        Ad_Module.v
  3. //--        作者                :        ZIRCON
  4. //--        描述                :        AD模塊
  5. //---------------------------------------------------------------------------

  6. `define AD_CLK_TIME                        10'd49        //1.1M, 909ns,909 / (1 / 50M) = 45 =0x2D
  7. `define AD_CLK_TIME_HALF        10'd24        //909ns / 2 = 454.5ns 45 / 2 = 22        

  8. module Ad_Module
  9. (        
  10.         //Input
  11.         CLK_50M,RST_N,
  12.         //Output
  13.         AD_CS,AD_CLK,AD_DATA,data_out
  14. );
  15.         
  16. //---------------------------------------------------------------------------
  17. //--        外部端口聲明
  18. //---------------------------------------------------------------------------
  19. input                                        CLK_50M;                                //時鐘的端口,開發板用的50M晶振
  20. input                                        RST_N;                                //復位的端口,低電平復位
  21. input                                        AD_DATA;                                //AD數據端口
  22. output                                AD_CS;                                //AD片選端口
  23. output                                AD_CLK;                                //AD時鐘端口,最大不超過1.1MHz
  24. output        [ 7:0]        data_out;                        //AD模數轉換完成的數據輸出


  25. //---------------------------------------------------------------------------
  26. //--        內部端口聲明
  27. //---------------------------------------------------------------------------
  28. reg                                        AD_CS;                                //AD片選信號端口
  29. reg                                        AD_CS_N;                                //AD_CS的下一個狀態
  30. reg                                        AD_CLK;                                //AD時鐘,最大不超過1.1MHz
  31. reg                                        AD_CLK_N;                        //AD_CLK的下一個狀態

  32. reg                [ 2:0]        ad_fsm_cs;                        //狀態機的當前狀態
  33. reg                [ 2:0]        ad_fsm_ns;                        //狀態機的下一個狀態

  34. reg                [ 5:0]        time_cnt;                        //用于記錄一個時鐘所用時間的定時器
  35. reg                [ 5:0]        time_cnt_n;                        //time_cnt的下一個狀態
  36. reg                [ 5:0]        bit_cnt;                                //用來記錄時鐘周期個數的計數器
  37. reg                [ 5:0]        bit_cnt_n;                        //bit_cnt的下一個狀態

  38. reg                [ 7:0]        data_out;                        //用來保存穩定的AD數據
  39. reg                [ 7:0]        data_out_n;                        //data_out的下一個狀態
  40. reg                [ 7:0]        ad_data_reg;                //用于保存數據的移位寄存器
  41. reg                [ 7:0]        ad_data_reg_n;                //ad_data_reg_n的下一個狀態

  42. parameter        FSM_IDLE                        = 3'h0;        //狀態機的初始狀態;
  43. parameter        FSM_READY                = 3'h1;        //滿足CS有效時的第一個1.4us的延時狀態
  44. parameter        FSM_DATA                        = 3'h2;        //讀取8個數據狀態
  45. parameter        FSM_WAIT_CONV        = 3'h3;        //等待轉換狀態,等待17us;
  46. parameter        FSM_END                        = 3'h4;        //結束的狀態

  47. //---------------------------------------------------------------------------
  48. //--        邏輯功能實現        
  49. //---------------------------------------------------------------------------
  50. //時序電路,用來給ad_fsm_cs寄存器賦值
  51. always @ (posedge CLK_50M or negedge RST_N)
  52. begin
  53.         if(!RST_N)                                                                //判斷復位
  54.                 ad_fsm_cs <= 1'b0;                                //初始化ad_fsm_cs值
  55.         else
  56.                 ad_fsm_cs <= ad_fsm_ns;                        //用來給ad_fsm_ns賦值
  57. end

  58. //組合電路,用來實現狀態機
  59. always @ (*)
  60. begin
  61.         case(ad_fsm_cs)                                                //判斷狀態機的當前狀態
  62.                 FSM_IDLE:
  63.                                                                                                 //3 x 0.909us = 2.727us用于初始化延時
  64.                         if((bit_cnt == 6'd2 ) && (time_cnt == `AD_CLK_TIME))
  65.                                 ad_fsm_ns = FSM_READY;        //如果空閑狀態完成就進入延時狀態
  66.                         else
  67.                                 ad_fsm_ns = ad_fsm_cs;        //否則保持原狀態不變
  68.                 FSM_READY:
  69.                                                                                                 //2 x 0.909us = 1.818us用于延遲1.4us
  70.                         if((bit_cnt == 6'd2 ) && (time_cnt == `AD_CLK_TIME))
  71.                                 ad_fsm_ns = FSM_DATA;        //如果延時狀態完成就進入讀取數據狀態
  72.                         else
  73.                                 ad_fsm_ns = ad_fsm_cs;  //否則保持原狀態不變
  74.                 FSM_DATA:
  75.                                                                                                 //讀取數據8位,1~8個時鐘脈沖
  76.                         if((bit_cnt == 6'd8 ) && (time_cnt == `AD_CLK_TIME))
  77.                                 ad_fsm_ns = FSM_WAIT_CONV;//如果讀取數據狀態完成就進入等待狀態
  78.                         else
  79.                                 ad_fsm_ns = ad_fsm_cs;        //否則保持原狀態不變               
  80.                 FSM_WAIT_CONV:
  81.                                                                                                 //19 x 0.909us = 17.271us用于延遲17us
  82.                         if((bit_cnt == 6'd10) && (time_cnt == `AD_CLK_TIME))
  83.                                 ad_fsm_ns = FSM_END;                //如果等待狀態完成就進入讀取狀態
  84.                         else
  85.                                 ad_fsm_ns = ad_fsm_cs;        //否則保持原狀態不變  
  86.                 FSM_END:                                                               
  87.                         ad_fsm_ns = FSM_READY;                //完成一次數據轉換,進入下一次轉換
  88.                 default:ad_fsm_ns = FSM_IDLE;                                
  89.         endcase
  90. end

  91. //時序電路,用來給time_cnt寄存器賦值
  92. always @ (posedge CLK_50M or negedge RST_N)
  93. begin
  94.         if(!RST_N)                                                                //判斷復位
  95.                 time_cnt <= 6'h0;                                        //初始化time_cnt值
  96.         else
  97.                 time_cnt <= time_cnt_n;                        //用來給time_cnt賦值
  98. end

  99. //組合電路,實現0.909us的定時計數器
  100. always @ (*)
  101. begin
  102.         if(time_cnt == `AD_CLK_TIME)                //判斷0.909us時間
  103.                 time_cnt_n = 6'h0;                                //如果到達0.909us,定時器清零
  104.         else
  105.                 time_cnt_n = time_cnt + 6'h1;        //如果未到0.909us,定時器繼續加1
  106. end

  107. //時序電路,用來給bit_cnt寄存器賦值
  108. always @ (posedge CLK_50M or negedge RST_N)
  109. begin
  110.         if(!RST_N)                                                                //判斷復位
  111.                 bit_cnt <= 6'h0;                                        //初始化bit_cnt值
  112.         else
  113.                 bit_cnt <= bit_cnt_n;                        //用來給bit_cnt賦值
  114. end

  115. //組合電路,用來記錄時鐘周期個數的計數器
  116. always @ (*)
  117. begin
  118.         if(ad_fsm_cs != ad_fsm_ns)                        //判斷狀態機的當前狀態
  119.                 bit_cnt_n = 6'h0;                                        //如果當前的狀態不等于下一個狀態,計時器就清零
  120.         else if(time_cnt == `AD_CLK_TIME_HALF)//判斷0.4545us時間
  121.                 bit_cnt_n = bit_cnt + 6'h1;        //如果到達0.4545us,計數器就加1
  122.         else
  123.                 bit_cnt_n = bit_cnt;                                //否則計數器保持不變
  124. end

  125. //時序電路,用來給AD_CLK寄存器賦值
  126. always @ (posedge CLK_50M or negedge RST_N)
  127. begin
  128.         if(!RST_N)                                                                //判斷復位
  129.                 AD_CLK <= 1'h0;                                        //初始化AD_CLK值
  130.         else
  131.                 AD_CLK <= AD_CLK_N;                                //用來給AD_CLK賦值
  132. end

  133. //組合電路,用來生成AD的時鐘波形
  134. always @ (*)
  135. begin
  136.         if(ad_fsm_cs != FSM_DATA)                        //判斷狀態機的當前狀態
  137.                 AD_CLK_N = 1'h0;                                        //如果當前的狀態不等于讀取數據狀態,AD_CLK_N就置0
  138.         else if(time_cnt == `AD_CLK_TIME_HALF)//判斷0.4545us時間
  139.                 AD_CLK_N = 1'h1;                                        //如果到達0.4545us,ADC_CLK_N就置1
  140.         else if(time_cnt == `AD_CLK_TIME)//判斷0.909us時間
  141.                 AD_CLK_N = 1'h0;                                        //如果到達0.909us,AD_CLK_N就置0
  142.         else
  143.                 AD_CLK_N = AD_CLK;                                //否則保持不變
  144. end

  145. //時序電路,用來給AD_CS寄存器賦值
  146. always @ (posedge CLK_50M or negedge RST_N)
  147. begin
  148.         if(!RST_N)                                                                //判斷復位
  149.                 AD_CS <= 1'h0;                                                //初始化AD_CS值
  150.         else
  151.                 AD_CS <= AD_CS_N;                                        //用來給AD_CS賦值
  152. end

  153. //組合電路,用來生成AD的片選波形
  154. always @ (*)
  155. begin
  156.         if((ad_fsm_cs == FSM_DATA) || (ad_fsm_cs == FSM_READY))//判斷狀態機的當前狀態
  157.                 AD_CS_N = 1'h0;//如果當前的狀態等于讀取數據狀態或等于延時1.4us狀態,AD_CS_N就置0
  158.         else
  159.                 AD_CS_N = 1'h1;//如果當前的狀態不等于讀取數據狀態或不等于延時1.4us狀態,AD_CS_N就置1
  160. end

  161. //時序電路,用來給ad_data_reg寄存器賦值
  162. always @ (posedge CLK_50M or negedge RST_N)
  163. begin
  164.         if(!RST_N)                                                                //判斷復位
  165.                 ad_data_reg <= 8'h0;                                //初始化ad_data_reg值
  166.         else
  167.                 ad_data_reg <= ad_data_reg_n;        //用來給ad_data_reg賦值
  168. end

  169. //組合電路,將AD線上的數據保存到移位寄存器中
  170. always @(*)
  171. begin
  172.         if((ad_fsm_cs == FSM_DATA) && (!AD_CLK) && (AD_CLK_N))//判斷每一個時鐘的上升沿
  173.                 ad_data_reg_n = {ad_data_reg[6:0],AD_DATA};//將數據存入移位寄存器中,高位優先
  174.         else
  175.                 ad_data_reg_n = ad_data_reg;        //否則保持不變
  176. end

  177. //時序電路,用來給data_out寄存器賦值
  178. always @ (posedge CLK_50M or negedge RST_N)
  179. begin
  180.         if(!RST_N)                                                                //判斷復位
  181.                 data_out <= 8'h0;                                        //初始化data_out值
  182.         else
  183.                 data_out <= data_out_n;                        //用來給data_out賦值
  184. end

  185. //組合電路,將移位寄存器中的數據存入data_out中,可用于輸出
  186. always @ (*)
  187. begin
  188.         if(ad_fsm_cs == FSM_END)                        //判斷復位
  189.                 data_out_n = ad_data_reg;                //初始化data_out值
  190.         else
  191.                 data_out_n = data_out;                        //用來給data_out賦值
  192. end

  193. endmodule
復制代碼

所有資料51hei提供下載:
Ad_Module.rar (2.06 KB, 下載次數: 80)



評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:537367 發表于 2019-5-15 20:34 | 只看該作者
這個怎么不出波形
回復

使用道具 舉報

板凳
ID:539601 發表于 2019-5-16 09:52 | 只看該作者
厲害正是我要的 謝樓主了
回復

使用道具 舉報

地板
ID:302158 發表于 2019-10-8 16:01 | 只看該作者
fpga對ad芯片采集到的數據怎么處理
回復

使用道具 舉報

5#
ID:637023 發表于 2019-11-6 20:59 | 只看該作者
好東西啊
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久福利 | 国产a级毛毛片 | 成人午夜视频在线观看 | 91精品国产欧美一区二区 | 欧美精品日韩精品国产精品 | 国产福利观看 | 狠狠的干| 99精品99| 日本精品视频 | 成人av网页 | 操操日 | 国产第1页 | 亚洲国产一区视频 | 成人免费av | 亚洲国产aⅴ精品一区二区 免费观看av | www国产亚洲精品 | 精品毛片| 一级黄色网页 | 青青久久| 国产精品有限公司 | 国产精品天堂 | 国产精品美女久久久久久久网站 | 天天色影视综合 | 国产欧美一区二区三区久久 | 五月激情久久 | 人人九九精 | 亚洲欧洲日韩 | 亚洲一区二区高清 | 亚洲综合无码一区二区 | 国产乱精品一区二区三区 | 中文字幕亚洲精品在线观看 | 91在线观看网址 | 日本午夜精品一区二区三区 | 色综合欧美 | 久久噜噜噜精品国产亚洲综合 | 亚洲精品一二三 | 一区二区三区网站 | 欧美日韩在线免费观看 | 一区二区精品 | 久久精品91久久久久久再现 | 色综合美女|