一、HPM6200 系列 PLA 整體結構
HPM6200 系列的 UM 中帶有 PLA 的結構簡圖。為了方便大家把握整體結構,我也繪制了一個稍微更詳細的結構圖,將 PLA 外設中的大部分元素都展示出來,并給出了單個通道內的具體結構。
從總體來看,PLA 外設擁有 8 輸入、8 反饋、8 輸出,其中 8 輸入、8 反饋是內部的 8 個通道共享,8 輸出則是每個通道使用一個。輸入、輸出均連接到 TRGM 外設,再通過 TRGM 連接到定時器、編碼器、外部引腳等地方。需要注意的是,PLA 的 8 輸入、8 輸出并非全部都能引出至外部引腳中。每個 PLA 外設都連接到一個指定的 TRGM 外設,而每個 TRGM 外設最多僅可連接 12 個外部引腳,同時 TRGM 還可能有其他信號需要接到外部引腳中,如果想要使用更多外部引腳,則還需要使用 TRGM 間連接等方式。因此,在設計 PLA 程序時需要盡可能提前考慮 I/O 安排的問題。
每個 PLA 外設由一個濾波器 FILTER1 和 8 個通道組成,FILTER1 對輸入和反饋信號進行濾波后,寬度為 16bit 的信號將同時輸入到 8 個通道之中(這個扇出也挺驚人的)。每個通道的輸出寬度均只有 1bit,8 個通道合并組成的 8bit 就是 PLA 外設的輸出。下面我們將分別對 PLA 濾波器和單個通道進行介紹。
二、PLA 外設中的濾波器
和我們之前介紹過的 PLA 結構相比,HPM6200 系列的 PLA 最大的特點就是多出了一些濾波器。每個 PLA 外設都有一個 FILTER1 濾波器,8 個通道中每個通道還各有一個 FILTER2 濾波器和 FILTER3 濾波器。目前,文檔中并沒有向我們介紹這些濾波器的設計目的,不過我們也不難從其功能中窺探一二。無論是 FILTER 1, 2 還是 3,他們的功能基本一致:將輸入信號經過同步、邊沿檢測、軟件注入和擴展濾波四個環節后輸出。
1. 同步
文檔中并沒有告訴我們同步功能的具體實現方式,不過在這一段描述里面,我們可以大致猜測出很多信息:
FILTER_SYNC_LEVEL 位選擇同步器級數,清 0 時為 2 級同步,置 1 時為 3 級同步。根據該位的設置,同步器會將信號延時 2 個或者 3 個時鐘周期。
2級、3 級同步可選,聽上去就與跨時鐘域處理中的同步器很像。比較了解 FPGA 或 IC 設計的朋友知道,同步器是減少亞穩態對邏輯電路影響的一個常用措施,PLA 外設可以接受外部輸入的信號,自然也算是一種“跨時鐘域”傳遞信號的過程。同時,增加同步功能還有利于避免出現組合邏輯電路的競爭-冒險,畢竟 FPGA 和 CPLD 開發時有 EDA (盡管 EDA 也不完全可靠)工具幫忙看著,我們在和 PLA 玩耍的時候就沒那么好的條件了。因此我們不妨猜測同步功能實際上就是使用 2/3 級觸發器構成的同步器。
2. 邊沿檢測
這一功能很好理解,將邊沿轉為脈沖,此處不再贅述。
3. 軟件注入
這一功能也很好理解:強制將輸出設置為高電平或低電平。實際上各邏輯門前的四選一 MUX 也能實現類似的功能,這一功能更多是為可配置觸發器 CFF 或者是降低配置復雜度而生的。
4. 擴展濾波 擴展濾波要比上面三個功能復雜得多,文檔也并沒有講得特別清楚,下面我將結合實際例子,分別介紹它的四個濾波類型效果。
在開始之前,我們首先要了解 PLA 外設的時鐘。PLA 外設掛載在 AHB/APB 總線下,因此也受在 AHB/APB 時鐘(默認 200MHz)驅動。在上文提到的同步器同步周期數量中,2/3 級同步就是指的 AHB/APB 時鐘的 2/3 個周期。擴展濾波功能最高支持 65535 周期的擴展,對應的 AHB/APB 時鐘周期數也為 65535 周期,單個周期的時間為 5ns,這在我們后續的計算中會常常用到。對于 hpm_sdk v1.2 以前的版本,周期數配置部分存在一個小 bug,需在代碼中將計算出來的周期數乘二。
(1)輸入高電平擴展
這一個模式相對比較好理解:擴展高電平的長度,也就是在輸入信號變為低電平以后,輸出信號仍會保持高電平,時間為設定的周期數。下圖給出了一個例子。輸入信號是周期為 80μs,占空比 50% 的 PWM 信號,濾波器設置為輸入高電平拓展,周期數為 2000,輸出信號較輸入信號延遲10μs 變為低電平。
(2)輸入低電平擴展
這一個模式正好與上一個模式相反。下圖輸入信號仍是周期為 80μs,占空比 50% 的 PWM 信號,濾波器設置為輸入低電平拓展,周期數為 2000,輸出信號較輸入信號延遲 10μs 變為高電平。
(3)輸出狀態擴展
這一個模式可以看作是以上兩種模式的加和:既延長低電平時間,也延長高電平時間。輸入信號發生變化時,輸出信號將先在設定的周期數內維持現有狀態,結束后跟隨輸入信號變化。這一模式可以起到兩個效果,一是將脈沖寬度小于設定周期數的脈沖全部過濾掉,二是將脈沖寬度大于設定周期數的脈沖延遲設定周期后輸出。
下圖前半段輸入信號是一個脈沖寬度為 40μs 的 PWM 波,輸出信號對比輸入信號延遲了 10μs;在后半段將輸入信號和輸出信號對比,則可以發現所有寬度不大于 10μs 的波形都被過濾掉了。
(4)輸入跳變擴展
這一模式下輸出信號跟隨輸入信號變化,但是當輸出信號發生過跳變以后,在設定周期數的時間內,輸出信號將保持不變,隨后輸出信號繼續跟隨輸入信號的變化。
下圖中前半段濾波器設置的周期數為 2000,對應 10μs 的時間,因此對于半周期 20μs 的 PWM 信號不會產生任何影響;后半段濾波器設置的周期數為 6000,對應 30μs 時間,因此在輸入信號從高電平跳變為低電平以后,輸出信號還會繼續保持高電平直至 30μs 結束。
三、PLA 外設通道結構
1. 與- 或陣列
每個通道的 16 信號輸入會分別接入到 8 個 16 輸入與門中,對單個輸出信號最高支持 8 個最小項相加(8 個與門),并可生成 7 個輸出信號(7 個或門)。每個邏輯門的輸入端都有一個四選一 MUX,可選邏輯 1、邏輯 0、原信號和原信號取反四種輸入。
2. 可配置觸發器
CFF 可被配置為 D 觸發器、雙邊沿 D 觸發器、JK 觸發器、T 觸發器、鎖存器、運算器和直接輸出信號這幾種功能。CFF 的輸出即為其所在通道的輸出,輸出信號寬度 1bit,輸入信號寬度則為 7bit,CFF 配置為各類觸發器時,觸發器的使能、置位、同步/異步復位、時鐘等信號均來自于 7bit 寬度的輸入信號,具體的分配表可見 UM 文檔。除了使用輸入信號以外,CFF 還可以使用 AHB/APB 的時鐘。
四、如何使用 HPM_SDK 中的PLA驅動
在之前介紹的各種含有 PLA 的芯片基本都會配置對應的 EDA 工具,用戶一般可以使用 verilog 編程或者圖形化界面編程,由 EDA 工具生成比特流。比如 PSoC 芯片用戶可以使用圖形化界面編輯狀態機的狀態轉移條件,再由軟件完成后端的處理。HPM6200 的 PLA 則沒有使用這種開發方式,而是將所有的可配置項均以寄存器的方式暴露給 CPU,CPU 設置好對應的寄存器以后,PLA 即可開始工作。
1. FILTER
濾波器的可配置項非常多,包括是否同步、是否啟用邊沿檢測、是否軟件注入等一系列內容,不過最關鍵的其實是準確把握配置的數量。PLA 中有 1 個 FILTER1、8 個 FILTER2 和 8 個 FILTER3,FILTER1/2/3 中分別有 16/8/7 個信號,每一個信號都可以獨立設置上述介紹過的所有濾波功能,也就是共有 136 個信號,很容易錯配、漏配。因此,除了所有通道共用的 FILTER1 單獨配置以外,FILTER2/3 建議和它們所在的通道一同配置,避免混淆的同時,如果部分通道沒有使用,也就不需要對它們的 FILTER2/3 進行配置了。
濾波器的配置結構體是一個位域結構體,使用四個字節保存一個信號的濾波選項,其每個成員的功能結合手冊也非常容易理解,注意,配置結構體里面并沒有任何關于該配置位于哪個通道、哪個濾波器等位置的信息。結構體填充完成以后,則需要使用以下幾個函數完成設置:
這里面實際上有不少容易踩坑的地方。例如 FILTER2/3 都只有一個函數,而 FILTER1 有 in/out 兩個函數。實際上 in/out 兩個函數分別負責 FILTER1 16 個信號里面前 8 個和后 8 個信號的配置,原因大概是前 8 個是 PLA 的輸入信號,后 8 個則是 PLA 的輸出信號反饋回來的。
剛剛提到的濾波器配置結構體里面并沒有關于位置的信息,因此這些信息要以參數的形式提供給設置函數。以在通道 3 的 FILTER2 為例,使用 pla_set_filter2() 時不僅要寫明通道 3,還要指出是 FILTER2 8 個信號中的具體哪一個信號。而 SDK 中通道參數和信號參數分別叫 chn 和 filter2_chn,使用時一定要注意區分兩者之間的差別。
2. 與門
16 輸入與門本身只有一個可配置的內容:各輸入信號的 MUX 選項。不過同樣需要注意數量和位置的問題。8 個通道里面,每個通道有 8 個與門,每個與門又有 16 個 MUX。當然,除了沒有使用的通道無需配置以外,部分沒有使用的與門也可以不進行設置,默認狀態下與門將輸出低電平。
與門的配置結構體是 pla_aoi_16to8_chn_cfg,可以對一個與門進行配置,記得不要被它名字里面那個 chn 給欺騙了。結構體里面有 pla channel 和 aoi_16to8 channel 兩個“通道”成員,一個指的是 PLA 的通道,另一個則是指 8 個與門的編號。個人認為這樣設計其實容易混淆,可以在命名方面更加有區分度一些。
一個與門中有 16 個 MUX,因此 pla_aoi_16to8_chn_cfg 里面有長度為 16 的 MUX 配置結構體 pla_aoi_16to8_cfg_unit_t 數組。MUX 配置結構體的 signal 成員是信號的編號;op 成員的四個選項對應 MUX 的四個選項,對應關系在上面的代碼注釋中給出。 最后我們需要使用以下函數對一個與門進行配置。
3. 或門
或門的代碼和注意事項和與門大同小異,數量上一個通道有 7 個或門,每個或門有 8 個 MUX,比與門會少不少,其余部分基本一致,參照使用即可。
4. 可配置觸發器
CFF 可配置的內容并不多,主要就是功能選擇和時鐘源,具體情況可參考源代碼。需要注意的是觸發器的同步復位、同步置位、異步復位、異步置位等信號有的是高電平有效,有的則是低電平有效,且有優先級順序,使用時需要對照手冊仔細調整。
5. 使能 PLA
在完成上述全部配置完成以后,還需要對每一個通道進行使能。
在沒有使能的情況下,PLA 的寄存器可以作為 1KB 的 APB SRAM 使用。
五、一個簡單的例子:同步八進制計數器
1. 概述
在前面章節的基礎上,我們將實戰使用 PLA 構建一個經典的同步時序邏輯電路:同步八進制計數器。為了簡化問題讓大家更容易理解,我們要構建的計數器只會計數,沒有復位、沒有使能、沒有置數,長得更像是個分頻器,它的電路結構如下所示:
有了電路圖,下一步就是將電路結構轉換為 PLA 的配置代碼。不過,由于 PLA 是與或結構,我們不妨進一步直接將使用到的與門、或門和各種信號都繪制出來,在編碼時將會更加方便。
對照上圖,我們可以提煉出以下信息:
此電路使用了 3 個 PLA 通道,每個通道的 CFF 均配置為 T 觸發器(圖上是 JK,實際功能是 T)
觸發器時鐘使用外部時鐘PLA OUT0OUT1OUT2 分別作為計數器 D2D1D3 的輸出
OUT1OUT2 將作為反饋信號進入通道 1 和 通道 2
2. 工程準備
本部分包括新建工程、使用 GPTMR 產生 1M PWM 作為時鐘的代碼,本文不打算討論這一部分內容,讀者可以參考 HPM_SDK 中的其他例程了解。為了區分三個通道的設置代碼,在 main 函數前聲明了三個通道的配置函數。
3. TRGM 與 I/O
PLA 并沒有專屬于自己的輸入輸出引腳,和其他增強運動控制系統外設一樣,所有輸入輸出信號都要通過 TRGM 處理。因此,這里的代碼將 GPTMR0 CH2 的 PWM 輸出引入到了 PLA0 IN0 中,將 PLA0 OUT0/1/2 輸出到三個外部引腳中。為了方便對比時鐘波形和計數器輸出,還將 GPTMR CH2 的 PWM 也輸出到外部引腳中。
4. FILTER1
FILTER1 并沒有特別的功能需求,因此我們只需要開啟同步功能即可。
5. 通道 0
來到通道 0 的配置函數,首先聲明與門陣列、或門陣列和兩個濾波器的配置結構體變量。
通道 0 使用了兩個與門。第一個與門根據兩個反饋信號相與生成 T 觸發器的 T 信號,先將它的全部 MUX 設為輸出邏輯 1,再將反饋通道對應的 9、10 號 MUX 修改為輸出原信號。第二個與門只需要輸出 PWM 時鐘信號,因此只設置一個 MUX 輸出原信號,其余全部設置輸出邏輯 1。
FILTER2 同樣只需要設置同步。
通道 0 使用了兩個或門。第一個或門需要輸出與第一個與門完全相同的信號,因此 0 號 MUX 設置輸出原信號,其余 MUX 輸出邏輯 0(注意,沒有使用的信號 MUX,一般與門設置輸出邏輯 1,或門設置輸出邏輯 0),第二個與門也基本一致。
FILTER3 同樣設置信號同步,不過不要忘了 FILTER3 同時也輸出觸發器的同步異步復位置位,我們這個電路沒有相關功能,因此全部根據手冊設置為固定值即可。如果要使用這些功能,則需要另外構建他們的控制邏輯函數。
最后是 CFF 并使能通道。
其余兩個通道配置過程大同小異,就不再復制粘貼那么多次了,完整的代碼可在先楫社區中獲取。最終的效果如下圖所示。
六、結 語
通過介紹,相信大家對 PLA 已經有了一個較為全面的了解。在 6200 系列剛推出時,許多開發者非常關注的一點就是 PLA 外設能不能當作 FPGA 使用,對此,我個人的看法是“能,但不完全能”。PLA 擁有完備的邏輯結構,但是其資源數量注定只適合小型邏輯使用,尤其是觸發器資源的缺乏,使得 PLA 很難單獨構建稍復雜的時序邏輯電路。因此我們在開發 PLA 程序之前,對資源數量要把控地比較準確,以免做無用功。
除了底層資源的限制,個人認為,使用方式上 PLA 也有其遺憾之處:
重復的配置代碼相當多,開發效率不高,寫代碼時容易發生錯誤
無法對內部信號進行調試,對復雜邏輯調試困難
“牽一發而動全身”,難以通過模塊化設計等方式復用現有資料
基于以上原因,我認為圖形化配置,程序自動生成配置代碼將會是 PLA 極好的開發方式:PLA 配置項繁多但并不復雜,代碼由機器生成非常合適;圖形化配置的方式降低了開發者編寫大量重復代碼時出錯的可能性,還可以通過抽象出電路圖的方式協助開發者調試;甚至還可以以此為基礎造出 PLA 的模擬器。
當然,即使沒有這些,PLA 也仍不失為構建簡單邏輯的好工具,也期待有更多開發者給出他們使用 PLA 的姿勢與心得,共同學習共同進步。
以上內容來自先楫開發者的原創分享。
審核編輯:劉清
-
mcu
+關注
關注
146文章
16992瀏覽量
350315 -
濾波器
+關注
關注
160文章
7728瀏覽量
177685 -
EDA工具
+關注
關注
4文章
264瀏覽量
31714 -
同步器
+關注
關注
1文章
94瀏覽量
14617 -
可編程邏輯器
+關注
關注
0文章
18瀏覽量
4349
原文標題:探秘HPM6200系列MCU的可編程邏輯陣列
文章出處:【微信號:mcugeek,微信公眾號:MCU開發加油站】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論