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

QQ登錄

只需一步,快速開始

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

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

[復(fù)制鏈接]
ID:522075 發(fā)表于 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;                                //時(shí)鐘的端口,開發(fā)板用的50M晶振
  20. input                                        RST_N;                                //復(fù)位的端口,低電平復(fù)位
  21. input                                        AD_DATA;                                //AD數(shù)據(jù)端口
  22. output                                AD_CS;                                //AD片選端口
  23. output                                AD_CLK;                                //AD時(shí)鐘端口,最大不超過1.1MHz
  24. output        [ 7:0]        data_out;                        //AD模數(shù)轉(zhuǎn)換完成的數(shù)據(jù)輸出


  25. //---------------------------------------------------------------------------
  26. //--        內(nèi)部端口聲明
  27. //---------------------------------------------------------------------------
  28. reg                                        AD_CS;                                //AD片選信號(hào)端口
  29. reg                                        AD_CS_N;                                //AD_CS的下一個(gè)狀態(tài)
  30. reg                                        AD_CLK;                                //AD時(shí)鐘,最大不超過1.1MHz
  31. reg                                        AD_CLK_N;                        //AD_CLK的下一個(gè)狀態(tài)

  32. reg                [ 2:0]        ad_fsm_cs;                        //狀態(tài)機(jī)的當(dāng)前狀態(tài)
  33. reg                [ 2:0]        ad_fsm_ns;                        //狀態(tài)機(jī)的下一個(gè)狀態(tài)

  34. reg                [ 5:0]        time_cnt;                        //用于記錄一個(gè)時(shí)鐘所用時(shí)間的定時(shí)器
  35. reg                [ 5:0]        time_cnt_n;                        //time_cnt的下一個(gè)狀態(tài)
  36. reg                [ 5:0]        bit_cnt;                                //用來記錄時(shí)鐘周期個(gè)數(shù)的計(jì)數(shù)器
  37. reg                [ 5:0]        bit_cnt_n;                        //bit_cnt的下一個(gè)狀態(tài)

  38. reg                [ 7:0]        data_out;                        //用來保存穩(wěn)定的AD數(shù)據(jù)
  39. reg                [ 7:0]        data_out_n;                        //data_out的下一個(gè)狀態(tài)
  40. reg                [ 7:0]        ad_data_reg;                //用于保存數(shù)據(jù)的移位寄存器
  41. reg                [ 7:0]        ad_data_reg_n;                //ad_data_reg_n的下一個(gè)狀態(tài)

  42. parameter        FSM_IDLE                        = 3'h0;        //狀態(tài)機(jī)的初始狀態(tài);
  43. parameter        FSM_READY                = 3'h1;        //滿足CS有效時(shí)的第一個(gè)1.4us的延時(shí)狀態(tài)
  44. parameter        FSM_DATA                        = 3'h2;        //讀取8個(gè)數(shù)據(jù)狀態(tài)
  45. parameter        FSM_WAIT_CONV        = 3'h3;        //等待轉(zhuǎn)換狀態(tài),等待17us;
  46. parameter        FSM_END                        = 3'h4;        //結(jié)束的狀態(tài)

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

  58. //組合電路,用來實(shí)現(xiàn)狀態(tài)機(jī)
  59. always @ (*)
  60. begin
  61.         case(ad_fsm_cs)                                                //判斷狀態(tài)機(jī)的當(dāng)前狀態(tài)
  62.                 FSM_IDLE:
  63.                                                                                                 //3 x 0.909us = 2.727us用于初始化延時(shí)
  64.                         if((bit_cnt == 6'd2 ) && (time_cnt == `AD_CLK_TIME))
  65.                                 ad_fsm_ns = FSM_READY;        //如果空閑狀態(tài)完成就進(jìn)入延時(shí)狀態(tài)
  66.                         else
  67.                                 ad_fsm_ns = ad_fsm_cs;        //否則保持原狀態(tài)不變
  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;        //如果延時(shí)狀態(tài)完成就進(jìn)入讀取數(shù)據(jù)狀態(tài)
  72.                         else
  73.                                 ad_fsm_ns = ad_fsm_cs;  //否則保持原狀態(tài)不變
  74.                 FSM_DATA:
  75.                                                                                                 //讀取數(shù)據(jù)8位,1~8個(gè)時(shí)鐘脈沖
  76.                         if((bit_cnt == 6'd8 ) && (time_cnt == `AD_CLK_TIME))
  77.                                 ad_fsm_ns = FSM_WAIT_CONV;//如果讀取數(shù)據(jù)狀態(tài)完成就進(jìn)入等待狀態(tài)
  78.                         else
  79.                                 ad_fsm_ns = ad_fsm_cs;        //否則保持原狀態(tài)不變               
  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;                //如果等待狀態(tài)完成就進(jìn)入讀取狀態(tài)
  84.                         else
  85.                                 ad_fsm_ns = ad_fsm_cs;        //否則保持原狀態(tài)不變  
  86.                 FSM_END:                                                               
  87.                         ad_fsm_ns = FSM_READY;                //完成一次數(shù)據(jù)轉(zhuǎn)換,進(jìn)入下一次轉(zhuǎn)換
  88.                 default:ad_fsm_ns = FSM_IDLE;                                
  89.         endcase
  90. end

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

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

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

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

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

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

  145. //時(shí)序電路,用來給AD_CS寄存器賦值
  146. always @ (posedge CLK_50M or negedge RST_N)
  147. begin
  148.         if(!RST_N)                                                                //判斷復(fù)位
  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))//判斷狀態(tài)機(jī)的當(dāng)前狀態(tài)
  157.                 AD_CS_N = 1'h0;//如果當(dāng)前的狀態(tài)等于讀取數(shù)據(jù)狀態(tài)或等于延時(shí)1.4us狀態(tài),AD_CS_N就置0
  158.         else
  159.                 AD_CS_N = 1'h1;//如果當(dāng)前的狀態(tài)不等于讀取數(shù)據(jù)狀態(tài)或不等于延時(shí)1.4us狀態(tài),AD_CS_N就置1
  160. end

  161. //時(shí)序電路,用來給ad_data_reg寄存器賦值
  162. always @ (posedge CLK_50M or negedge RST_N)
  163. begin
  164.         if(!RST_N)                                                                //判斷復(fù)位
  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線上的數(shù)據(jù)保存到移位寄存器中
  170. always @(*)
  171. begin
  172.         if((ad_fsm_cs == FSM_DATA) && (!AD_CLK) && (AD_CLK_N))//判斷每一個(gè)時(shí)鐘的上升沿
  173.                 ad_data_reg_n = {ad_data_reg[6:0],AD_DATA};//將數(shù)據(jù)存入移位寄存器中,高位優(yōu)先
  174.         else
  175.                 ad_data_reg_n = ad_data_reg;        //否則保持不變
  176. end

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

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

  193. endmodule
復(fù)制代碼

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



評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:537367 發(fā)表于 2019-5-15 20:34 | 顯示全部樓層
這個(gè)怎么不出波形
回復(fù)

使用道具 舉報(bào)

ID:539601 發(fā)表于 2019-5-16 09:52 | 顯示全部樓層
厲害正是我要的 謝樓主了
回復(fù)

使用道具 舉報(bào)

ID:302158 發(fā)表于 2019-10-8 16:01 | 顯示全部樓層
fpga對(duì)ad芯片采集到的數(shù)據(jù)怎么處理
回復(fù)

使用道具 舉報(bào)

ID:637023 發(fā)表于 2019-11-6 20:59 | 顯示全部樓層
好東西啊
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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