步驟1:模擬前端
Xilinx Zynq IC具有“ XADC”模數轉換器。 XADC最多以1MSPS(每秒兆采樣)采樣,輸出12位值。該ADC的輸入范圍為0-1V。
XADC能夠對幾個輸入通道進行采樣,但是在Zynq板上,用戶實際上只能訪問幾個特定的輔助輸入。在示波器中,我使用了Zybo XADC PMOD上可用的AUX14 ADC輸入。
由于0-1V的示波器輸入范圍不是很有用,因此必須在ADC輸入的前面添加模擬電路,以便縮放和移動輸入電壓,請參見此步驟的框圖。
此框圖是使用LTSPICE原理圖/仿真中顯示的電路實現的(為仿真附上原理圖文件)。根據需要,增益為1/20 = 0.05,直到抗混疊濾波器導致其下降約400kHz(1MSPS ADC的奈奎斯特頻率= 500kHz)為止。
我在面包板上實現了該設計(沒有時間使用通孔組件設計PCB)。第二個LTSPICE原理圖中顯示了用于實現此設計的組件(不可仿真,僅用于設計用于訂購零件的電路),以及實際構建的電路。 3.3V和GND來自XADC PMOD連接器。
步驟2:ADC緩沖器/觸發器
設計負責采樣輸入信號,在發生波形事件時觸發并在完成時使數據可用于PS。
-processing_system7_0:Zynq PS
-rst_processing_system7_0_100M:零件AXI通信(添加到連接自動化中)
-processing_system7_0_ai_periph:AXI通信(添加到連接自動化中)
-xadc_wiz_0:XADC實現。在DRP,單通道模式下配置,具有最大轉換率(實際為961KSPS)。 VAUX14被配置為雙極性模式。
-gpio_trigger_settings:GPIO IP用于設置子采樣和觸發閾值。二次采樣是指選擇從ADC接受輸入值的頻率。如果將示波器的時基縮小很長一段時間,則緩沖區將太小而無法填滿(例如)以1MSPS采集的1秒數據。觸發閾值是指觸發發生時的電壓電平。
-gpio_trigger_control:GPIO IP。通道1輸出,能夠復位觸發塊(當PS準備好用于新的數據緩沖區時)并聲明要讀取的存儲器的地址值。通道2是輸入,允許讀取數據緩沖區的輸出數據,最后寫入的地址以及觸發緩沖區是否已滿。
-drp_int_0:我的IP,用于解釋XADC的DRP輸出。
-trigger_0:我的IP,用于實現觸發行為
-blk_mem_gen_0:用于保存過去的采樣值的IP。
此部分所有IP的SystemVerilog文件都包括在內。
步驟3:用戶輸入處理
設計的這一部分負責對編碼器和按鈕輸入進行采樣。 “標準速度” PMOD用于將這些信號引入Zynq。只需使用GPIO模塊即可對按鈕輸入進行采樣。編碼器輸入由編碼器IP塊(由我編寫)處理,以便獲得與旋轉編碼器多少有關的“計數”值。
由于使用了機械式旋轉編碼器,因此開關和編碼器輸出均需要上拉電阻(5k Ohm),并且還添加了一個去抖動的LP濾波器。這可能是我設計中最薄弱的部分,并且肯定需要做更多的工作。盡管對硬件模塊進行了仿真,但顯示出正常的功能(圖像已附上),但我仍然無法從編碼器獲取準確的計數值。在最后的演示之前,我沒有時間來診斷這個問題,因此我建議您花一些時間比我更多的時間來設計這個問題!
-encoder_btn_gpio:輸入了通道1,正在計數來自三個編碼器和兩個按鈕的值
-encoder0,1,2:我的IP,用于解釋旋轉編碼器的正交輸入。編碼器的步長被記錄為可以為負或正的“計數”值。存在RST輸入以重置計數值,允許PS讀取計數值,然后將其重置。這樣,計數值將永遠不會溢出并導致奇怪的結果。
步驟4:視頻驅動程序
設計的這一部分負責繪制GUI和輸入波形。示波器波形,觸發電平線和其他變化的指示器存儲在幀緩沖器中,每個存儲器地址保存一個像素值。該幀緩沖區是一個塊內存,VGA驅動程序從中讀取值,然后將其發送到VGA端口以在屏幕上顯示。
最初,屏幕的大小希望為640 x480。但是,存儲一個塊RAM中的所有這些像素值都是不可能的,因為塊ram的最大深度是262144(對應于18位的地址,2 ^ 18 = 262144),并且640 x 480 = 307200像素。做出了妥協,將屏幕縮小到480 x 512,以便將整個屏幕緩沖區存儲在一個塊ram中。
為了簡化以后的編碼,在計算機上的圖像編輯器中繪制了背景圖像(網格和屏幕輪廓)。編寫(包括)了一個matlab腳本,將黑白BMP轉換為.coe文件,該文件可以預加載到塊ram單元中。這意味著圖像已經存儲在內存中,不需要用代碼或硬件“繪制”。這是與屏幕緩沖區分開的獨立塊內存,因此兩個塊RAM的輸出將運行到自定義IP塊(顏色處理器)中,以便“決定”應顯示哪種顏色,示波器信號和指示器具有更高的層優先級在網格上。
-axi_gpio_0:輸出通道1。控制地址,數據和啟用信號以寫入屏幕緩沖區。輸入通道2。讀取確認位以確認寫入操作已完成。
-bram_write_controller:從GPIO模塊獲取地址,數據和啟用信號,以寫入塊ram。地址和數據信號無需更改即可簡單路由。 EN信號帶來了復雜性。我不確定從GPIO寫入“ 1”和“ 0”將花費多長時間(就時鐘周期而言),因此我想確保塊wram僅被寫入一次。該寫控制器在GPIO的EN信號的上升沿運行,以便為塊ram的寫使能產生一個1時鐘寬度的使能脈沖。完成該脈沖后,可以將確認信號置為高電平,以確認它已被寫入。
-signals_buffer1:這是一個3位寬的塊ram,用于在屏幕上存儲變化的像素值,例如波形,觸發電平線和電壓/分壓指示器。每個存儲器地址代表一個像素。地址系統的工作方式是,高9位是像素的行,低9位是像素的列。
-gui_buffer:這是一個1位寬的塊ram,用于存儲通過圖像生成的.coe文件加載的不變的GUI(網格,輪廓等)。 (附加了MATLAB腳本)
-vga_driver_0:為VGA協議生成水平和垂直同步信號。生成代表當前顯示像素的列和行值。這些用于從塊RAM中讀出以讀取當前像素的存儲值
-color_processor_0:此IP根據存儲的像素值決定顯示哪種顏色。我將優先級從最高設置為最低(紅色觸發電平線,黃色信號線,白色GUI/網格)。每個像素的值存儲為3位值,每個位代表一個“層”。優先級較高的信號(如觸發線)應出現在“頂層”,而優先級較低的信號(如背景網格)應出現在“底層”。
步驟5 :處理系統
將前面介紹的設計組合在一起,以提供最終設計,并由一個PS來控制它們。所有模塊的接口均通過GPIO IP。結合使用時,請參見圖像以查看所有先前的GPIO模塊的命名約定:
-gpio_trigger_control:控制觸發模塊,讀取緩沖區值
-gpio_trigger_settings:設置閾值和子采樣
-screen_buffer_gpio:將值寫入屏幕緩沖區
-encoder_btn_gpio:讀取編碼器計數和按鈕值。
寫入(包括)用于寫入像素的庫,讀取編碼器/按鈕輸入,并讀取樣本緩沖區值。由于時間有限,主代碼有些大,沒有足夠的時間使它們具有模塊化功能。
在最初的開發中,FreeRTOS將用于PS中。由于時間限制,這被放棄并且沒有使用任何任務。但是,我一直在進行的CORTEX_A9_Zynq_ZC702 FreeRTOS演示項目仍在使用,其名義是在最后一刻盡可能少地更改。
我的示波器的最終版本僅具有垂直刻度調整和觸發電平調整,因此未使用時分顯示。
主程序的基本流程是:
1)檢查編碼器和按鈕輸入,適當調整觸發值
2)檢查范圍是否已觸發(重復1&2,直到觸發)
3)擦除并更新顯示V/Second劃分的標記。
4)讀取觸發緩沖區的所有值。
5)計算觸發電平線在像素位置的位置
6)計算當前和下一個樣本的位置以像素為單位
7)刪除當前列中的所有像素
8)繪制一條從當前樣本位置的行到下一個樣本位置的行的垂直線。
9)繪制觸發電平線
10)繪制三角形以顯示0V電平
11 )重置觸發器以再次開始采樣。
12)從1開始重復。
第6步:結論,注釋,未來改進
回頭看看有一些變化我想做。大部分時間都受我時間緊迫的限制。
-編碼器:目前,編碼器的工作情況很差。我需要使用示波器進行更多調試,以確保正交輸出“無反彈”且干凈,以便在解釋它們時沒有錯誤。
-應該添加垂直偏移和水平偏移/縮放。
責任編輯:wv
-
示波器
+關注
關注
113文章
6282瀏覽量
185849 -
Digilent
+關注
關注
2文章
219瀏覽量
15874
發布評論請先 登錄
相關推薦
與模擬示波器相比數字示波器的優點有哪些
數字示波器的使用方法及注意事項
如何使用數字示波器的自動測量功能
虛擬示波器還是數字示波器好用
電子示波器和數字示波器的比較
模擬示波器和數字示波器的區別
數字示波器的工作原理和技術特點
混合示波器與數字示波器的區別
數字示波器的基本原理及結構組成
數字示波器探頭過度補償對幅頻特性的影響
![<b class='flag-5'>數字</b><b class='flag-5'>示波器</b>探頭過度補償對幅頻特性的影響](https://file1.elecfans.com/web2/M00/DE/50/wKgZomYu_76AO6RAAAHpDBcuOJw214.png)
評論