SOPC設(shè)計(jì)中自定義IP的開發(fā)
—— Developing Self-definition IP in SOPC Design
這里以一個在控制系統(tǒng)中常用的脈沖寬度調(diào)制電路(PWM)為實(shí)例,設(shè)計(jì)一個PWM用戶邏輯并利用EDK將它集成SOPC系統(tǒng)中。我們事先假定FPGA中已經(jīng)存在一個基于Microblaze的嵌入式系統(tǒng),在此前提下將PWM外設(shè)集成到OPB總線上,并進(jìn)行功能驗(yàn)證。
假設(shè)PWM的具體設(shè)計(jì)要求如下:
◇ 要求信號周期可調(diào)。
◇ 脈沖的寬度可調(diào)。
◇ 可以控制PWM的輸出使能。
◇ PWM直接通過一個FPGA管腳輸出。
按照以上設(shè)計(jì)要求,我們設(shè)定PWM外設(shè)共有3個寄存器,分別為:
(1) Clock_Divisor 決定信號周期的32位寄存器
(2) Duty_Cycle 控制信號占空比的32位寄存器
(3) Control 控制寄存器,使能輸出,32位,只有最低位有效
3.1 模塊功能設(shè)計(jì)
PWM外設(shè)的核心是一個計(jì)數(shù)器,由Clock_Divisor控制計(jì)數(shù)周期,當(dāng)計(jì)數(shù)器的計(jì)數(shù)值大于Clock_Divisor寄存器的值時,計(jì)數(shù)器清零,否則在時鐘信號觸發(fā)下,輸出使能控制位為1時計(jì)數(shù)器加1計(jì)數(shù);PWM模塊的輸出是計(jì)數(shù)器的計(jì)數(shù)值與Duty_Cycle比較的結(jié)果,當(dāng)輸出使能有效并且計(jì)數(shù)值大于Duty_Cycle寄存器的值時,輸出為1,否則輸出為零。
3.2 模塊集成
在XPS集成開發(fā)環(huán)境中,集成了一個creat/import peripheral wizard 工具,利用該向?qū)Чぞ呔湍茌p松地創(chuàng)建或?qū)胍粋€用戶自定義的外設(shè)。在向?qū)е形覀冎恍柽x擇與總線的接口是3個32位的寄存器即可,向?qū)瓿珊螅こ棠夸洠╬roject)中會自動生成drivers和pcores兩個文件夾,兩個文件夾中包含了自定義外設(shè)的相關(guān)信息,drivers文件夾里以應(yīng)用程序接口函數(shù)(API)的形式提供了自定義外設(shè)的驅(qū)動程序,以完成對外設(shè)的讀寫和測試, 用戶在開發(fā)包含自定義外設(shè)的高層應(yīng)用軟件時就可以直接調(diào)用這些接口函數(shù)。
在pcores文件夾底下有三個文件比較重要:user_logic、MPD和PAO文件,user_logic文件是集成工具生成的用戶模板文件,該文件中給出了自定義邏輯與OPB總線的接口信號,用戶只需根據(jù)接口信號的驅(qū)動要求,在用戶模板中就能完成模塊的功能設(shè)計(jì)。PWM外設(shè)與總線的接口描述如下:
entity user_logic is
generic
( 總線協(xié)議參數(shù)設(shè)置,不允許用戶修改
C_AWIDTH : integer := 32;
C_DWIDTH : integer := 32;
C_NUM_CS : integer := 1;
C_NUM_CE : integer := 3
);
port
(
pwm_out : out std_logic; --這是PWM模塊的輸出端口
-- 以下是總線接口信號,不允許用戶修改或刪除,否則模塊集成時將會出錯
Bus2IP_Clk : in std_logic;
Bus2IP_Reset : in std_logic;
Bus2IP_Addr : in std_logic_vector(0 to C_AWIDTH-1);
Bus2IP_Data : in std_logic_vector(0 to C_DWIDTH-1);
Bus2IP_BE : in std_logic_vector(0 to C_DWIDTH/8-1);
Bus2IP_CS : in std_logic_vector(0 to C_NUM_CS-1);
Bus2IP_RdCE : in std_logic_vector(0 to C_NUM_CE-1);
Bus2IP_WrCE : in std_logic_vector(0 to C_NUM_CE-1);
IP2Bus_Data : out std_logic_vector(0 to C_DWIDTH-1);
IP2Bus_Ack : out std_logic;
IP2Bus_Retry : out std_logic;
IP2Bus_Error : out std_logic;
IP2Bus_ToutSup : out std_logic
);
end entity user_logic;
其中Bus2IP_WrCE是處理器用來對外設(shè)的寄存器進(jìn)行編址的信號,該信號與寄存器地址映射關(guān)系如表1所示。
本文引用地址:http://butianyuan.cn/article/116965.htm
其中C_BASEADDR是系統(tǒng)給外設(shè)分配的基地址,通過該地址,處理器就能訪問外設(shè)的寄存器,在本例中系統(tǒng)分配給PWM外設(shè)的地址為0x7da00000。
MPD和PAO分別是處理器外設(shè)描述文件和外設(shè)分析文件,通過這兩個文件集成開發(fā)工具XPS就能找到外設(shè)的各組成模塊并正確識別它們。完成這兩個文件的修改后,再次啟動向?qū)В袽PD和PAO文件作為向?qū)Чぞ叩妮斎?,就能將PWM這一自定義邏輯集成到總線上去,其修改方法是:
(1)在MPD文件中例化PWM的端口,格式如下:
PORT pwm_out = "", DIR = O
(2)在PAO文件中聲明已經(jīng)完成PWM功能描述的用戶模板,格式如下:
lib pwm_v1_00_a user_logic vhdl
評論