實驗8 #第8章 Verilog有限狀態機設計-3 #Verilog #Quartus #modelsim
阿新 • • 發佈:2020-11-03
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 outputreg 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
模擬結果: