以ADC0809为例,设计一个ADC采样控制电路,采用有限状态机的方式。
传统的ADC采样控制的方法是用单片机控制,单片机控制ADC采样具有编程简单,控制灵活的优点,但是采样速度慢,CPU控制的低速极大地限制了ADC器件告诉性能的发挥,在高速ADC控制中,目前基本上都是使用可编程逻辑器件来完成。
下面是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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91`timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2019/01/04 22:30:51 // Design Name: // Module Name: adc0809 // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // // module adc0809( input clk, input reset, input eoc, //转换结束标志信号 output reg start, //ADC转换启动信号 output [2:0] addr,//ADC输入通道选择地址 output reg ale, //模拟通道地址锁存信号 output reg oe //ADC数据输出使能 ); localparam [1:0] s0 = 2'b00, s1 = 2'b01, s2 = 2'b10, s3 = 2'b11; reg [1:0] current_state, next_state; always @(posedge clk, posedge reset) begin if(reset) current_state <= s0; else current_state <= next_state; end assign addr = 3'b000; //输入通道设定为通道0 always @ * begin case(current_state) s0: next_state = s1; s1: next_state = s2; s2: begin if(eoc) next_state = s3; //转换结束 else next_state = s2; //转换未结束,继续等待 end s3: next_state = s0; endcase end always @ * begin case(current_state) s0: begin ale = 0; start = 0; oe = 0; end s1: begin ale = 1; start = 1; oe = 0; end s2: begin ale = 0; start = 0; oe = 0; end s3: begin ale = 0; start = 0; oe = 1; end endcase end endmodule
RTL电路:
暂时就到这里,可能有的考虑不周,有意见尽管提出,我也会持续更新。
参考文献:电子发烧友
百度百科
搭建你的数字积木
最后
以上就是舒服日记本最近收集整理的关于【 FPGA 】使用状态机设计一个ADC采样控制电路的全部内容,更多相关【内容请搜索靠谱客的其他文章。
发表评论 取消回复