首先我們做一個模塊,輸入信號T,代表輸出時鐘周期,輸出時鐘周期嚴格等于T,對于熟悉FPGA的小伙伴應該很容易。下面是小編的代碼。簡單的說就是建立一個狀態機,對輸入周期參數在產生時鐘的每個周期,第一時刻更新值,然后進入下一個狀態計數,計數到和輸入周期一致的時候又回到初始狀態。
上面這個模塊就是我們的控制對象,也就是說,我們要想辦法讓他的時鐘頻率Fo = 系統給定時鐘頻率Fi*N,也就是說: 輸出時鐘周期To = 系統時鐘周期Ti/N。
小編采用如下環路實現。從中可以看出,小編的方法反饋控制的是周期,所以一切參數都轉化到周期上,輸入和反饋,輸出都是通過周期控制。從圖中可以得出結論輸出時鐘周期To=N/(M*N+1)
輸入時鐘要求穩定,并且比系統時鐘慢的越多越好,因為這樣測量更準確。下面就是我們測量時鐘周期的代碼。反饋非常重要,因為他涉及到整個反饋環路的精度和運作效率。除以N的部分我們在另一個模塊實現,因為測量時鐘周期的模塊是相對獨立的輸入和反饋都要用到,獨立出來可以加強代碼可重用性。這段代碼就是在每個輸入時鐘上升沿電腦時候更新周期值。以保證周期的準確性。
控制對象和輸入,反饋參數產生都已經好了,剩下的就是按照控制框圖搭建反饋環路。代碼如下圖,代碼中的Ti是在頂層產生的,輸入時鐘被測量后才把Ti給到環路輸入。第34行是將反饋的時鐘周期乘以反饋增益1/N,35行是將反饋誤差乘以開環增益1/M。至此整個環路已經搭建完成!
這里附上小編頂層代碼,這里從30行開始的模塊就是產生上文說的Ti用的,輸入時鐘直接測量后,變成是種病周期T輸入到feedback模塊。
那么實際效果咋樣呢,能工作嗎?工作起來是啥樣子?小編接下來就測試給大家看。測試代碼如下,輸出時鐘周期在反饋的代碼里面找,輸入時鐘周期是給定的,這兩個找出來對比看看與理論差多遠就知道了,這里M = 10,N=10。
仿真結果如下,看圖1可知輸出時鐘周期穩定后為To = 102ns,輸入時鐘為Ti=1002ns,所以To/Ti = 0.1。而理論值為N/(MN+1)=10/(1010+1)=0.099。
誤差err = |0.1-0.099|/0.1=1% !
我們看看下圖的波形,輸出時鐘周期的震蕩是不是很像連續系統的二階震蕩環節的階躍響應?只不過超調不大,震蕩周期比較少。這是因為我們的開環其實是一階,加了反饋之后成了二階系統。和控制原理書上很近似(看看離散控制部分會更覺得近似)。
-
鎖相環
+關注
關注
35文章
583瀏覽量
87699 -
FPGA設計
+關注
關注
9文章
428瀏覽量
26489 -
負反饋電路
+關注
關注
1文章
35瀏覽量
9265 -
二階系統
+關注
關注
1文章
16瀏覽量
9561
發布評論請先 登錄
相關推薦
評論