实验8 #第8章 Verilog有限状态机设计-3 #Verilog #Quartus #modelsim

3. 状态机A/D采样控制电路

3.1 目标:用状态机控制ADC0809实现数据采集。

3.2 ADC0809简介

      (1)ADC0809是8位A/D转换器,片内有8路模拟开关,可控制8个 模拟量中 的1个进入转换器中。完成一次转换的时间约100us。含锁存控制的8个

               多路开关,输出有三态缓冲器控制,单5V供电。ADC0809的外部引脚,工作时序图详见其数据手册。start是转换启动信号,高电平有效。ale是

               地址锁存信号。eoc是转换状态信号,约100us,上跳沿表示转换结束。oe是输出使能。

       (2)ADC0809更详细的说明可参阅数据手册和数字电路基础里的模数转换部分,比如,康华光版数电书里有讲解逐次逼近的转换原理,用天平称重

               选砝码的过程来类比对分法,高位为1,先跟1/2的vref比较,然后再更加或减一半的一半比较,循环下去,8位就比较8次,得到一组8位的数字编码

               对应当前输入的模拟量的最接近的值。也用到了极限的思想。这样,模拟量的输入就转换成数字量的输出了。

3.3  这个实验要实现的就是用Verilog HDL来设计一个状态机控制逻辑,控制ADC0809的时序,完成一个数据采集的功能。

       (1)设计思想:研究ADC的功能描述和引脚说明,时序图,把时序分成几个状态;然后把adc的输入信号和输出信号颠倒,作为控制逻辑的输入和输出。

       (2)ADC0809采样控制电路的Verilog 代码:

 1 // adc0809 control circuit
 2 //2020-11-3 
 3 // by YongFengXie
 4 module adc0809(
 5                 input clk,   
 6                 input [7:0] d,   //adc0809 output 
 7                 input clr,
 8                 input eoc,
 9                 output reg ale,
10                 output reg start,
11                 output reg oe,
12                 output adda,   // LSB of the 3 input signal chanel
13                 output lock0,      // data lock signal
14                 output [7:0] q);   // output data
15 reg lock;
16 parameter s0='d0,s1='d1,s2='d2,s3='d3,s4='d4;
17 reg [2:0] current_state,next_state;
18 reg [7:0] rel;
19 
20 assign adda = 0;
21 assign lock0=lock;
22 assign q=rel;
23 
24 always @(posedge clk or posedge clr)
25 begin
26   if(clr)
27     current_state <= s0;
28   else
29     current_state <= next_state;
30 end
31 
32 always @(posedge lock)
33 begin
34   rel <= d;
35 end
36 
37 always @(current_state,eoc)
38 begin
39   case(current_state)
40     s0:begin
41          ale<=1'b0;
42          start<=1'b0;
43          lock<=1'b0;
44          oe<=1'b0;
45          next_state<=s1;
46        end
47     s1:begin
48          ale<=1'b1;
49          start<=1'b1;
50          lock<=1'b0;
51          oe<=1'b0;
52          next_state<=s2;
53        end
54     s2:begin
55          ale<=1'b0;
56          start<=1'b0;
57          lock<=1'b0;
58          oe<=1'b0;
59          if(eoc)
60            next_state<=s3;
61          else
62            next_state<=s2;
63        end
64     s3:begin
65          ale<=1'b0;
66          start<=1'b0;
67          lock<=1'b0;
68          oe<=1'b1;
69          next_state<=s4;
70        end
71     s4:begin
72          ale<=1'b0;
73          start<=1'b0;
74          lock<=1'b1;
75          oe<=1'b1;
76          next_state<=s0;
77        end
78     default:next_state<=s0;
79   endcase
80 end
81 
82 endmodule
83 
84  

adc0809测试代码:

 1 // adc0809 control circuit testbench
 2 //2020-11-3 
 3 // by YongFengXie
 4 `timescale 1us/1us
 5 module adc0809_tb;
 6 
 7                 reg clk;   
 8                 reg [7:0] d;   //adc0809 output 
 9                 reg clr;
10                 reg eoc;
11                 wire ale;
12                 wire start;
13                 wire  oe;
14                 wire adda;   // LSB of the 3 input signal chanel
15                 wire lock0;      // data lock signal
16                 wire [7:0] q; 
17 
18 adc0809 ub(clk,d,clr,eoc,ale,start,oe,adda,lock0,q);
19 
20 initial begin
21           clk=1'b0;
22           clr=1'b1;
23           d=8'b1011_1010;
24           eoc=1'b1;
25           #20 clr=1'b0;
26           #100 eoc=1'b0;
27           #150 eoc=1'b1;
28           #10 d=8'b0001_0010;
29           #500 $stop;
30         end
31 
32 always #5 clk=~clk;
33 
34 endmodule 

仿真结果:

原文地址:https://www.cnblogs.com/halflife/p/13920139.html