tft每日頭條

 > 生活

 > matlab代碼自動生成verilog代碼

matlab代碼自動生成verilog代碼

生活 更新时间:2024-11-22 15:05:35

前言

該文檔是剛畢業時做項目時用到的一些VC MATLAB混編的内容,供大家分享,有什麼問題請大家批評指正。

VC MATLAB混編主要有兩種方式:

第一種是運用MATLAB引擎,該方法的優點是在轉成VC代碼的時候隻需要使用固定函數,然後将MATLAB代碼完全複制,最後将VC和MATLAB的變量轉換接口寫好就可以了。缺點是需要安裝整個MATLAB,依賴于MATLAB的自啟動,而且程序運行效率較差。

第二種是應用MATLAB自帶編譯器,将函數編譯成DLL和LIB文件,供VC程序調用。該方法優點是VC程序可以直接調用生成庫文件裡的函數,隻需将VC程序裡的變量轉換成MATLAB函數需要的變量類型即可,而且程序運行效率較好。缺點不便于調試。

1. MATLAB引擎

1.1. 在64位win7操作系統下使用MATLAB2012b引擎的配置

1.1.1添加環境變量

Path變量中添加C:\Program Files\MATLAB\R2012b\bin\win64,如圖1-1到圖1-5所示。注意:添加完之後一定要重啟計算機。

matlab代碼自動生成verilog代碼(VCMATLAB混編技術文檔)1

圖1-1 添加環境變量-1

matlab代碼自動生成verilog代碼(VCMATLAB混編技術文檔)2

圖1-2 添加環境變量-2

matlab代碼自動生成verilog代碼(VCMATLAB混編技術文檔)3

圖1-3 添加環境變量-3

matlab代碼自動生成verilog代碼(VCMATLAB混編技術文檔)4

圖1-4 添加環境變量-4

matlab代碼自動生成verilog代碼(VCMATLAB混編技術文檔)5

圖1-5 添加環境變量5

1.1.2 X64平台配置

在VS中需要添加MATLAB引擎環境的工程中設置成x64平台。進入“配置管理器”,增加x64平台,如圖1-6到1-8所示。

matlab代碼自動生成verilog代碼(VCMATLAB混編技術文檔)6

圖1-6 X64平台配置-1

matlab代碼自動生成verilog代碼(VCMATLAB混編技術文檔)7

圖1-7 X64平台配置-2

matlab代碼自動生成verilog代碼(VCMATLAB混編技術文檔)8

圖1-8 X64平台配置-3

1.1.3 添加頭文件和庫文件

到項目屬性中的C 目錄中:

包含目錄增加:C:\Program Files\MATLAB\R2012b\extern\include

庫目錄增加:C:\Program Files\MATLAB\R2012b\extern\lib\win64\microsoft

步驟如圖1-9到圖1-13所示。

最後添加上添加使用MATLAB引擎和函數需要的庫文件和頭文件:

#include “mat.h”

#include “engine.h”

#progma comment(lib,”libmx.lib”)

#progma comment(lib,”libmat.lib”)

#progma comment(lib,”libeng.lib”)

如圖1-14所示

matlab代碼自動生成verilog代碼(VCMATLAB混編技術文檔)9

圖1-9 添加頭文件和庫文件-1

matlab代碼自動生成verilog代碼(VCMATLAB混編技術文檔)10

圖1-10 添加頭文件和庫文件-2

matlab代碼自動生成verilog代碼(VCMATLAB混編技術文檔)11

圖1-11 添加頭文件和庫文件-3

matlab代碼自動生成verilog代碼(VCMATLAB混編技術文檔)12

圖1-12 添加頭文件和庫文件-4

matlab代碼自動生成verilog代碼(VCMATLAB混編技術文檔)13

圖1-13 添加頭文件和庫文件-5

matlab代碼自動生成verilog代碼(VCMATLAB混編技術文檔)14

圖1-14 添加頭文件和庫文件-6

1.2. 使用MATLAB引擎VC與MATLAB變量轉換說明

1.2.1 啟動MATLAB引擎

在VC中使用MATLAB引擎首先要啟動MATLAB引擎,代碼如下:

Engine* ep; //定義MATLAB引擎指針。

If (!(ep=engOpen(NULL))) //測試是否啟動MATLAB引擎成功。

{

AfxMessageBox(“Can’t start Matlab engine”);

}

1.2.2 寫MATLAB函數命令

在VC使用MATLAB引擎中,寫MATLAB語句非常簡單,例如寫一句MATLAB語句

“Figure,imshow(I)”,在VC中隻要寫成“engEvalString(ep,”Figure,imshow(I);”);”。

當MATLAB語句較長的時候或者有FOR循環或者IF語句的時候,可以将MATLAB代碼寫在一個engEvalString函數裡,用“\”換行。舉例如下:

MATLAB代碼:

for i=1:5

for j=1:5

I(i,j)=1;

end

end

VC代碼寫成:

engEvalString(ep,”for i=1:5;\

for j=1:5;\

I(i,j)=1;\

end;\

end”);

1.2.3 VC與MATLAB混編舉例

Void Detect(IN BYTE* pHBlob,BYTE* pLBlob,OUT BYTE* pBlob)

{

int iWidth=300;

int iHeight=300;

//定義MATLAB函數要使用的三個變量

mxArray* mxpHBlob=NULL;

mxArray* mxpLBlob=NULL;

mxArray* mxpBlob=NULL;

//給MATLAB輸入兩個變量分配空間

mxpHBlob=mxCreateNumericMatrix(iWidth,iHeight,,mxUINT8_CLASS,mxREAL);

mxpLBlob=mxCreateNumericMatrix(iWidth,iHeight,,mxUINT8_CLASS,mxREAL);

//将VC輸入的變量地址拷貝給MATLAB輸入變量

memcpy((void*)mxGetPr(mxpHBlob),(void*)pHBlob,iWidth*iHeight);

memcpy((void*)mxGetPr(mxpLBlob),(void*)pLBlob,iWidth*iHeight);

//将MATLAB輸入變量傳遞到MATLAB中

engPutVariable(ep,”HBlob”,mxpHBlob);

engPutVariable(ep,”LBlob”,mxpLBlob);

//執行MATLAB函數

engEvalString(ep,”Blob=ImgRestruction(HBlob,LBlob);”);

//獲得MATLAB函數輸出變量

mxpBlob=engGetVariable(ep,”Blob”);

//将将MATLAB函數輸出變量傳遞給VC函數輸出變量

memcpy((void*)pBlob,(void*)mxGetPr(mxpBlob),iWidth*iHeight);

//銷毀MATLAB變量矩陣空間

mxDestroyArray(mxpHBlob);

mxDestroyArray(mxpLBlob);

mxDestroyArray(mxpBlob);

return;

}

注意:自己寫的MATLAB函數一定要放在..\R2012b\bin的目錄下。

2. Matlab生成動态庫

2.1. MATLAB生成動态庫步驟

點擊MATLAB Compiler,提示如圖2-1所示,新輸入一個工程名,類型選擇C 共享庫。第一次使用matlab生成動态庫要安裝編譯器,如圖2-2所示,在matlab中的Common Window窗口中輸入mbuild –setup,然後提示選擇一個編譯器,依據自己需要選擇,在項目裡我們選擇2。然後再MATLAB右端Build選項裡點擊Add files,選擇需要編譯的m文件,點擊按鈕進行編譯,如圖2-3、2-4所示。最後會在..My Document\Matlab\文件夾下生成一個m文件的文件夾,将其中生成的.lib、.dll、.h文件(如圖2-5所示)拷貝到需要調用MATLAB動态庫函數的VC工程目錄下,即完成Matlab生成動态庫的步驟。

matlab代碼自動生成verilog代碼(VCMATLAB混編技術文檔)15

圖2-1 MATLAB生成動态庫-1

matlab代碼自動生成verilog代碼(VCMATLAB混編技術文檔)16

圖2-2 MATLAB生成動态庫-2

matlab代碼自動生成verilog代碼(VCMATLAB混編技術文檔)17

圖2-3 MATLAB生成動态庫-3

matlab代碼自動生成verilog代碼(VCMATLAB混編技術文檔)18

圖2-4 MATLAB生成動态庫-4

matlab代碼自動生成verilog代碼(VCMATLAB混編技術文檔)19

圖2-5 MATLAB生成動态庫-5

2.2. VC與MATLAB生成動态庫函數混編方法

2.2.1 使用MATLAB生成動态庫的配置

首先安裝matlab運行時,在matlab的command window中輸入mcrinstaller即可找到MCR的位置,點擊安裝即可。

在VC 目錄下包含目錄增加:C:\Program Files\MATLAB\R2012b\extern\include,

C:\Program Files\MATLAB\R2012b\extern\include\win64

庫目錄增加:C:\Program Files\MATLAB\R2012b\extern\lib\win64\microsoft(如圖2-6到2-8所示)

matlab代碼自動生成verilog代碼(VCMATLAB混編技術文檔)20

圖2-6 使用MATLAB生成動态庫配置-1

matlab代碼自動生成verilog代碼(VCMATLAB混編技術文檔)21

圖2-7 使用MATLAB生成動态庫配置-2

matlab代碼自動生成verilog代碼(VCMATLAB混編技術文檔)22

圖2-8 使用MATLAB生成動态庫配置-3

在鍊接器中輸入添加附加依賴項mclmcrrt.lib mclmcr.lib Reconstruction.lib

預編譯頭stdafx.h中加入

#include ” mclmcrrt.h”

#include “mclcppclass.h”

#include “Reconstruction.h”頭文件

然後初始化應用,初始化庫函數(例如庫文件名稱為Restruction),代碼如下:

If(!mclInitializeApplication(NULL,0))

{

AfxMessage(“Could not initialize the application!”);

}

If(!lRestructionInitialize())

{

AfxMessage(“Could not initialize the Restruction!”);

}

2.2.2 在沒有安裝MATLAB機器上的配置

由于MATLAB過于龐大,且安裝費時,占用内存,所以一般不用在機器上安裝整個MATLAB客戶端,隻需要安裝MCR就能用VC調用MATLAB生成的動态庫。安裝方法見2.2.1。

在VC 目錄下包含目錄增加:

C:\Program Files\MATLAB\MATLAB Compiler Runtime\v80\extern\include

C:\Program Files\MATLAB\ MATLAB Compiler Runtime\v80\extern\include\win64

庫目錄增加:

C:\Program Files\MATLAB\ MATLAB Compiler Runtime\v80\\extern\lib\win64\microsoft

其他的配置見2.2.1。

2.2.3 VC MATLAB混編舉例

例1

void Function(IN BYTE* pHBlob,BYTE* pLBlob,OUT BYTE* pBlob)

{

int iWid=300;

int iHei=300;

//定義MATLAB函數要使用的變量

mwArray* mwpHBlob;

mwArray* mwpLBlob;

mwArray* mwpBlob;

//為變量分配空間

mwpHBlob=new mwArray(iWid,iHei,mxUINT8_CLASS,mxReal);

mwpLBlob=new mwArray(iWid,iHei,mxUINT8_CLASS,mxReal);

mwpBlob=new mwArray(iWid,iHei,mxUINT8_CLASS,mxReal);

//将VC輸入變量的值傳給MATLAB輸入變量

mwpHBlob.SetData(pHBlob,iWid*iHei);

mwpLBlob.SetData(pLBlob,iWid*iHei);

//執行MATLAB函數,函數第一個參數為輸出變量值的個數

Reconstrction(1, mwpBlob, mwpHBlob, mwpLBlob);

//将MATLAB輸出變量值傳遞給VC函數輸出變量值

mwpBlob.GetData(pHBlob,iWid*iHei);

//銷毀内存

delete mwpHBlob;

delete mwpLBlob;

delete mwpBlob;

return;

}

例2

CString strFrontPath=CString(“F:\\正面訓練數據路徑\\”);

mwArray * G_MWTrainDataFrontPath;

mwArray * G_MWRefGridDataFront;

mwArray * G_MWSubFrontRefImg;

G_MWTrainDataFrontPath=new mwArray(strFrontPath);

const char* fields[]={"V","meanV"};

G_MWRefGridDataFront=new mwArray(10,20,2,fields);

G_MWSubFrontRefImg=new mwArray(1000,2000,mxUINT8_CLASS,mxREAL);

mwArray V1(30000,50,mxDOUBLE_CLASS);

mwArray meanV1(1,30000,mxDOUBLE_CLASS);

for (int i=1;i<=10;i )

{

for (int j=1;j<=20;j )

{

(*G_MWRefGridDataFront)(fields[0],i,j)=V1;

(*G_MWRefGridDataFront)(fields[1],i,j)=meanV1;

}

}

loadMat(2,*G_MWRefGridDataFront,*G_MWSubFrontRefImg,*G_MWTrainDataFrontPath);

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved