1. 程式人生 > >System Generator從入門到放棄(四)-利用MCode呼叫MATLAB程式碼

System Generator從入門到放棄(四)-利用MCode呼叫MATLAB程式碼

System Generator從入門到放棄(四)-利用MCode呼叫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。