【 FPGA 】使用状态机设计一个ADC采样控制电路

举报
李锐博恩 发表于 2021/07/15 05:25:00 2021/07/15
【摘要】 以ADC0809为例,设计一个ADC采样控制电路,采用有限状态机的方式。 传统的ADC采样控制的方法是用单片机控制,单片机控制ADC采样具有编程简单,控制灵活的优点,但是采样速度慢,CPU控制的低速极大地限制了ADC器件告诉性能的发挥,在高速ADC控制中,目前基本上都是使用可编程逻辑器件来完成。 下面是ADC0809的内部电路图: 引脚图: 引脚功能: ...

以ADC0809为例,设计一个ADC采样控制电路,采用有限状态机的方式。

传统的ADC采样控制的方法是用单片机控制,单片机控制ADC采样具有编程简单,控制灵活的优点,但是采样速度慢,CPU控制的低速极大地限制了ADC器件告诉性能的发挥,在高速ADC控制中,目前基本上都是使用可编程逻辑器件来完成。

下面是ADC0809的内部电路图:

ADC0809引脚图、时序图、工作流程图详解

引脚图:

ADC0809引脚图、时序图、工作流程图详解

引脚功能:

       IN0~IN7:8路模拟量输入端。

  D0~D7:8位数字量输出端。

  ADDA、ADDB、ADDC:3位地址输入线,用于选择8路模拟通道中的一路,选择情况见表。

  ALE:地址锁存允许信号,输入,高电平有效。

  START:A/D转换启动信号,输入,高电平有效。

  EOC:A/D转换结束信号,输出。当启动转换时,该引脚为低电平,当A/D转换结束时,该线脚输出高电平。

  OE:数据输出允许信号,输入,高电平有效。当转换结束后,如果从该引脚输入高电平,则打开输出三态门,输出锁存器的数         据从D0~D7送出。

  CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ. REF+、REF-:基准电压输入端。

  Vcc:电源,接+5V电源。

  GND:地。

地址码与输入通道的对应关系:

卤料包

时序图:

卤料包

工作过程:

       1.输入3位地址,并使 ALE=1,将地址存入地址锁存器中,经地址译码器译码从8路模拟通道中选通一路模拟量送到比较器。

  2.送START一高脉冲,START的上升沿使逐次逼近寄存器复位,下降沿启动A/D转换,并使EOC信号为低电平,转换时间为100us。

  3.当转换结束时,EOC信号回到高电平,控制器可以根据此信号了解转换状态。

  4.此后,控制器可以通过控制输出使能端OE,通过八位并行数据总线D[7:0]来读取转换结果。

抽象出状态转移图:

分为四个状态,分别为初始化状态s0,启动ADC状态s1,等待ADC转换结束状态s2,转换数据读取状态s3.

ADC0809控制的状态从s0到s1,s1到s2,s3到s0都是在时钟上升沿直接变化,只有s2到s3,根据输入信号EOC来判断状态转移的下一个状态。

下面给出状态机的简图,由于输出较多,下图没有列出输出,具体见代码:

Verilog HDL描述代码为:


  
  1. `timescale 1ns / 1ps
  2. //
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 2019/01/04 22:30:51
  7. // Design Name:
  8. // Module Name: adc0809
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //
  21. module adc0809(
  22. input clk,
  23. input reset,
  24. input eoc, //转换结束标志信号
  25. output reg start, //ADC转换启动信号
  26. output [2:0] addr,//ADC输入通道选择地址
  27. output reg ale, //模拟通道地址锁存信号
  28. output reg oe //ADC数据输出使能
  29. );
  30. localparam [1:0]
  31. s0 = 2'b00,
  32. s1 = 2'b01,
  33. s2 = 2'b10,
  34. s3 = 2'b11;
  35. reg [1:0] current_state, next_state;
  36. always @(posedge clk, posedge reset)
  37. begin
  38. if(reset)
  39. current_state <= s0;
  40. else
  41. current_state <= next_state;
  42. end
  43. assign addr = 3'b000; //输入通道设定为通道0
  44. always @ *
  45. begin
  46. case(current_state)
  47. s0: next_state = s1;
  48. s1: next_state = s2;
  49. s2:
  50. begin
  51. if(eoc) next_state = s3; //转换结束
  52. else next_state = s2; //转换未结束,继续等待
  53. end
  54. s3: next_state = s0;
  55. endcase
  56. end
  57. always @ *
  58. begin
  59. case(current_state)
  60. s0:
  61. begin
  62. ale = 0; start = 0; oe = 0;
  63. end
  64. s1:
  65. begin
  66. ale = 1; start = 1; oe = 0;
  67. end
  68. s2:
  69. begin
  70. ale = 0; start = 0; oe = 0;
  71. end
  72. s3:
  73. begin
  74. ale = 0; start = 0; oe = 1;
  75. end
  76. endcase
  77. end
  78. endmodule

RTL电路:

 

暂时就到这里,可能有的考虑不周,有意见尽管提出,我也会持续更新。

 

参考文献:电子发烧友

百度百科

搭建你的数字积木

 

 

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/85803516

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。