1. 程式人生 > 實用技巧 >實驗8 #第8章 Verilog有限狀態機設計-3 #Verilog #Quartus #modelsim

實驗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 

模擬結果: