System Generator從入門到放棄(四)-利用MCode呼叫MATLAB程式碼
System Generator從入門到放棄(四)-利用MCode呼叫MATLAB程式碼
文章目錄
- System Generator從入門到放棄(四)-利用MCode呼叫MATLAB程式碼
- 一、利用MCode呼叫MATLAB程式碼
- 1、簡介
- 2、本設計使用到的block
- 3、Generator設計流程
- 4、支援的MATLAB語法
System Generator是Xilinx公司進行數字訊號處理開發的一種設計工具,它通過將Xilinx開發的一些模組嵌入到Simulink的庫中,可以在Simulink中進行定點模擬,可以設定定點訊號的型別,這樣就可以比較定點模擬與浮點模擬的區別。並且可以生成HDL檔案,或者網表,可以在ISE中進行呼叫。或者直接生成位元流下載檔案。能夠加快DSP系統的開發進度。
一、利用MCode呼叫MATLAB程式碼
1、簡介
本設計是利用MCode設計一個有限狀態機(FSM),從而實現一個序列檢測器。
FPGA設計中經常用到一些控制邏輯,如有限狀態機(FSM),如果用各種block搭建一個FSM比較麻煩。System Generator支援呼叫MATLAB程式碼,通常可以編寫MATLAB程式碼來實現FSM等控制邏輯,通過MCode block呼叫到System Generator設計中。
具體介紹大家可以看看這篇博文,Verilog序列檢測器-兩例https://blog.csdn.net/Pieces_thinking/article/details/78704437。
本文將使用MATLAB程式碼設計一個FSM,對“1011”這個序列進行檢測。
2、本設計使用到的block
Xilinx block
- MCode(->Index):呼叫MATLAB函式
其它block
- Repeating Sequence Stair(Simulink->Sources):生成序列
3、Generator設計流程
在庫中在庫中找到Repeating Sequence Stair、Gateway In、MCode、Gateway Out、System Generator、scope,分別新增到model中,如下:
3.1 生成二進位制序列
雙擊Repeating Sequence Stair,如下設定:
該block可以產生重複的離散時間序列,在Vector of output values中設定一組序列(該值不是必須設定為0或1,只是本設計要檢測二進位制序列)。Signal Attributes->Output data type中可以設定輸出資料的型別,這裡設定為Boolean。
設定完畢後,該block在model中的圖示會顯示一個大致的波形,可以據此判斷設定是否正確。
3.2 序列檢測器設計
雙擊MCode塊並單擊Edit M-File,如下圖所示:
下圖顯示了MATLAB文字編輯器中的預設m程式碼。
編輯預設的MATLAB函式,包括函式名state_machine
和匹配的輸入din
和輸出matched
。
進行編輯後,使用Save As將MATLAB檔案儲存為state_machine.m
到相關工程資料夾。
PS:在MCode屬性編輯器中,可以使用Browse按鈕引用本地M-code檔案(state_machine.m)。
在MCode Properties Editor單擊 OK按鈕。
設定完畢後,該block在model中的圖示會更換為對應的函式名稱及輸入/輸出介面。再新增1個scope觀察二進位制序列與檢測結果。model連線圖如下:
3.3 有限狀態機設計
現在可以開始編寫狀態機了。這個狀態機的氣泡圖如下圖所示。該FSM有五種狀態,能夠連續檢測兩個序列。
狀態機的工作流程如下:
- S0為起始態,S4為終止態(matched只會在S4時為1,其它狀態都為0);
- S0檢測到1時表示一幀序列的開始,01-12-23-34組成1011;
- S1為1時,仍然可能是一幀序列的開始,11-12-23-34組成1011;
- 由於只有S1為0時才會跳轉到 S2,因此S2為0表明檢測失敗,重新返回S0狀態開始檢測;
- 23為0且S3為1時可能是一幀序列的開始,23-32-23-34組成1011;
- S4為1時可能是一幀序列的開始,41-12-23-34組成1011;S4為0時返回到S0狀態重新開始檢測。
3.4 MATLAB程式碼設計
Edit the M-code file, state_machine.m
function matched = state_machine(din)
persistent state, state = xl_state(0,{xlUnsigned, 3, 0});
switch state
case 0
if din == 1
state = 1;
else
state = 0;
end
matched = 0;
case 1
if din == 0
state = 2;
else
state = 0;
end
matched = 0;
case 2
if din == 1
state = 3;
else
state = 0;
end
matched = 0;
case 3
if din == 1
state = 4;
else
state = 2;
end
matched = 0;
case 4
if din == 0;
state = 0;
else
state = 1;
end
matched = 1;
otherwise
state = 0;
matched = 0;
end
定義一個3Bits寬的(3-0)無符號(xlUnsigned)狀態變數xl_state,使用switch語法控制狀態之間的轉移。由於3Bits位寬資料可表示07,而FSM狀態只有04,所以一定要加上otherwise控制狀態轉移。
System Generator並不是支援所有的MATLAB語法和格式,還有一部分為Xilinx自定義的函式和資料格式,這部分的詳細內容(支援的所有MATLAB語法)都記錄在ug958這篇文件中。具體可參考該文件,下面也會簡單進行介紹。
3.5 將設計匯出到FPGA
在System Generator block中設定好Simulink取樣週期,設定好執行時間,開始執行驗證設計。這裡介紹一個模擬執行時間的設計技巧:假設系統取樣率為50MHz,示波器中只需要顯示20個點即可,執行時間可設定為“20/50e6”。
可以看到每檢測到一組“1011”序列後,便輸出一個時鐘週期的高電平。生成FPGA設計,在Vivado中進行模擬,結果與Simulink中模擬相同:
4、支援的MATLAB語法
原文:https://blog.csdn.net/FPGADesigner/article/details/80963366
詳細的資訊可以參考xilinx官方文件ug958->第一章->MCode小節,傳送門。
4.1 MCode block特性
MCode用於在Simulink環境下執行MATLAB函式。MCode的名稱與管腳即為函式名稱與函式介面。在將System Generator設計匯出到FPGA時,軟體會將MATLAB程式碼轉換為對應的HDL模型。MCode經常用於實現一些簡單的演算法功能、有限狀態機和控制邏輯。
呼叫的MATLAB函式必須遵循以下三條基本規則:
- 所有的輸入和輸出必須是Xilinx的定點資料型別(xfix);
- 至少包含一個輸出;
- M檔案應在MATLAB的搜尋路徑下,或與slx模型檔案在同一目錄。
當初次使用MCode時,會自動呼叫一個示例檔案xlmax.m。博主建議先在slx檔案目錄下建立好新的m檔案,再用Browse定位。
4.2 支援的MATLAB語法
4.2.1 所支援的MATLAB語法結構包括:
- 賦值(等號左邊只能有一個變數);
- if/else/elseif end語法(條件表示式必須是判斷true/false或1/0);
- switch語法(case只能選擇常量)、for語法;
- 加法、減法、乘法、除法(除數必須是2的N次冪,因為可以轉換為移位),除此之外,不支援其它算術表示式
- 關係運算符(<、<=、>、>=、==、~=)
- 邏輯運算子(&、|、~)
4.2.1 所支援的MATLAB函式及其功能
4.3 xfix資料型別
xfix有三種資料型別:無符號定點數(xlUnsigned)、帶符號定點數(xlSigned)、布林值(xlBoolean)。使用xl_arith()判斷資料型別時分別返回1、2、3。需要注意幾點:
- 使用關係運算符得到的結果是布林型別;
- 布林變數不能進行算術操作;
- 邏輯運算子只能用於布林變數
編寫MATLAB程式碼時,仍然可以使用整數、浮點數、布林值來定義常量。整數和布林值都會自動轉換為xifix型別;浮點數需要用xfix()函式轉換。xfix()函式還可以完成不同xifix資料型別的轉換,其基本形式為:
x = xfix(type_spec, value);
value為待轉換的數,type_spec為轉換後的資料型別。比如將浮點數π轉換為xfix型別:
x = xfix({xlSigned, 20, 16, xlRound, xlWrap}, 3.1415926);
轉換後為Fix_20_16格式,Round量化,Wrap溢位(前面的文章中已經解釋了這些含義)。量化方式可設定為xlTruncate、xlRound和xlRoundBBanker;溢位方式可設定為xlWrap、xlSaturate、xlThrowOverflow。
4.4 xl_state狀態變數
在整個模擬過程中,一個MATLAB函式會執行多次,必須保證其中的狀態變數在每次執行完時保留其值(類似與C++語言中的static靜態變數),否則無法正確實現控制功能。
狀態變數在MATLAB中需要用persistent關鍵詞和xl_state函式定義,如下所示:
persistent s, s = xl_state(0, {xlSigned, 4, 0});
該函式有兩個引數:第一個0表示狀態初始值,必須是常數;第二個引數是狀態變數的資料型別,與xfix函式中的type_spec用法相同。狀態變數還可以是一個向量,並且擁有許多配套的函式,ug958中給出了多個使用xl_state完成的設計例項。
4.5 確保變數被正確轉換
MATLAB是一種順序執行程式碼,眾所周知,HDL程式碼是並行執行的程式碼。為了能讓MATLAB程式碼成功的轉換為HDL模型,就要確保MATLAB用到的變數也能正確的轉換(原文件描述為Variable Availability)。具體來講就是要保證所有的變數在MATLAB語法的不同分支條件下都能夠得到賦值。
ug958給出了一個示例程式碼:
function [x, y, z] = test1(a, b)
x = a;
if a>b
x = a + b; y = a;
end
switch a
case 0
z = a + b;
case 1
z = a - b;
end
其中y變數只在“if a>b”的條件下賦值,而不清楚另一種情況下怎麼辦;z變數在switch的其它情況下也不知道該怎麼辦(switch沒有otherwise)。在執行時MATLAB都會報錯。x變數雖然也沒有在if對應的else條件中賦值,但其已經提前賦值“x=a”,這樣在else時會預設保留原值,該變數滿足Variable Availability。