• 正文
    • 一、前述
    • 二、基礎(chǔ)了解
    • 三、安裝軟件
    • 四、CPLD使用流程
    • 五、上述過程中的說明
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

mcu+cpld 聯(lián)合編程(概念及流程)

04/22 09:22
359
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

在使用mcu+cpld聯(lián)合編程之前,請確認已經(jīng)熟練掌握mcu的使用方法,并且對cpld編程(verilog語言)有一定的基礎(chǔ)。

另外,對AHB總線也需要有一定的了解。

這個章節(jié)分為兩部分:

第一部分,展示聯(lián)合編程中各種概念和操作流程;

第二部分,從具體案例出發(fā),由淺到深來描述各種常用的編程技巧。

.

以下描述為第一部分(概念和流程)。如要查看實例講解,請參考第二部分。

.

一、前述

在AG32芯片(所有型號)中,都有內(nèi)嵌2K的邏輯門,可供fpga/cpld來使用。

也就是說,使用AG32的芯片時,有三種選擇:

  1. 只使用mcu部分;
  2. 只使用cpld部分;
  3. 同時使用mcu和cpld(即:mcu和cpld聯(lián)合編程);

如果:

用于1(僅用做mcu),不必關(guān)注此文檔。

用于2(僅用做cpld),硬件設(shè)計和操作流程,請?zhí)D(zhuǎn)到“純粹cpld編程”,也不必關(guān)注此文檔。

用于3(mcu和cpld聯(lián)合編程):請按照該文檔的描述,先完整走一個流程。

.

二、基礎(chǔ)了解

1. AG32整顆芯片包含兩部分:mcu和cpld。

這兩部分是相互獨立的(各自編譯、各自下載),但又可以相互連通起來(信號連通)。

芯片要把這兩部分的bin都燒錄進去,才能運行起來。

2. mcu和cpld到外部Pin腳的連通,是通過VE文件來配置的。

跟ST芯片每個Gpio對應(yīng)某個固定Pin腳不同,在AG32中,所有的Gpio/大部分的外設(shè),對外引腳并不是定死的。而是需要在VE文件中指定對應(yīng)。

VE中,除了配置Gpio到Pin的關(guān)聯(lián),還可以配置mcu到cpld之間的信號關(guān)聯(lián)。

3. Mcu+cpld聯(lián)合編程時,cpld工程是由vscode的“prepare LOGIC”命令自動生成的。

注意:聯(lián)合編程時,cpld工程不能手工通過supra建立。

cpld的對外接口,也是依托于vscode工程來的,不再是孤立的。

cpld中的top module的信號輸入,是關(guān)聯(lián)到mcu工程的(由VE配置出來)。

4. cpld在聯(lián)合編程中的定位:

整顆芯片運行時,需要兩個bin:mcu的bin和cpld的bin。

如果芯片中只使用mcu不使用cpld:

此時,VE文件里只配置mcu用到的Pin腳即可。

這種情況下,vscode工程中點“upload LOGIC”時,會自動生成默認logic(該logic中“用戶邏輯”為空而已),并編譯出bin并燒錄。

整個過程中,logic部分對開發(fā)者來說是無感的。

如果芯片中同時使用mcu和cpld:

那么要把工程配置成“自定義logic”。

此時VE文件里需要配置用到的mcu和pin之間、mcu和cpld之間、cpld和pin之間,三種情況下的信號關(guān)聯(lián)。

這種情況下,VSCode下點“prepare LOGIC”按鈕,會為開發(fā)者生成cpld的框架工程。開發(fā)者需要在這個框架下完成cpld邏輯的編寫。這個編寫調(diào)試中,開發(fā)者持有主動權(quán)。等全部開發(fā)完成,并編譯出bin,燒錄就又回到VSCode去燒錄。

這個過程,除了logic需要用戶自己編寫編譯外,從更外層的視角看,整個流程還是跟“默認Logic”是相同的。

.

三、安裝軟件

mcu需要使用到的VSCode前邊已經(jīng)安裝過了。

fpga/cpld需要使用Supra和Altera Quartus II兩個軟件來編程。

其中:

Supra.exe軟件在安裝完SDK后,已經(jīng)在SDK路徑下了,可直接使用(無需額外安裝Supra)。

(注:如果在SDK路徑下沒有找到Supra.exe,可進入安裝路徑AgRV_piopackagestool-agrv_logicbin去找到。同時建議手工新建一個快捷方式到SDK路徑下以方便后續(xù)使用)

Altera Quartus II軟件需要用戶自行安裝,安裝后再安裝對應(yīng)的器件庫。

(注意:Quartus不能使用Lite版本,需要使用Full版本。最好使用版本:Quartus II 64-Bit Version 13.0.1 Build 232 06/12/2013 SJ Full Version)

在這兩個軟件中,

Quartus工具用來編寫vlog代碼并導出vo文件,Supra工具使用vo文件來生成最終的bin。

.

四、CPLD使用流程

從使用角度來說,整體需要4個步驟:

  • 1.在VE文件里配置引腳關(guān)系;
  • 2.建立cpld空工程(使用prepare LOGIC命令)并編寫邏輯;
  • 3.Quartus下進行工程轉(zhuǎn)換(和綜合);
  • 4.Supra下編譯出最終的logic.bin;

下邊進入詳細描述。

1.在VE里定義引腳和信號關(guān)系

這部分和MCU使用是相仿的。

在mcu里,都是mcu信號直接到PIN腳的映射。比如:

那么,在使用cpld里,除了上述的“mcu信號到Pin腳”關(guān)聯(lián)外,還允許“mcu信號到cpld信號”“cpld信號到Pin腳”的兩種關(guān)聯(lián)。這里描述的三種關(guān)聯(lián),是常見的三種信號關(guān)聯(lián)方式。詳細使用方法,后續(xù)會介紹。

這里需要知道的是,每次VE文件修改完以后,都要重新走一遍整個流程(從prepare LOGIC開始)。

其實不光修改完VE需要重新走一遍流程,有時修改platformio.ini也需要重新走一遍流程(比如,修改管腳數(shù)量)。

如果是第一次試驗example例程,可以不用修改,使用默認的VE文件即可。

2.生成空的cpld工程

仍然以example(路徑:...AgRV_pioplatformsAgRVexamplesexample)為例建立工程。

在example樣例程序中,默認是沒有打開自定義ip的。

首先,要通過配置打開自定義ip

方法:在platformio.ini中打開以下兩項:

ip_name = analog_ip

logic_dir = logic

注意:這兩行去掉注釋的時候,前邊不要留空格。要頂格寫。

打開以上兩項并保存文件后,才能在左邊欄看到創(chuàng)建logic框架工程的選項(prepare LOGIC):

點擊該功能【Prepare LOGIC】后,可以看到在example工程目錄下生成一個logic文件夾,自動生成的文件如下圖:

這里生成的logic文件夾,就是空的cpld工程。也是后續(xù)編寫cpld的模板工程(后續(xù)代碼在這個基礎(chǔ)上添加)。

關(guān)于改寫文件名:

這里的文件名字,是根據(jù)platformio.ini里邊的配置項來的:

board_logic.ve = example_board.ve

ip_name = analog_ip

logic_dir = logic

如果想改文件名字,可先在platformio.ini中更改名字,更改后再點生成按鈕來自動生成。可更改的名字,就是上邊的三項:

board_logic.ve 對應(yīng)logic文件夾內(nèi)example_board.v的名字

Ip_name 對應(yīng)logic文件夾內(nèi)analog_ip.v的名字

Logic_dir 對應(yīng)文件夾logic的文件夾名字

在生成后的文件夾內(nèi),注意其中的兩個.v文件:analog_ip.v和example_board.v。

這兩個文件是vlog的源碼文件。

其中:

analog_ip.v是一份空的模板,用戶自己要實現(xiàn)的功能,就在這個空模板上展開;這個空的模板里邊,主要就是module analog_ip的接口定義。

example_board.v是根據(jù)工程中example_board.ve里的pin配置,Logic prepare時自動轉(zhuǎn)換出來的v源碼,也是supra工程的top module。這部分不要手工改動。

到這里,cpld空工程建立完畢。

注意:

后期修改完VE的配置后,Prepare LOGIC時,會重新生成 cpld工程模板,這個模板文件都仍然存到logic文件夾下,且仍然是這兩個.v文件。

只不過analog_ip.v對應(yīng)新增出analog_ip_tmpl.v文件,而example_board.v則是直接覆蓋。

由于analog_ip.v是用戶程序的入口,用戶程序會從這里開始寫。這個文件一定是會修改的。所以,每次prepare LOGIC時,這個文件會對應(yīng)生成 analog_ip_tmpl.v文件,而不是覆蓋。

生成出analog_ip_tmpl.v后,用戶要根據(jù)自己的情況,把新接口手動合并到analog_ip.v去。

注:這里只是以example來舉例。實際應(yīng)用中,在導出空工程前,需要先配置好platformio.ini的其他項和example_board.ve所需要的引腳。包括:board_logic.device配置32/48/64/100腳。

也就是第一步要做的內(nèi)容。

3. Quartus下進行工程轉(zhuǎn)換

使用前邊安裝過的Quartus II軟件,打開examplelogic的工程文件。打開后如圖:

這里除了example_board.v和analog_ip.v外,還有個系統(tǒng)的alta_sim.v,這個文件是提供芯片系統(tǒng)的功能,類似函數(shù)庫,可不用關(guān)注。

此時,這個工程是個空的工程,用戶要根據(jù)需求在analog_ip.v中實現(xiàn)功能。

再次回顧下3個.v文件:

  1. analog_ip.v:用戶自定義logic的入口。用戶logic實現(xiàn)在這里展開;
  2. example_board.v:整個logic的top module。會關(guān)聯(lián)analog_ip的module和atla_sim下的各module。不要修改該文件。
  3. alta_sim.v:封裝過的跟AG32相關(guān)的各module。不要修改該文件。

接下來進行空工程的轉(zhuǎn)換和編譯。

注意:如果不是很熟練,這里的空工程最好不要馬上添加自己的代碼。而是應(yīng)該首先工程轉(zhuǎn)換。

工程轉(zhuǎn)換的目的,是把cpld模板工程真正轉(zhuǎn)換成quartus實際運行的狀態(tài)。

操作步驟:

打開Quartus菜單的【tools】->【Tcl Scripts...】,彈出框如下圖:

【Run】運行成功后,可以看到該logic占用的資源數(shù)量。

這個轉(zhuǎn)換的過程,順便進行了cpld工程的編譯。

上圖中斜杠前邊標識的大小就是所占的邏輯單元數(shù)(后續(xù)使用中邏輯單元不能超過2K,嚴格講,是2112個邏輯單元)

注意:第一次導入工程,必須執(zhí)行上圖的方式來轉(zhuǎn)換。后續(xù)編寫和修改cpld代碼后,可以仍然執(zhí)行上圖方式,也可以直接點下圖的“編譯”按鈕來編譯。

執(zhí)行到這里,會在logic下生成vo文件出來(在logicsimulationmodelsim下)。

如果用戶有自己的邏輯,可以在這時,把邏輯加入到analog_ip.v中去,并點上圖的三角號重新編譯。

到這里,Quartus工具的任務(wù)也完成了。

接下來打開Supra來繼續(xù)生成bin文件。

4.Supra下編譯出最終的bin

在Supra工具里,打開該工程(examplelogic)。

然后,點擊【左上角Tool】->【Compile】,在彈出的畫面中點右下角的【run】。

編譯成功后,畫面會有提示。

Compile design example_board?done?with code?0

然后在logic路徑下可以看到新編譯出來的bin。

這個bin就是要燒錄到芯片的cpld.bin。

到這里,supra工具的任務(wù)完成。

.

至于燒錄,重新回到VSCode下燒錄logic即可。如下圖:

到這里,新建一個空工程、轉(zhuǎn)換、編譯、燒錄的整個流程描述完畢。

強調(diào):

后續(xù)如果在VE里修改過配置,則需要走一個全過程:vscode下prepare LOGIC再生成一遍cpld模板、合并analog_ip_tmpl.v到analog_ip.v中去、啟動quartus去轉(zhuǎn)換、supra下編譯,回到vscode下燒錄logic。

后續(xù)如果只是在quartus下編寫cpld代碼,需要走的幾步:quartus下編譯、supra下編譯、回到vscode下燒錄logic。

.

五、上述過程中的說明

上述流程中涉及兩個比較關(guān)鍵的點:

1. 自定義模塊的命名

自定義的邏輯,自定義文件名必須與自定義模塊名相同,就是在platformio.ini中設(shè)置的ip_name的名字。

這個對應(yīng)關(guān)系,在上述流程點prepare LOGIC自動生成代碼時,會自動完成。

如果是手工編輯的邏輯代碼,或者對這里的命名進行過改動,會出現(xiàn)后續(xù)Quartus中使用的異常。

2. Ve中定義的信號關(guān)聯(lián)

在AG32中,mcu和cpld和外部引腳,三者是相互獨立的。

  1. mcu用的IO,在ve里,可以關(guān)聯(lián)到外部引腳Pin_xx;
  2. cpld用的IO,在ve里,可以關(guān)聯(lián)到外部引腳pin_xx;
  3. mcu的某一路信號又可以直接和cpld的某一路信號,在ve里,關(guān)聯(lián)起來;

所以,ve是很關(guān)鍵的一個橋梁。

在ve中定義好以后,運行prepare LOGIC會自動產(chǎn)生cpld的頂層模塊的輸入輸出接口,這些接口就是cpld和mcu與外部引腳關(guān)聯(lián)的信號通路。

這里著重描述下3種情況在VE文件里的定義。

A. mcu和外部引腳的關(guān)聯(lián)

比如,定義gpio到外部引腳:GPIO4_3 PIN_32

比如,定義串口0到外部引腳:UART0_UARTRXD PIN_31

定義格式為:mcu的FunctionName + 空格 + Pin腳ID。
這部分在 mcu 使用里描述的很多了,不再贅述。

B. cpld和外部引腳的關(guān)聯(lián)

比如,定義led到外部引腳:LED_D3 PIN_32:OUTPUT

定義格式為:cpld信號名稱 + 空格 + Pin腳ID:方向
其中,
cpld 信號名稱,是自定義名稱,這個名稱隨后可以在 cpld 中引用;
方向,有 3 種:OUTPUT、INPUT 和 INOUT(這個方向是 cpld 對外部引腳來說的)。
方向是可選的,可加可不加。如果不加,則是默認的 INOUT(雙向)。
上述定義在 ve 里添加后,執(zhí)行 prepare LOGIC 命令,在自動生成的 cpld 工程中,可以看到輸出到 cpld 頂層模塊接口中的 item 如下:

那么,
input?BTN_L1: 是 pin 到 cpld 的信號;
output?LED_D2: 是 cpld 到 pin 的信號;
output?LED_D3: 是 cpld 到 pin 的信號;
然后在 cpld 代碼中操作 LED_D3 這個信號的高低,最終操作的 PIN_32 管腳的高低。
(注:VE 里每行最后定義的方向是可選的)

C. mcu和cpld之間的關(guān)聯(lián)

比如,定義 gpio 信號到 cpld:GPIO4_1 iocvt_chn
比如,定義串口 1 的 tx 信號到 cpld:UART1_UARTTXD txd_chn

定義格式為:MCU的FunctionName + 空格 + cpld信號名稱
其中,
這里的 FunctionName,同 1 中的 FunctionName,就是 mcu 里的通路定義。更多定義參考《AGRV2K_邏輯設(shè)置.pdf》,里邊有全部的 mcu 端可用的 FunctionName 列表。
除了 mcu 的 FunctionName(映射到引腳)外,mcu 對 cpld 還開放出更多的內(nèi)核級通路接口,如:mem_ahb_各通道,dma 各通道,mcu 的 reset 和 stop 等信號,具體定義也參考《AGRV2K_邏輯設(shè)置.pdf》。
這里定義后,執(zhí)行 prepare LOGIC 命令,在自動生成的 cpld 工程中,可以看到輸出到cpld頂層模塊接口的 item 如下:

對于 iocvt_chn 來說,對應(yīng)的是沒有指定方向的普通 gpio(GPIO4_3)口,則這里生成的信號同時包含有輸入輸出兩種。
注:這里的輸入和輸出,是相對于 cpld 端來說的。藍色的?input/output,就是該信號的方向。比如:
output?iocvt_chn_in:是 cpld 輸出到 mcu 的信號;
input?iocvt_chn_out_data:是 mcu 輸出到 cpld 的信號;
input?iocvt_chn_out_en:是 mcu 輸出到 cpld 的信號(en 信號很少用,一般可忽略);

對于 txd_chn 來說,由于 mcu 的串口 TX 是定義好方向的,是 mcu 的 output 方向。所以在 cpld 里只有兩個 item 項:
input?txd_chn_out_data:是 mcu 輸出到 cpld 的信號;
input?txd_chn_out_en:是 mcu 輸出到 cpld 的信號(en 信號很少用,一般可忽略);

如果對普通 GPIO 也設(shè)置了方向,則導出到 cpld 的方向也就只有對應(yīng)方向的信號了。
如:VE 里設(shè)置 GPIO4_1 iocvt_chn 為 mcu 的輸出:

則prepare LOGIC后生成的item只有input的兩項。如下:

注意:在mcu和cpld信號連接中,mcu的output就是cpld的input。

.

到這里,第一部分(mcu+cpld使用的概念和流程)描述完畢。

下個章節(jié),第二部分,將以樣例為基礎(chǔ),描述mcu+cpld在具體使用中怎么體現(xiàn)。

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄