课件ppt - 浙江大学

Download Report

Transcript 课件ppt - 浙江大学

嵌入式系统
—— 嵌入式系统计算内核-SoC
SoC Core
to Embedded System
II
浙江大学计算机学院
施青松
[email protected]
1
提纲
SoC技术概述
SoC设计流程
SoC设计的EDA工具
SoC中常用的总线
SOC设计案例
基于可重构SoC实例
 SoC设计方法-4
基于IP Core的嵌入式开发实例
 BSB建立的最小系统结构

 SoC设计方法-2
基于学生设计的MIPS IP 的SoC
 乒乓游戏
 俄罗斯方块
 打砖块

3
基于IP Core的嵌入式开发实例
BSB建立的最小系统结构
M_AXI _IC
MDM
MBDE
BUG
DLMB
Microblaze
JTAG
LMB
BRAM
CNTLR
AXI
M_AXI _DC
AXI-EMC
SRAM
EMC:外部存储器控制器
M_AXI _DP
ILMB
LMB
BRAM
CNTLR
AXILite
GPIO
DIP
GPIO
PUSH
UART
RS-232
BRAM
4
基于IP Core的嵌入式开发实例

EDK开发最小SoC系统主要步骤
1. 工程的建立;
2. 添加AXI4 IP到硬件设计;
3. 定制LED IP,并添加IP到系统,编写应用程序;
4. 定制7段数码管 IP,并添加IP到系统,编写应用程序;
5. 定制PWM IP,并添加IP到系统,编写应用程序;
6. 实现AXI4中断控制系统;
7. 使用AXI4 Chipscope实现系统协同调试;
5
运行 Xilinx Platform Studio(XPS)

打开EDK软件
在Windows操作系统下,选择所有程序→Xilinx ISE Design
Suite13.1 → EDK → Xilinx Platform Studio(XPS)
1)打开XPS,
在XPS主界面
选择File →
Open Project,
出现右图界面
选择:
Open a recent
project
打开已经存在的工程,
然后单击ok按钮
选择该选项

点击”OK”按纽
6
添加EMC IP到设计中
定位到所在目录的system.xmp文件
然后点击“Open”按纽
选择EMC 总线参数
选择Memory and Memory Controller,并展开
选择AXI External Memory Controller,并双击
点击“Yes”按钮。
选择IP Catalog标签
选择EMC IP参数
选择Common标签
修改值16
设置EMC IP存储参数
选择Bank0标签
SRAM数据宽度设置为16
多个存储器访问设置为Ture
存储器类型选择异步存储器
点击“OK”按钮
添加EMC IP到设计中
选择手动将IP加入到设计中
点击“OK”按钮
配置MicroBlaze处理器
选择Bus Interface标签
选择Microblaze_0,点击鼠标右键,
选择Configure IP…
修改名字为Micron_RAM
配置MicroBlaze处理器
选中使用指令和数据缓冲
点击“Next”按钮
配置MicroBlaze处理器
点击“Next”按钮
配置MicroBlaze处理器
点击“Next”按钮
配置MicroBlaze Cache
选中使用指令缓存访问
选中使用数据缓存访问
点击“Next”按钮
配置MicroBlaze处理器
点击“ok”按钮
点击“Next”按钮
配置MicroBlaze接口
多出两个接口
M_AXI_DC
M_AXI_IC
建立新的
端口连接
配置MicroBlaze M_AXI_DC接口
下拉框中选择New Connection
配置MicroBlaze M_AXI_IC接口
下拉框中选择axi_interconnect_0
建立EMC和CPU的连接
选择axi_emc_0,并展开
鼠标左键点击,这个区域,弹出下面的
对话框
EMC和CPU的连接-选择互连接口
选择axi_interconnect_0
选中下面两个接口
点击“ok”按钮
建立EMC和CPU的连接
emc通过AXI和CPU建立连接
建立axi_interface互连时钟端口的连接
下拉框中选择clk_100_000MHz
建立axi_interface互连复位端口连接
下拉框中选择proc_sys_reset_0_
建立EMC和FPGA端口的连接-时钟
端口标签
下拉框中选择clk_50_000MHz
建立EMC和FPGA端口的连接-时钟
下拉框中选择clk_50_000MHz
建立EMC和FPGA端口的连接-存储
下拉框中选择Make External
下拉框中选择Make External
建立EMC和FPGA端口的连接-存储
下拉框中选择Make External
下拉框中选择Make External
建立EMC和FPGA端口的连接-存储
下拉框中选择Make External
建立EMC和FPGA端口的连接-存储
下拉框中选择Make External
RAM多余端口处理
在此处添加额外的端口
选择.mhs文件
RAM多余端口处理
新添加的端口
分配EMC的存储空间
地址标签
鼠标点击该按纽
分配EMC的存储空间
地址标签
基地址
高地址
大小
添加逻辑端口和FPGA引脚的物理约束
选择system.ucf文件
添加用户约束到这里,为方便直接复制资
料所提供的约束部分
新建工程的结构分析
BRAM
LMB控制器
LMB控制器
处理器
点击块图标签查看生成的块图
新建工程的结构分析
axi_interconnect_0
新建工程的结构分析
串口控制器
DIP控制器
按键控制器
生成网表
下一步,选择这个, 产生网表
想想这步完成的工作? –其实就是 把这个抽象的结构, 转换成门级网表的连接.
新建工程的结构分析
这个过程需要持续一小部分时间,请等待,并且看看控制台给出的综合信息.
生成bit流文件
下一步,选择这个, 产生布局布线比特流文件
这个过程需要持续一小部分时间,请等待,并且看看控制台给出的实现过程的信息.
建立软件应用程序
选择输出硬件到SDK
建立软件应用程序
选择输出和打开
SDK软件
建立软件应用程序
定位路径到当前的工程窗口
点击”OK按纽, 进入下一个界面
建立软件应用程序
删除以前建立的BSP
和应用程序工程
下面将添加设计的BSP
建立软件应用程序
选择建立Xilinx BSP, 作用是各种外设的软件
驱动
建立软件应用程序
BSP的工程名字
硬件平台的工程名字
点击”Finish”按纽, 进入下一个界面
BSP的名字
1) Xilkernel-Xilinx操作系统
2) Standalone-BSP
建立软件应用程序
点击”OK”按纽, 进入下一个界面
建立软件应用程序
SDK开始自
动编译BSP
建立软件应用程序
BSP的各种文件
下面将添加SDK自动生成的
应用程序
建立软件应用程序
生成新的C工程
建立软件应用程序
工程名字
选择生成外设测试应用程序
建立软件应用程序
点击”Next”按纽, 进入下一个界面
建立软件应用程序
选择该选项,使用已经存在的BSP
点击”Finish”按纽, 进入下一个界面
建立软件应用程序
打开并分析该文件
应用程序的各种文件
建立软件应用程序
调用存储器测试程序
建立软件应用程序
• 32位存储器测试, 写1k的32位数据0xAAAA5555,然后读取操作
• 16位存储器测试, 写2k的16位数据0xAA55,然后读取操作
• 8位存储器测试, 写4k的8位数据0xA5,然后读取操作
下面准备下载设计到芯片中
生成链接脚本文件
• 选择产生链接脚本文件
生成链接脚本文件
点击”Browse”按纽
程序各段的分配情况
定位产生.ld文件的路径
选择保存
选择生成
工程的下载
 产生比特流文件并且下载到板子上。

在下载前,指令存储器(FPGA的BRAM)将被更新
(使用GNU编译器产生可执行的文件)。
 使用下面的步骤完成设计下载和结果的观察:



连接Nexys3的USB线连接到主机的USB口
打开目标板的电源
打开主机的超级终端(在Windows操作系统的开始
→所有程序→附件→通信下),并且配置其参数,
使其波特率9600,数据位:8比特;无奇偶校验;
一个停止位;无流量控制。
61
工程的下载
选择编程 FPGA选项
工程的下载
比特流文件
块RAM映射文件
选择软件应用程序.elf文件
(即最终编译\连接后的文件
点击”Program”按纽, 进入
下一个界面
等待编程成功,在超级终端上观察结果,同时在Nexys3板卡上操
作按键和DIP开关,观察打印信息的变化.
 注意:如果前面没有选择生成链接脚本文件,则需要选择RUN→
RUN,来运行程序.

64
工程的下载过程

等待编程成功,在超级终端上观察结果,同时在Nexys3板卡上操作按键和
DIP开关,观察打印信息的变化.

注意:如果前面没有选择生成链接脚本文件,则需要选择RUN→ RUN,来
运行程序.
基于学生设计的MIPS IP 的SoC
 LED版:乒乓游戏 VGA版:俄罗斯方块、打砖块
SRAM
VRAM
MIO
BUS
分频
MIPS
去抖
GPIO
7-Seg
GPIO
LED
GPIO
SW
GPIO
BTN
GPIO
PS2
VGA
VGA
66
教学实验平台:硬件系统综合设计
设计自己的CPU和计算机系统、用自己的操作系统管理
自己的计算机,运行用自己设计应用程序
QS-I 简易DIY计算机硬件系统(综合设计)
本系统是《计算机组成原理与设计》的后继《计算机
硬件综合实践》课程的实验系统。学生利用《计算机组成》
或《计算机体系结构》课程设计的不同性能的CPU 核,继
微控制器结构
续深入实现完整计算机系统所需的基本外部设备:VGA、
PS2、内存和简单的命令解释器,完成一个简易的计算机
硬件系统,使用MIPS汇编设计并直接运行自己的应用程序。
SoC实现平台
Board
FPGA
CPU
Data
signals
Datapath
Address
signals
Controe
r signal
Controler
VRAM
Data
VRAM
Address
R G B signals
VGA
Interface
RS-232
Interface
PC
Terminal
PS/2
Interface
KEY
Board
BUS Interface
DBUS
ABUS
32
18
VRAM
Memory(256K×32bit)
VGA
Monitor
68
Datapath模块接口规范
data_path(
clk,
reset,
MIO_ready,
IorD,
IRWrite,
RegDst,
RegWrite,
MemtoReg,
ALUSrcA,
ALUSrcB,
PCSource,
PCWrite,
PCWriteCond,
Beq,
ALU_operation,
PC_Current,
data2CPU,
Inst_R,
data_out,
M_addr,
zero,
overflow);
CPU控制器模块接口规范
ctrl(
clk,
reset,
Inst_in,
zero,
overflow,
MIO_ready,
MemRead,
MemWrite,
ALU_operation,
state_out,
CPU_MIO,
IorD,
IRWrite,
RegDst,
RegWrite,
MemtoReg,
ALUSrcA,
ALUSrcB,
PCSource,
PCWrite,
PCWriteCond,
Beq);
CPU接口规范
Muliti_cycle_Cpu(
clk,
reset,
MIO_ready,
pc_out,
//TEST
Inst,
//TEST
mem_w,
Addr_out,
data_out,
data_in,
CPU_MIO,
INT0,
INT1,
state );
7段译码器显示
一个很好的外设

7段译码器映射为点阵显示

SW[0] =0:4位7段码映射为图形显示,共32段,映射到一个32位字
disp_num= DFCFBFFF
共阳7段码显示器结构和显示原理
4位共阳7段码映射图形显示
72
7段译码器映射图形例子
disp_num= 557EF7E0
disp_num= DFCFFCFB
Dice=1
Dice=5
disp_num= D7BDFBD9
disp_num= D7DBFDB9
disp_num= DFCFBFFF
Dice=2
Dice=6
Dice=3
Dice=4
73
7段译码器显示设备逻辑结构
后续课程用于外设和测试
hex7seg_decode
disp_num[31:16]
disp_num
disp_num[15:0]
1
0
文本映射
SW[0]
1
SEGMENT
disp_current
图形映射
SW[1]
digit_seg
temp_seg
0
AN
Scanning
74
时钟和分频
module clk_div(
input wire clk,
input wire rst,
input wire SW2,
output reg [31:0] clkdiv,
output wire Clk_CPU
);
always @ (posedge clk or posedge rst) begin
if (rst) begin
clkdiv <= 0;
end else begin
clkdiv <= clkdiv + 1'b1;
end
end
assign Clk_CPU = SW2 ? clkdiv[24] : clkdiv[1];
endmodule
// SW2选择时钟
存储器

存储器就是二维寄存器变量
reg [31:0] MEM_ROM [0:1024];
reg [31:0] MEM_RAM [0:1024];

实际可用IP核,用工具生成模块
 用寄存器变量很消耗芯片资源
总线接口模块规范
MIO_BUS(
clk,
rst,
BTN,
SW,
mem_w,
Cpu_data2bus,
addr_bus,
ram_data_out,
led_out,
counter_out,
counter0_out,
counter1_out,
counter2_out,
CPU_wait,
Cpu_data4bus,
ram_data_in,
ram_addr,
data_ram_we,
GPIOffffff00_we,
GPIOffffffe0_we,
counter_we,
Peripheral_in);
//data from CPU
//Cpu地址线
//数据存储器输出数据线
//LED回读输入信号
//记数器信号,备用
//记数器信号,备用
//记数器信号,备用
//记数器信号,备用
//Cpu等待,与MIO_ready对应
//write to CPU
//from CPU write to Memory
//Memory Address signals
//数据存储器写信号
//FFFFFF00端口写译码信号
//FFFFFFe0端口写译码信号
//记数器写信号,备用
//送外部分设备的数据线
通用接口设备一 LED设备模块:
ffffff00
Device_GPIO_led ( clk_io,
rst,
GPIOffffff00_we,
Peripheral_in,
Counter_set,
led_out,
GPIOf0 );
通用接口设备二 7段码设备模块:
ffffffe0
Device_GPIO_7seg (clk_io,
rst,
GPIOffffffe0_we,
//7段写控制信号
Input[2:0] Test, //显示通道选择0~7
disp_cpudata,
//作为CPU外设输入通道
Test_data0,
//硬件检测显示通道1
Test_data1,
//硬件检测显示通道2
Test_data2,
//硬件检测显示通道3
Test_data3,
//硬件检测显示通道4
Test_data4,
//硬件检测显示通道5;
Test_data5,
//硬件检测显示通道6;
Test_data6,
//硬件检测显示通道7
disp_num
//送7段码译码模块
);
外部设备模块:通用接口设备三、四
Device_GPIO_SW_BTN

输入,8位Switch和5位Button


addre=f0000000-ffffffff0。A[2]=0
太简单了,直接在译码电路中输入CPU:
Cpu_data4bus = {counter0_out,counter1_out,counter2_out,9'h000,
led_out,BTN,SW};
外设五:计数器模块
Counter_x( clk,
rst,
clk0,
clk1,
clk2,
counter_we,
counter_val,
counter_ch,
counter0_OUT,
counter1_OUT,
counter2_OUT,
counter_out
);
VGA接口模块规范
VGA_IO(
vga_clk,
rst,
vram_out,
Cursor,
Blink,
R,
G,
B,
HSYNC,
VSYNC,
vga_addr,
vga_rdn);
//光标
//闪烁
VRAM模块
Vram_B (
clka,
wea,
addra,
dina,
douta);
// Bus [0 : 0]
// Bus [12 : 0]
// Bus [10 : 0]
// Bus [10 : 0]
VGA扫描同步模块
vga_core (
vga_clk,
//25MHz
rst,
addr,
v_active,
h_sync,
v_sync);
8*8Ascii字库模块
Font_rom (
a,
// Bus [9 : 0]
spo);
// Bus [7 : 0]
PS2键盘驱动模块
ps2_kbd (
clk,
clrn,
ps2_clk,
ps2_data,
rdn,
data,
ready,
overflow);
PS2键盘驱动模块
ps2_kbd (
clk,
clrn,
ps2_clk,
ps2_data,
rdn,
data,
ready,
overflow);
存储与接口地址译码模块
86
外设及接口模块
88
Device_GPIO_led模块代码
module Device_GPIO_led( clk,
rst,
GPIOf0000000_we,
Peripheral_in,
counter_set,
led_out,
GPIOf0
);
input clk,rst,GPIOf0000000_we;
input [31:0]Peripheral_in;
output [1:0] counter_set;
output [7:0] led_out;
output [21:0]GPIOf0;
wire [7:0] led_out;
reg [1:0] counter_set;
reg [7:0] LED;
reg [21:0]GPIOf0;
// GPIO out use on LEDs & Counter-Controler read and write
assign led_out = LED;
always @(negedge clk or posedge rst) begin
if(rst)
begin LED <= 8'hAA; counter_set<=2'b00; end
else begin
if(GPIOf0000000_we)
{GPIOf0[21:0],LED,
counter_set} <= Peripheral_in;
//counter ch1 ch0
else begin LED <= LED; counter_set<=counter_set; end
end
end
endmodule
Device_GPIO_7seg模块代码
module Device_GPIO_7seg( clk,
rst,
GPIOe0000000_we,
Test,
disp_cpudata,
Test_data0, Test_data1,
Test_data2, Test_data3,
Test_data4, Test_data5,
Test_data6,
disp_num
);
input clk,rst,GPIOe0000000_we;
input [2:0] Test;
input [31:0] disp_cpudata, Test_data0, Test_data1, Test_data2,
Test_data3, Test_data4, Test_data5, Test_data6;
output[31:0]disp_num;
reg [31:0]disp_num;
// 7 Segments LEDs read and write & CPU state display
always @(negedge clk or posedge rst) begin
if(rst)
disp_num <= 32'hAA5555AA;
else begin
case(Test)
//SW[7:5]
0: begin if(GPIOe0000000_we)
disp_num <= disp_cpudata; else disp_num <= disp_num; end
1: disp_num <={2'b00,Test_data0[31:2]};
2: disp_num <=Test_data1[31:0];
//counter[31:0]
3: disp_num <=
//Inst
endmodule
Test_data2;
4: disp_num <=Test_data3;
//addr_bus
5: disp_num <=Test_data4;
//Cpu_data2bus;
6: disp_num <=Test_data5;
//Cpu_data4bus;
7: disp_num <=Test_data6;
//pc;
endcase
end
//pc[31:2]
end