本原創文章由深圳市小眼睛科技有限公司創作,版權歸本公司所有,如需轉載,需授權并注明出處(www.meyesemi.com)
1.實驗簡介
實驗目的:
了解 PLL IP 的基本使用方法。
實驗環境: Window11 PDS2022.2-SP6.4
芯片型號: PG2L50H-484
2.實驗原理
2.1. PLL 介紹
? ? ? 鎖相環作為一種反饋控制電路,其特點是利用外部輸入的參考信號來控制環路內部震蕩信號的頻率和相位。因為鎖相環可以實現輸出信號頻率對輸入信號頻率的自動跟蹤,所以鎖相環通常用于閉環跟蹤電路。鎖相環在工作的過程中,當輸出信號的頻率與輸入信號的頻率相等時,輸出電壓與輸入電壓保持固定的相位差值,即輸出電壓與輸入電壓的相位被鎖住,這就是鎖相環名稱的由來。
? ? ? 鎖相環擁有強大的性能,可以對輸入到 FPGA 的時鐘信號進行任意分頻、倍頻、 相位調整、占空比調整,從而輸出一個期望時鐘;除此之外,在一些復雜的工程中, 哪怕我們不需要修改任何時鐘參數,也常常會使用 PLL 來優化時鐘抖動,以此得到一個更為穩定的時鐘信號。正是因為 PLL 的這些性能都是我們在實際設計中所需要的,并且是通過編寫代碼無法實現的,所以 PLL IP 核才會成為程序設計中最常用 IP 核之一。 PLL IP 是紫光同創基于 PLL 及時鐘網絡資源設計的 IP,通過不同的參數配置,可實 現時鐘信號的調頻、調相、同步、頻率綜合等功能。
2.2. IP 配置
? ?首先點擊快捷工具欄的“IP”圖標,進入 IP 例化設置
? ?然后在 IP 目錄處選擇 PLL,在 Instance name 處為本次實例化的 IP 取一個名字,接著點擊 Customise 進入 IP 配置頁面。操作示意圖如下:
? ??PLL 的使用可選擇 Basic 和 Advanced 兩種模式,Advanced 模式下 PLL 的內部參數配置完全開放,需要自己填寫輸入分頻系數、輸出分頻系數、占空比、相位、反饋分頻系數等才能正確配置。Basic 模式下用戶無需關心 PLL 的內部參數配置,只需輸入期望的頻率值、相位值、占空比等,IP 將自動計算,得到最佳的配置參數。如果沒有特殊應用,建議使用 Basic 模式配置 PLL。本次實驗我們選擇 Basic Configuration。
? ?接下來進行基礎配置:
? ?在 Public Configurations 一欄將輸入時鐘頻率設置為 25MHZ。
? ?在 Clockout0 Configurations 選項卡下,勾選使能 clkout0,將輸出頻率設置為 50MHZ。
? ?在 Clockout1 Configurations 選項卡下,勾選使能 clkout1,將輸出頻率設置為 100MHZ。
? ?在 Clockout2 Configurations 選項卡下,勾選使能 clkout2,將輸出頻率設置為 100MHZ,并設置相位偏移為 180 度。
? ??其他選項可以使用默認設置,若有其他需求可以查閱 IP 手冊了解,本實驗我們暫介紹 IP 基本的使用方法:
點擊左上角 generate 生成 IP。
3.代碼設計
? ? 模塊接口列表如下所示:
? ? 表 1- 3- 1 PLL IP 使用實驗模塊接口表
端口 | I/O | 位寬 | 描述 |
?sys_clk | ?input | 1 | ?系統時鐘 |
?clkout0 | ?output | 1 | ?54MHZ 時鐘 |
?clkout1 | ?output | 1 | ?81MHZ 時鐘 |
?clkout2 | ?output | 1 | ?81MHZ 時鐘,相位偏移 180 度 |
?lock | ?output | 1 | 時鐘鎖定信號,當為高電平時, 代表 IP 核輸出時鐘穩定 |
PLL_TEST 頂層代碼:
module PLL_TEST(input sys_clk , output clkout0 , output clkout1 , output clkout2 , output lock);PLL PLL_U0 (.clkout0 (clkout0 ), // output.clkout1 (clkout1 ), // output.clkout2 (clkout2 ), // output.lock (lock ), // output.clkin1 (sys_clk ) // input);endmodule
該模塊的功能是例化 PLL IP 核,功能簡單,在此不做說明。
PLL_tb 測試代碼:
timescale 1ns / 1psmodule PLL_tb();reg sys_clk ;wire clkout0 ;wire clkout1 ;wire clkout2 ;wire lock ;initialbegin#2sys_clk <= 0 ;endparameter CLK_FREQ = 25;//Mhzalways # ( 1000/CLK_FREQ/2 ) sys_clk = ~sys_clk ;PLL_TEST u_PLL_TEST(.sys_clk (sys_clk ), .clkout0 (clkout0 ), .clkout1 (clkout1 ), .clkout2 (clkout2 ), .lock (lock ));endmodule
? ? timescale 定義了模塊仿真的時間單位和時間精度。時間單位是 1 納秒,精度是 1 皮秒。
? ? initial 塊負責初始化系統時鐘。在仿真啟動后的 2 納秒,系統時鐘 sys_clk 被設置為 0。這是為了在仿真開始時定義一個已知的初始狀態。
? ? 代碼定義了一個時鐘頻率參數 CLK_FREQ 為 25 MHz,并使用一個 always 塊來翻轉系統時鐘信號。always 塊中的邏輯使得 sys_clk 每 40 納秒翻轉一次,從而生成一個 25MHz 的方波時鐘信號。這種時鐘信號用于驅動被測試的 PLL_TEST 模塊。
? ? 最后,將測試平臺的各個信號連接到 PLL_TEST 模塊。這包括將生成的系統時鐘 sys_clk 連接到 PLL_TEST 的時鐘輸入端,并將 PLL_TEST 的輸出信號 clkout0、clkout1、 clkout2 和 lock 使用 wire 引出觀察。
4.PDS 與 Modelsim 聯合仿真
? ? ?PDS 支持與 Modelsim 或 QuestaSim 等第三方仿真器的聯合仿真,而 Modelsim 是較為常用的仿真器,使用 PDS 與 Modelsim 來進行聯合仿真。
? ? 接下來選擇 Project->Project Setting,打開工程設置,準備設置聯合仿真。
? ? ?選擇 Simulation 選項卡,紅框 1 選擇剛才編譯生成的仿真庫的路徑,紅框 2 選擇 Modelsim 的啟動路徑,之后點擊 OK。
? ? ?右鍵仿真的文件,選擇 Run Behavior Simulation 開始行為仿真。
? ? ?運行后會自動打開 Modelsim。并執行仿真,如果沒有任何報錯,則表示成功。如果出現錯誤,請檢測 PDS 與 Modelsim 的配置。
5.實驗現象
? 點擊 Wave 觀察 PLL 輸出信號:
?使用標尺測量 clkout0,發現其一個時鐘周期是 20ns,也就是 50MHZ。
? ? ?可以看到 clkout1 的時鐘頻率是 100MHZ,且和 clkout2 相位偏差 180°,符合設置。需要注意 PLL 的輸出時鐘應該在時鐘鎖定信號 lock 有效之后才能使用,lock 信號拉高之前輸出 的時鐘是不確定的。