天天看點

SystemGenerator:數字信号處理之開發準備、流程預演

文章目錄

    • 前言
    • 1、開發準備
    • 2、實際流程預演
    • 參考文獻

前言

本系列開端先學習B站“ Rong晔 ”的視訊,作為FPGA在DSP用途學習的引子,視訊做的非常之好,萬分感謝!以下為Lytain的個人筆記,包含大量個人了解内容,若有錯誤,望指正。很喜歡這些夾帶私貨極少的前輩,再次感謝,無以言表。

1、開發準備

我的軟體:VIVADO2018.2、MATLAB2018a、System Generator。

Note:版本的選擇需要相關聯才能聯合使用(可直接看第6點)。

  1. 打開:https://www.xilinx.com/support.html
  2. 選擇User Guides下載下傳。
    SystemGenerator:數字信号處理之開發準備、流程預演
  3. 可以看到“ DSP Design Using System Generator”的文檔,預設是最新版Vivado的檔案,如果使用的是舊版本,點選See All Versions。
    SystemGenerator:數字信号處理之開發準備、流程預演
  4. 這裡,我找到“ UG897 - Vivado Design Suite User Guide: Model-Based DSP Design using System Generator (v2018.2) ”的打開。
  5. 在目錄中,找到“ Support for MATLAB ”,點選跳轉。
    SystemGenerator:數字信号處理之開發準備、流程預演
  6. 有一個叫“ UG973 ”的東西,打開後跳轉到一個文檔網址。
    SystemGenerator:數字信号處理之開發準備、流程預演
  7. 在UG973的目錄中,點選“ Compatible Third-Party Tools ”看支援的第三方工具版本。
    SystemGenerator:數字信号處理之開發準備、流程預演
  8. 可以看到,2018.2的Vivado支援R2017a,R2017b和R2018a。很不幸,我之前裝的Matlab是2019的,考慮代碼的維護,我解除安裝Matlab這邊,裝了2018a版本的。另外,沒裝System Generator的,需要多裝下,以前裝了就不用了。至此,開發軟體基本準備好了。
    SystemGenerator:數字信号處理之開發準備、流程預演
  9. 在Mathworks官網上也有該問題的回複,非常直覺。
    SystemGenerator:數字信号處理之開發準備、流程預演
    還需要注意一點的是,Vivado2019.2是最後一個支援Windows7的版本,從2020.1開始,Vivado不再支援Windows7。

2、實際流程預演

主旨:把整體的開發流程實踐一遍。

SystemGenerator:數字信号處理之開發準備、流程預演

一、Matlab編寫

1°打開Vivado、Matlab,注意Matlab需要從System Generator中啟動。在打開别人的System Generator工程時,也需要這樣的。打開後有如下提醒。

SystemGenerator:數字信号處理之開發準備、流程預演

2°編寫Matlab代碼,然後運作(快捷鍵F5)。

clc;clear all;close all;
% -------------------------------demo--------------------------------------%
% To show the complete process of digital signal processing system designing
% -------------------------------------------------------------------------%
%% System parameters
N = 1024;   % Data depth
Fs = 10000; % Sampling frequency(Hz)
Ts = 1/Fs;  % Sampling time
%% Generate an input signal
A = 1;      % Amplitude
t = (0:1024-1)*Ts;     % Time(s)
f = 50;     % Frequency(Hz)
n = Fs/f;   % Data length of a period
x = A * sin(2*pi*f*t); % Input signal

figure(1)
plot(t,x);
hold on;
%% Demonstrate the algorithm: Multiply,Add and Delay
C = 2;     % Multiplier
D = n/2;   % Delay,half of period

% y_0 = C * x;
y_0 = zeros(1,N);
y_1 = zeros(1,N);
y   = zeros(1,N);
% 所有運算的算法,要用for循環更改為FPGA的形式
for i = 1:N
    y_0(i) = C * x(i);
    if(i>D)  % 當運算時間超過設定延遲參數後,才開始進行延遲
        y_1(i) = y_0(i-D);
    end
    y(i) = y_0(i) + y_1(i);  % Output signal
end


figure(1)
plot(t,y);
legend('Input signal','Output signal');

x_in(:,1) = 1:N;
x_in(:,2) = x;

           

Notes:代碼編寫時需要注意的一些細節

  1. Matlab中的運算和實際FPGA的運算編寫存在一定差別,比如乘法,在Matlab中,可以直接使用“ * ”來實作。但FPGA不同,後者每做一個操作,都是需要時鐘來驅動的,Matlab編寫時要規範這種思路,用for循環的方式來表示每個時鐘進行一次資料的處理。
  2. y_0、y_1和y一開始都被賦予了一個空的數組,目的是為了預配置設定記憶體,得到一個存儲空間。
  3. 得到的資料圖像,可以和工作區變量進行互相對應。
    SystemGenerator:數字信号處理之開發準備、流程預演

二、Simulink搭建

1°打開Simulink,建立一個空模型Blank Model。

SystemGenerator:數字信号處理之開發準備、流程預演

2°點選Simulink視窗上面四個框的Library Browser,可以打開仿真的一些庫模型。打開後找到“ Xilinx Blockset ”的“ Basic Elements ”部分,這裡面有個“ System Generator ”,直接拖動放到Simulink視窗,這個是必須的,否則運作啥都是錯的。

SystemGenerator:數字信号處理之開發準備、流程預演

3°輕按兩下System Generator的圖示進入配置。

SystemGenerator:數字信号處理之開發準備、流程預演

點選Clocking配置界面,我闆子上的時鐘是50MHz的,做相應的更改。

SystemGenerator:數字信号處理之開發準備、流程預演

配置後的圖檔如下,除時鐘周期外的,都預設。弄好後,點選Apply,OK即可。

SystemGenerator:數字信号處理之開發準備、流程預演

4°添加“ Gateway In ”和“ Gateway Out ”子產品,生成的工程會根據這個名字直接産生,是以需要提前設定好輸入和輸出的名字。

5°在“ Basic Elements ”中添加Delay延遲子產品,“ Math ”中添加AddSub加法子產品,CMult乘法子產品。按照算法的設計,将子產品連接配接起來。

SystemGenerator:數字信号處理之開發準備、流程預演

6°添加一些Simulink本身的子產品,為仿真提供一些便利。在仿真庫的“ Simulink ”的“ Sources ”一欄中有“ Form Workspace ”,也就是從工作區中擷取輸入源,将其拖到視窗中。在仿真庫的“ Simulink ”的“ Sinks ”一欄中有“ Scope ”,是用來檢視輸出的波形的。這兩個都是Simulink本身自帶的子產品,不會産生到FPGA中,必須使用gateway的方式讓FPGA和外部資料進行交流。

7°将視窗的“ Dispaly ”的“ Signal & Ports ”的“ Port Data Types ”勾選好,這會是我們看到信号線上的資料類型。

SystemGenerator:數字信号處理之開發準備、流程預演

8°信号輸入的配置,信号的輸入可以是矩陣格式,第一列是時間序列,第二列是資料序列。編寫代碼,将時間序列和資料序列組合起來即可(通過Matlab的F9快捷鍵,可以隻運作選中的幾句代碼)。先斷開“ Form Wordplaces ”與“ Gateway In ”的連接配接,将仿真時間改為1024,點運作後,得到如下波形,和預期是一緻的。

SystemGenerator:數字信号處理之開發準備、流程預演

9°修改運算子產品的參數。輕按兩下CMult子產品,将Constant value的值改為C(注意不是2,因為在Matlab中修改參數更為簡單),直接讀取工作區的變量。另外,其Latency可以設定為0,表示得到結果後直接輸出,不經過延遲。延遲子產品Delay,同樣将其Latency改為D(也是Matlab中的參數直接使用,平時工作時,建議參數用腳本直接寫好)。

10°最終仿真的結果如下面所示。

SystemGenerator:數字信号處理之開發準備、流程預演

11°可以發現,輸入資料經過Gateway In後變成定點型。

SystemGenerator:數字信号處理之開發準備、流程預演

将原精度16,14改為32,16。這是消耗了大量資源來保證工程的準确的。以完成工程為目标後,再進行優化。

SystemGenerator:數字信号處理之開發準備、流程預演

重新運作後,可以發現,Gateway In定點資料(32、16)經過CMult子產品(16、14)後,輸出為定點資料(48、30),這是因為CMult子產品為了保證資料不溢出,進行的精度擴充(32+16、16+14)。Delay子產品輸出精度不變。Add子產品,為保證進位不溢出,整數部分也需要擴充1位,小數部分則無進位需求(49、30)。

SystemGenerator:數字信号處理之開發準備、流程預演

這裡輸出的幅值隻有2,極大的資源都被浪費了,後續要保證位寬的一緻。

11°為了将輸出資料和輸入資料的位寬一緻,需要用到“ Convert ”子產品,其在“ Basic Elements ”中。

SystemGenerator:數字信号處理之開發準備、流程預演

三、Vivado仿真

1°輕按兩下“ System Generator ”,按照之前配置好的,點選“ Generate ”。顯示下列圖,表示順利的生成了。接着到Vivado上進行後續的開發。

SystemGenerator:數字信号處理之開發準備、流程預演

2°仿真前,先進行Synthesis綜合。不進行綜合直接仿真也是可以的,但可能會出現一些莫名其妙的錯誤,是以先進行下綜合。

3°點選仿真後,在Vivado中打開了仿真界面,且有仿真資料。之是以不用再自己編寫testbeach,是因為在Simulink仿真環境搭建時,有一個Gateway In,會自動将Source的資料作為testbeach導進來。是其自動幫忙做的。

4°剛開始得到的波形是一個“ 數字型 ”的,需要做以下配置,将顯示的波形進行設定下。

SystemGenerator:數字信号處理之開發準備、流程預演

右鍵信号“ Value ”,選擇“ Waveform Style ”的“ Analog ”後,再選擇一次“ Analog Settings ”進行模拟參數的配置。

SystemGenerator:數字信号處理之開發準備、流程預演

根據輸出波形的範圍,進行設定。

SystemGenerator:數字信号處理之開發準備、流程預演

上述Analog參數設定完後,還需要對進制進行設定。

SystemGenerator:數字信号處理之開發準備、流程預演
SystemGenerator:數字信号處理之開發準備、流程預演

對輸出進行同樣的設定,仿真更長時間,點選“ Zoom Fit ”後,得到完整的波形圖。

SystemGenerator:數字信号處理之開發準備、流程預演

5°如果隻是仿真的話,基本沒啥問題,但要下載下傳到開發闆調試,需要做一些改動。但為了拿到其他地方用的話,這個Gateway In還是要保留的,作為FPGA子產品的輸入接口。

四、FPGA測試

1°使用ROM的IP,儲存輸入的資料,而不在使用Gateway的方式。在“ Xilinx Blockset ”中的“ Memory ”選擇ROM拖出。使用ROM還需要一個計數器,根據計數器值的變化,來讀取不同的ROM值,計數器在“ Xilinx Blockset ”中的“ Math ”有。

SystemGenerator:數字信号處理之開發準備、流程預演
SystemGenerator:數字信号處理之開發準備、流程預演

2°在新的檔案夾下Generate新的工程。

五、ILA資料導出與讀取

1°添加ILA的IP核(在Vivado中)。

SystemGenerator:數字信号處理之開發準備、流程預演
SystemGenerator:數字信号處理之開發準備、流程預演

2°複制例化模闆,在頂層中進行例化。

SystemGenerator:數字信号處理之開發準備、流程預演

由于top module輸入信号輸出信号位寬過多,占用太多的引腳,可以稍微修改下,讓其别出現在頂層中,隻作為中間變量,給内部的ILA檢視。

SystemGenerator:數字信号處理之開發準備、流程預演

更改完後,在Vivado左欄的“ Open Elaborated design ”可以進行RTL的分析,檢查基本子產品的連接配接是否正确。

SystemGenerator:數字信号處理之開發準備、流程預演
SystemGenerator:數字信号處理之開發準備、流程預演

3°添加管腳限制,由于隻有一個時鐘管腳,就不适用xdc檔案了。直接點選Vivado最上方“ Window ”的“ I/O Ports ”,下方進行配置(需要“ Open Elaborated design ”步驟之後,才能有這個)。

SystemGenerator:數字信号處理之開發準備、流程預演

4°在FPGA上測試的結果,,居然沒有ILA跳出來,有些崩潰,小睡了10mins。起來檢查Bug。

SystemGenerator:數字信号處理之開發準備、流程預演

顯示的問題如上所示,大概是指debug core被删除了,這問題估計比較常見,這裡花些時間處理掉。

弄了一個小時。。。嘗試改了代碼、一些配置和玄學的操作,還是沒成功,沒辦法留坑了,明早拿A7和Spartan6的闆卡過來,先排除不是代碼的問題。

2020年12月19日,估計今天還是沒法填坑,因為調試器留在實驗室了,先學些其他的,晚點回來填。

2020年12月20日,今天中午填坑了之前留下的BUG,首先代碼是沒啥問題的,隻是Zynq闆卡容易遇到ILA被優化掉無法檢視信号的問題,嘗試了網上很多方法,都沒有解決。但有個方法是可行的,就是“ 搭一個最小系統,用SDK跑一段小代碼,這樣Refresh後ILA就能正常啟動 ”,隻不過時間關系,我沒有選擇去實驗。我直接換用了手頭的另一塊A7闆卡,型号是XC7A75TFGG484-1的,稍微改動下“ System Generator ”的配置後,生成工程,燒入闆子,ILA是可以正常啟動的,沒啥問題。

SystemGenerator:數字信号處理之開發準備、流程預演

ILA的波形如下面所示。

SystemGenerator:數字信号處理之開發準備、流程預演

還存在一個問題,就是Radix居然沒有Real Settings的選項,找了好久,不知道除了啥問題,但總之波形基本正确。

SystemGenerator:數字信号處理之開發準備、流程預演

參考文獻

  1. 現在檢視vivado手冊的位置——開發筆記
  2. ug973-vivado-release-notes-install-license.pdf
  3. Rong晔前輩的視訊第0、1、2期