AG32:MCU和CPLD如何交互?

?

本文檔介紹了AG32開發中,MCU與CPLD交互的具體方式以及例子。如需了解AG32更多資料可發郵件:sales@agm-micro.com

一、MCU和CPLD直接交互

cpld工程創建及編譯的操作流程,參考文檔《AG32下fpga和cpld的使用入門》

在工程中,用戶邏輯部分編寫是從analog_ip.v的接口下開始的。

mcu和cpld之間的交互,可以分為:

1. mcu傳遞信號給cpld;(如mcu的gpio傳遞高低信號到cpld)

2. cpld傳遞信號給mcu;(如:對mcu產生中斷信號)

3. mcu讀寫數據到cpld;

4. 不建議,cpld做為主設備對mcu寫。

也就是說,在mcu和cpld交互中,cpld更像一個外設。

其中,前兩種較為簡單。后兩種要使用AHB總線來操作。

下邊針對四種情況分別說明:

1.?mcu傳遞信號給cpld

這種使用較簡單。步驟如下:

在ve中定義信號:

GPIO4_1
iocvt_chn:OUTPUT

表示,用mcu的gpio(gpio4_1)來輸入信號到cpld。

然后,prepare LOGIC工程后,可以看到analog_ip.v接口中的信號:

input?????????????iocvt_chn_out_data,

input?????????????iocvt_chn_out_en,

這里的iocvt_chn_out_data,就是對接到mcu的gpio4_1的信號。

當控制mcu的gpio4_1高低切換時,cpld中的iocvt_chn_out_data,會對應來變化。

具體樣例,可以參考網盤“logic樣例3.mcu信號到cpld到pin”的樣例,該樣例中,展示了mcu控制cpld繼續控制led的過程。

除了gpio信號輸出到cpld,其他比如pwm輸出信號等,都可以輸入到cpld。

2.?cpld傳遞信號給mcu

這種方式和1相近,只不過是反向。

可以在mcu中定義gpio4_2為輸入并使能中斷,則cpld中設置信號高低時,將觸發?mcu的中斷。

在VE中定義信號:

GPIO4_2
iocvt_chn:INPUT

表示,用mcu的gpio(gpio4_2)信號來源于cpld的iocvt_chn。

然后,prepare LOGIC工程后,可以看到analog_ip.v接口中的信號:

output?????????????iocvt_chn_in_data,

這里的iocvt_chn_in_data,就是對接到mcu的gpio4_2的信號。

當cpld中控制iocvt_chn_in_data信號高低時,mcu中的gpio4_2對應變化。

這里不再舉例。

3.?mcu讀寫數據到cpld

在地址設計中,cpld的地址區間是:0x60000000 ~
0x7FFFFFFF

當mcu對這個區間內的地址訪問時,相當于訪問了cpld的“寄存器”。

mcu是全局尋址,對這個空間的訪問和對ram(0x20000000起)空間的訪問是一樣的方式,在C代碼中,可以這樣寫:

讀cpld:int cpRdReg = *((int *)0x60000000);

寫cpld:*((int *)0x60000004) = cpWtReg;

Mcu端讀寫cpld較為簡單,直接通過上述語句就可以了。

當mcu讀寫動作發生時,cpld端是如何反應的?

當上述mcu讀寫動作發生時,AHB總線會把動作拆解為讀寫信號,傳遞到analog_ip.v的接口,用戶cpld程序需要響應該信號。

以下,以寫動作 *((int *)0x60000004) = cpWtReg 為例,描述cpld端會發生的事情。

回顧下analog_ip.v中的接口部分:

其中slave_ahb_開頭的一組信號,是cpld作為主端時用的,暫時不用理會。

Mem_ahb_開頭的一組信號,是cpld作為從端使用的。

當mcu有讀寫操作時,mem_ahb_這組信號將發生變化。

這部分是遵循標準的AHB總線協議的。如果對AHB總線印象不深,請自行百度。

可參考的講解:

https://blog.csdn.net/weixin_46022434/article/details/104987905

幾個信號的概述(更詳細的講解請自行百度):

Ahb_htrans: 當前傳輸類型(00: IDLE、01: BUSY、10: NONSEQ、11: SEQ)

Ahb_ready:mcu讀時要mcu要準備好cpld才會寫

Ahb_hwrite: 要讀還是要寫(1為寫,0為讀)

Ahb_haddr[32]: 要操作的地址

Ahb_hsize:transfer的大小,以字節為單位

Ahb_hburst:批量傳輸

Ahb_hwdata[32]:寫的數據,32位

Ahb_hreadyout:輸出信號,mcu寫時cpld是否準備好

Ahb_hresp:輸出信號,響應信號(OK、retry、error、split)

Ahb_hrdata[32]:讀的數據,32位

根據AHB時序,在一次傳輸中,cpld(slave端)會先拿到addr地址,讀或寫的標記,然后交互ready信號后,開始數據傳輸。

大致如下圖(無等待類型的圖):

比如,mcu要讀0x60000004的寄存器:

mcu端直接C語言這樣調用:int cpRdReg = *((int
*)0x60000004);

cpld端,可以根據以上信號做如下處理:

----------------------------------------------

//mcu的讀操作響應

//mcu端用C語言:int value = *((int *)0x60000004);

reg [31:0] hrdata_reg; ?????? //定義32位的hrdata_reg

always @(posedge sys_clock) begin??????? //clk上升沿觸發

if (mem_ahb_htrans ==
2'b10 &&? ???????? //NONSEQ
狀態,第一次傳輸

? mem_ahb_hready && ??????????????? ????????? //master已ready,可以給數據線寫入了

? !mem_ahb_hwrite &&??????? ???????? //(0?讀,1?寫)

? mem_ahb_haddr[23:0] == 'h04) ??????? //讀地址為0x60000004(cpld用相對偏移)

begin

hrdata_reg <=
hwdata_reg;????????????? //
把另一準備好的數據給到hrdata_reg

end

end

assign mem_ahb_hrdata = hrdata_reg;//綁定hrdata_reg到讀的數據線上

-----------------------------------------------

以上代碼,加入到analog_ip.v的module下,就可以完成cpld對mcu讀動作的響應。

比如,mcu要寫0x60000000的寄存器:

mcu端直接C語言這樣調用:*((int *)0x60000000)
= value;

cpld端,可以根據以上信號做如下處理:

----------------------------------------------

//mcu的寫操作響應

//mcu端用C語言:*((int *)0x60000000) = value;

reg [31:0] hwdata_reg;?????? //定義32位的hwdata_reg

always @(posedge sys_clock) begin??????? //clk上升沿觸發

if (mem_ahb_htrans ==
2'b00 &&? ?????? //IDLE
狀態

? mem_ahb_hreadyout && ????????? ???????? //cpld已ready狀態,ahb上數據可以寫過來

? mem_ahb_hwrite &&??????? ????????? //(0?讀,1?寫)

? mem_ahb_haddr[23:0] == 'h00) ??????? //寫地址為0x60000000(cpld用相對偏移)

begin

hwdata_reg <=
mem_ahb_hwdata;???????? //
把收到的數據給到hwdata_reg

end

end

//這個過程,是把mcu寫進來的數據收到hwdata_reg

-----------------------------------------------

這部分的實例代碼,請參考網盤上cpld樣例工程《5.mcu讀寫cpld寄存器》。

注意:這里展示的,僅僅是基于AHB總線上的數據交互。

在實際應用中,比如要實現一個串口之類的,往往是慢速設備,這些是要掛載到apb上的。慢速設備要經過ahb到apb的bridge,才能最終使用。請繼續往下看。

二、mcu通過ahb轉apb后的數據交互

上節講述了mcu和cpld之間交互數據的實現方式。

但數據是在ahb層面的響應,慢速設備不能直接使用。

慢速設備需要ahb轉為apb后,使用apb的信號來交互。這種情況,轉變為mcu和apb之間的交互。

mcu和apb之間的交互,相比mcu和aph之間的交互,多了一層ahb到apb的轉換。這個轉換是借助于ahb2apb.v模塊來實現的(在example/analog下找該.v文件)。

該模塊:輸入是ahb的一組信號,輸出是apb的一組信號。使用如下圖:

如果實現mcu和apb的交互,則需要操作的是轉換后的這組apb信號。

關于apb總線的使用,更多信息請自行百度。

這里只是簡述下apb信號列表(與ahb略有不同):

apb_psel:片選

apb_penable:表示傳輸進入第二周期(準備好了讀/寫)

apb_pwrite:傳輸方向(1-寫;0-讀)

apb_paddr[32]:地址總線,要操作的地址

apb_pwdata[32]:寫的數據,32位

apb_prdata[32]:讀的數據,32位

以下展示在apb下如何實現跟mcu的交互,仍以ahb的兩個寄存器為例。

1. 首先需要增加ahb轉apb的信號關聯;

如上圖。

Ahb2apb模塊會把ahb信號轉換為apb信號。接下來操作apb信號即可。

2. 在轉換后的apb信號中,實現寫和讀的操作。

mcu讀操作時:

比如,mcu要讀0x60000004的寄存器:

mcu端直接C語言這樣調用:int cpRdReg = *((int
*)0x60000004);

cpld端,可以根據以上信號做如下處理:

----------------------------------------------

//mcu的讀操作響應

//mcu端用C語言:int value = *((int *)0x60000004);

reg [31:0] ardata_reg;?????? //定義32位的hrdata_reg

always @(posedge apb_clock) begin????? //clk上升沿觸發

if (!apb_pwrite
&&??????? ???????????????????? //
讀?(0?讀,1?寫)

apb_penable
&&???????????????????????????????? //
是否準備好

apb_paddr[11:0]
== ‘h04)??? //
讀地址為0x60000004(cpld內部用相對偏移)

begin

ardata_reg <=
awdata_reg;????????????? //
把另一準備好的數據給到hrdata_reg

end

end

assign apb_prdata = ardata_reg;//綁定hrdata_reg到讀的數據線上

-----------------------------------------------

mcu寫操作時:

比如,mcu要寫0x60000000的寄存器:

mcu端直接C語言這樣調用:*((int *)0x60000000)
= value;

cpld端,可以根據以上信號做如下處理:

----------------------------------------------

//mcu的寫操作響應

//mcu端用C語言:*((int *)0x60000000) = value;

reg [31:0] awdata_reg;?????? //定義32位的hwdata_reg

always @(posedge apb_clock) begin????? //clk上升沿觸發

if (apb_pwrite
&&??????? ????????????????????? //
寫?(0?讀,1?寫)

apb_penable
&&???????????????????????????????? //
是否準備好

apb_paddr[11:0]
== ‘h00)? //
寫地址為0x60000000(cpld內部用相對偏移)

begin

awdata_reg <=
apb_pwdata;?????????? //
把收到的數據給到hwdata_reg

end

end

//這個過程,是把mcu寫進來的數據收到hwdata_reg

-----------------------------------------------

這個功能實現后,其實是個簡單的“空外設”。可以用它做為實現復雜功能外設的基礎。

這部分的實例代碼,請參考網盤上cpld樣例工程《5.mcu讀寫cpld寄存器》。

樣例展示到這里,mcu和cpld的交互上:交互信號、跟ahb交互數據、跟apb交互數據,基本的交互通路已經建立。

接下來,用戶根據自己的需求,在cpld中交互到數據后,編寫自己需要的功能即可。

三、DMA在CPLD中的使用

cpld中實現DMA的邏輯:

1. MCU為master,cpld為slave,mcu對cpld的交互方式為存取寄存器的方式;

2. mcu中配置好DMA(讀取cpld中準備好的數據);

3. cpld中準備好數據后,觸發dma信號,dma自動搬運到mcu指定的ram;

4. 搬運一次后,dma給cpld一個clear信號,完成一次dma搬運;

5. 等到cpld中再次準備好數據,將再次觸發dma信號,重復3和4;

對于cpld來說,mcu來讀取數據和dma來讀取數據,是一致的。

dma來讀取時,只是每次讀完后會多給cpld一個clear信號。

更多細節,請參考網盤上《7.cpld中配合實現mcu的dma讀取》部分的樣例。

在這個樣例中,展示了兩部分代碼:

1. mcu中,配置dma讀取;為了測試,mcu會在另一地址給cpld寫數據;

2. cpld中,會對mcu寫進來的數據緩存,緩存后觸發dma的信號,讓dma來讀取數據。而dma從cpld里讀取數據后會給cpld一個clear信號,標志一次dma交互完成。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900471.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900471.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900471.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

機器人軌跡跟蹤控制——CLF-CBF-QP

本次使用MATLAB復現CLF-CBF-QP算法,以實現機器人軌跡跟蹤同時保證安全性能 模型 使用自行車模型來進行模擬機器人的移動動態,具體的模型推導參考車輛運動學模型-自行車模型 采用偏差變量 p ~ = p ? p r e f u ~ = u ? u r e f \tilde{p} = p - p_{ref} \\ \tilde{u} = …

009_抽象類和接口

抽象類和接口 final關鍵字常量 單例模式&#xff08;設計模式&#xff09;枚舉類抽象類抽象類的注意事項、特點使用抽象類的好處模版方法設計模式 接口接口的好處接口的注意事項 final關鍵字 final關鍵字是最終的意思&#xff0c;可以修飾類、方法、變量。 修飾類&#xff1a;…

新潮透明液體水珠水滴失真故障扭曲折射特效海報字體標題設計ps樣機動作素材 Bubble Photoshop Templates

只需單擊幾下即可創建引人注目的視覺效果&#xff01;您需要做的就是將您的文本或圖像放入智能對象中并應用作。 包中包含&#xff1a; 15 個靜態 Photoshop 模板&#xff08;PS 2019 及更高版本&#xff09; 01-05 垂直布局 &#xff08;22504000&#xff09;06-10 水平布局…

Android DiaLog全屏設置,帶有叉號的彈窗,這個彈窗分為兩個部分,一個是主體,另一個是關閉部分。自定義布局彈窗

1.先上圖。要實現的效果圖。 2.這是我自己實現的效果圖&#xff0c;是不是跟效果圖一摸一樣 來看看整體效果 3.我把自己實現的效果圖的代碼寫出來。如下就是我的代碼 3.1首先是MainActivity類 import androidx.appcompat.app.AppCompatActivity;import android.app.Alert…

NVR接入錄像回放平臺用EasyCVR打造地下車庫安防:大型商居安全優選方案

一、背景分析 隨著居民生活品質的提升&#xff0c;大型商業建筑和住宅小區紛紛配套建設地下停車庫。但是地下車庫盜竊、失火、惡意毀壞車輛、外部人員隨意進出等事件頻發&#xff0c;部署視頻監控系統成為保障地下車庫的安全關鍵舉措。 目前&#xff0c;很多商業和住宅都會在…

階段測試 【過程wp】

分享總結: 回顧起來,真的感慨很多呀。看著并不難啊,但難的是解題思維:如何判斷該頁面的關鍵點,快速地確定問題的核心,找到對應的解決方法。達到便捷、高效的得到結果。我們做了整整近七個半小時。在這個過程中,我發現自己的思維鈍化,不太能自主高效地劃分判斷漏洞類型,…

【C++】<STL部分>:STL標準模板庫概要

STL(standard template libaray-標準模板庫)&#xff0c;是C標準庫的重要組成部分&#xff0c;包含了很多常用的數據結構和算法。 在我們學習了模板的之后&#xff0c;再來看STL&#xff0c;就能知道它是C標準庫中的模板類和模板函數的集合&#xff0c;作為可復用的庫大大提高…

從傳遞函數到PID控制器

在過程控制中&#xff0c;按偏差的比例&#xff08;P&#xff0c;Proportional&#xff09;、積分&#xff08;I&#xff0c;Integral&#xff09;和微分&#xff08;D&#xff0c;Differential&#xff09;進行控制的PID控制器&#xff08;亦稱PID調節器&#xff09;是應用最為…

【PVR Review】《A Review of Palmar Vein Recognition》

[1]張秀峰,牛選兵,王偉,等.掌靜脈識別研究綜述[J].大連民族大學學報,2020,22(01):33-37.DOI:10.13744/j.cnki.cn21-1431/g4.2020.01.007. 文章目錄 1、背景2、手掌靜脈識別方法2.1、傳統手掌靜脈圖像識別方法2.2、基于深度學習的掌靜脈圖像識別 3、手掌靜脈識別難點 1、背景 目…

vector復制耗時

CPP中的vector對象在傳參給子函數時&#xff0c;如果直接傳參&#xff0c;會造成復制給形參的額外耗時 如何解決這個問題呢&#xff1f; 這樣定義局部函數 const vector <int>&vec可以保證傳遞vector對象時使用地址傳遞&#xff0c;并且使用const保證vector不被改變…

算法思想之雙指針

文章目錄 雙指針字符串序列判定字符串所有整數最小和服務交換接口失敗率分析分披薩最多團隊 雙指針 雙指針是指在解決問題時使用兩個指針&#xff0c;通常分別指向數組或字符串中的不同位置&#xff0c;通過移動這兩個指針來解決問題的一種技巧。雙指針技巧常用于解決數組、鏈…

學透Spring Boot — 018. 優雅支持多種響應格式

這是我的專欄《學透Spring Boot》的第18篇文章&#xff0c;想要更系統的學習Spring Boot&#xff0c;請訪問我的專欄&#xff1a;學透 Spring Boot_postnull咖啡的博客-CSDN博客。 目錄 返回不同格式的響應 Spring Boot的內容協商 控制器不用任何修改 啟動內容協商配置 訪…

ngx_os_init

定義在 src\os\unix\ngx_posix_init.c ngx_int_t ngx_os_init(ngx_log_t *log) {ngx_time_t *tp;ngx_uint_t n; #if (NGX_HAVE_LEVEL1_DCACHE_LINESIZE)long size; #endif#if (NGX_HAVE_OS_SPECIFIC_INIT)if (ngx_os_specific_init(log) ! NGX_OK) {return NGX_ERR…

深信服護網藍初面試題

《網安面試指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇網安資料庫https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…

游戲引擎學習第206天

回顧并為當天的工作定下目標 接著回顧了前一天的進展。之前我們做了一些調試功能&#xff0c;并且已經完成了一些基礎的工作&#xff0c;但是還有一些功能需要繼續完善。其中一個目標是能夠展示實體數據&#xff0c;以便在開發游戲邏輯系統時&#xff0c;可以清晰地查看和檢查…

HTML 表單:構建交互式網頁的關鍵元素

HTML 表單:構建交互式網頁的關鍵元素 引言 HTML表單是構建交互式網頁的核心組件之一,它允許用戶與網站進行交互,提交信息、填寫問卷或進行其他操作。本文將深入探討HTML表單的基礎知識、常用元素、表單驗證以及如何優化表單設計,以提高用戶體驗和網站的可訪問性。 HTML表…

Qt音頻采集:QAudioInput詳解與示例

1. 簡介 QAudioInput是Qt Multimedia模塊中用于音頻采集的核心類&#xff0c;能夠從麥克風等輸入設備實時獲取原始音頻數據&#xff08;PCM格式&#xff09;。本文將通過原理講解和代碼示例&#xff0c;幫助開發者快速掌握音頻采集的核心技術。 2. 核心功能 支持多種音頻格式&…

下載安裝Node.js及其他環境

提示&#xff1a;從Node版本降級到Vue項目運行 文章目錄 下載Node.js環境配置配置環境變量 安裝 cnpm&#xff08;我需要安裝&#xff09;安裝腳手架安裝依賴安裝淘寶鏡像&#xff08;注意會更新&#xff09;cnpm vs npm 與新舊版本核心差異包管理器不同功能差異如何選擇&#…

【后端】ORM / ODM

長期不定期更新&#xff0c;建議關注收藏點贊。 概述 ORM&#xff08;Object-Relational Mapping&#xff0c;對象關系映射&#xff09;&#xff1a;面向關系型數據庫&#xff0c;ORM將對象映射到數據庫的表和行&#xff08;例如MySQL、PostgreSQL&#xff09;。ODM&#xff0…

無限滾動(Infinite Scroll)頁面谷歌不收錄!必須改回分頁嗎?

近三年&#xff0c;全球超過58%的網站采用無限滾動設計&#xff08;數據來源&#xff1a;PageTraffic 2023&#xff09; 谷歌官方數據顯示&#xff0c;動態加載內容的索引失敗率高達73%&#xff08;Google Webmaster Report 2022&#xff09;&#xff0c;而采用純無限滾動的頁…