1.引脚功能
    ADC0809芯片有28条引脚,采用双列直插式封装,如图13.23所示。下面说明各引脚功能。
    IN0~IN7:8路模拟量输入端。
    2-1~2-8:8位数字量输出端。
    ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路
    ALE:地址锁存允许信号,输入,高电平有效。
    START: A/D转换启动信号,输入,高电平有效。
    EOC: A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低平)。
    OE:数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输 出三态门,输出数字量。
    CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ。
    REF(+)、REF(-):基准电压。
    Vcc:电源,单一+5V。
    GND:地。
    image.png
    2.工作过程
    1.ALE=0, START = 0;3位地址加一
    2.输入3位地址,并使ALE=1,将地址存入地址锁存器中,经地址译码器译码从8路模拟通道中选通一路模拟量送到比较器。
      3.送START一高脉冲,START的上升沿使逐次逼近寄存器复位,下降沿启动A/D转换,并使EOC信号为低电平。
      4.当转换结束时,转换的结果送入到输出三态锁存器,并使EOC信号回到高电平,通知CPU已转换结束。
      5.当CPU执行一读数据指令,使OE为高电平,则从输出端D0~D1读出数据。
    image.png
    3.编写verilog .v文件

    1. /********************************************************************************
    2. 名称 :verilog_second.v
    3. 功能:仿真ADC0809 循环采集8个通道
    4. 输入:clk500K,rst_n,EOC,[7:0] DATA,
    5. 输出:START,OE, ALE,[2:0] ADDABC,[7:0] DATA_R
    6. 作者:王世阳
    7. 创建日期:2021.04.11
    8. 修改日期1:
    9. 修改内容1:
    10. *********************************************************************************/
    11. module verilog_second
    12. (
    13. input clk500K, // 时钟信号 (需要实物操作需要加锁相环分频)
    14. input rst_n, // 复位信号
    15. input EOC, //A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低平)。
    16. input [7:0] DATA, //8路adc转换好的数据的输入端。
    17. output reg START, //A/D转换启动信号,输入,高电平有效。
    18. output reg OE, //数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
    19. output reg ALE, //地址锁存允许信号,输入,高电平有效。
    20. output reg [2:0] ADDABC, //3位地址输入线,用于选通8路模拟输入中的一路
    21. output reg [7:0] DATA_R //8位数字量所存输出端。
    22. );
    23. reg [2:0] ABC = 3'b000;
    24. //--内部端口声明
    25. reg[4:0] CS,NS;
    26. parameter IDLE=5'b00001,START_H=5'b00010,START_L=5'b00100,CHECK_END=5'b01000,GET_DATA=5'b10000; //五个状态
    27. //--逻辑功能实现
    28. always @(posedge clk500K)
    29. case(CS)
    30. IDLE:
    31. NS=START_H;
    32. START_H:
    33. NS=START_L;
    34. START_L:
    35. NS=CHECK_END;
    36. CHECK_END:
    37. if(EOC) //当EOC信号回到高电平,通知CPU已转换结束。
    38. NS=GET_DATA;
    39. else
    40. NS=CHECK_END;
    41. GET_DATA:
    42. NS=IDLE;
    43. default:
    44. NS=IDLE;
    45. endcase
    46. always@(posedge EOC)
    47. begin
    48. ABC <= ABC + 3'b001;
    49. ADDABC <= ABC;
    50. end
    51. always @(posedge clk500K or negedge rst_n) //如果复位电平来临回归起始状态
    52. begin
    53. if(!rst_n)
    54. begin
    55. CS<=IDLE;
    56. end
    57. else
    58. CS<=NS;
    59. end
    60. always @(posedge clk500K)
    61. case(NS)
    62. IDLE:
    63. begin //ALE=0, START = 0;3位地址加一
    64. OE<=0;
    65. START<=0;
    66. ALE<=0;
    67. end
    68. START_H:
    69. begin //输入3位地址,并使ALE=1,将地址存入地址锁存器中,经地址译码器译码从8路模拟通道中选通一路模拟量送到比较器送START一高脉冲,START的上升沿使逐次逼近寄存器复位,。
    70. OE<=0;
    71. START<=1; // 产生启动信号
    72. ALE<=1;
    73. end
    74. START_L:
    75. begin //START=下降沿启动A/D转换,并使EOC信号为低电平。
    76. OE<=0;
    77. START<=0;
    78. ALE<=1; //启动信号脉宽要足够长 ,在启动的时候 ALE要一直有效
    79. end
    80. CHECK_END:
    81. begin //当转换结束时,转换的结果送入到输出三态锁存器,并使EOC信号回到高电平,通知CPU已转换结束。
    82. OE<=0;
    83. START<=0;
    84. ALE<=0;
    85. end
    86. GET_DATA:
    87. begin //当CPU执行一读数据指令,使OE为高电平,则从输出端D0~D1读出数据。
    88. OE<=1; // 高电平打开三态缓冲器输出转换数据
    89. DATA_R<=DATA; //提取转换数据
    90. START<=0;
    91. ALE<=0;
    92. end
    93. default:
    94. begin
    95. OE<=0;
    96. START<=0;
    97. ALE<=0;
    98. end
    99. endcase
    100. endmodule

    4.编写verilog .vt文件

    1. `timescale 1 ns/ 1 ps
    2. module verilog_second_vlg_tst();
    3. // constants
    4. // general purpose registers
    5. reg eachvec;
    6. // test vector input registers
    7. reg clk500K;
    8. reg rst_n;
    9. reg EOC;
    10. reg [7:0] DATA;
    11. // wires
    12. wire START;
    13. wire OE;
    14. wire ALE;
    15. wire [2:0] ADDABC;
    16. wire [7:0] DATA_R;
    17. integer i;
    18. // assign statements (if any)
    19. verilog_second i1 (
    20. // port map - connection between master ports and signals/registers
    21. .clk500K(clk500K),
    22. .rst_n(rst_n),
    23. .EOC(EOC),
    24. .DATA(DATA),
    25. .START(START),
    26. .OE(OE),
    27. .ALE(ALE),
    28. .ADDABC(ADDABC),
    29. .DATA_R(DATA_R)
    30. );
    31. initial
    32. begin
    33. // code that executes only once
    34. // insert code here --> begin
    35. //#0 CLK_50M =1'b0; //时钟初始化为 1
    36. //#10000 rst_n =1'b0; //延时 10ns,低电平复位
    37. #0 clk500K =1'b0; //时钟初始化为 1
    38. #0 rst_n =1'b1;
    39. #0 EOC =1'b1;
    40. #0 DATA =1'b0;
    41. #10 EOC =1'b0;
    42. #2 DATA = DATA + 10;
    43. #2 EOC =1'b1;
    44. for(i = 0;i<80;i = i+1)
    45. begin
    46. #10 EOC =1'b0;
    47. #2 DATA = DATA + 10;
    48. #20 EOC =1'b1;
    49. end
    50. #30 $stop; //延时停止仿真
    51. // --> end
    52. end
    53. always #1
    54. // optional sensitivity list
    55. // @(event1 or event2 or .... eventn)
    56. begin
    57. // code executes for every event on sensitivity list
    58. // insert code here --> begin
    59. clk500K=~clk500K;
    60. // --> end
    61. end
    62. endmodule

    5.仿真效果图
    image.png