SOPC设计教程.docx
- 文档编号:11561421
- 上传时间:2023-03-19
- 格式:DOCX
- 页数:50
- 大小:1.56MB
SOPC设计教程.docx
《SOPC设计教程.docx》由会员分享,可在线阅读,更多相关《SOPC设计教程.docx(50页珍藏版)》请在冰豆网上搜索。
SOPC设计教程
SOPC设计教程
实验室:
ESDA与嵌入式技术实验室
时间:
2010年4月29日
导读
本文主要面向FPGA初学者,向读者介绍SOPC设计的详细流程。
读者必须初步掌握VHDL或verilog和C语言等语言,以及FPGA和NiosⅡ处理器的基本原理。
文章以SD控制器作为对象,简要介绍SD控制器的设计原理,重点介绍底层模块的设计流程,以及顶层系统的整合和验证过程。
文章分为基础和提高两部分。
基础部分内容包括:
命令发送模块,响应接收模块,CMD整合模块,时钟管理模块等模块的设计。
基础部分的读者可直接从第四节开始学习。
了解上述模块的设计流程,从中了解到QuartusⅡ的设计流程,包括建立工程文件、建立设计文件、全编译、建立波形仿真文件、时序仿真、调用计数器和锁相环PLL等IP核、以及配置PLL参数。
提高部分的读者需通读全篇,则可从中了解到SOPC的设计思想,片上架构的设计、底层模块的顶层整合、NiosⅡ用户C代码的开发、软硬件的协同工作原理及控制器的功能验证;懂得如何配置NiosⅡ软核、如何联合使用QuartusⅡ7.2和NiosⅡ7.2IDE两套开发工具协同完成SOPC设计,以及如何利用signalTapⅡ逻辑分析仪来辅助控制器验证。
自动化学院电子系实验室ESDA及嵌入式系统设计实验室具有丰富的资源及完善的实验平台,供FPGA初学者完成本教程的实验。
实验室拥有Altera公司DE2的FPGA开发板,开发工具QuartusⅡ7.2及NiosⅡ7.2IDE及SDCard。
陈平
摘要
本文详述SDCard控制器的设计流程,包括底层模块设计,系统顶层的整合,用户软件指令的编写,控制器初始化功能的实验验证。
SDCard控制器底层模块包括:
命令发送模块,响应接收模块,命令合成模块,时钟管理模块,及NiosⅡ处理器等部分。
文章详述每一个模块在QuartusⅡ7.2工具中如何建立工程,编写VHDL,编译及时序仿真;接着介绍如何将底层模块打包,整合成顶层系统;然后介绍如何配置NiosⅡ处理器参数,如何在NiosⅡ7.2IDE工具中编写用户C代码,编译及下载到FPGA上;最后详述如何借助SignalTapⅡ工具辅助SD控制器初始化功能的实验验证。
本文简单介绍SOPC设计流程及SD卡控制器的原理,重点介绍SD卡控制器的设计过程。
以下给出本文的内容结构:
第一节:
简述SOPC的设计流程。
本节结合SD控制器的设计来阐述SOPC设计流程。
第二节:
简述SDCard控制原理。
本节简单介绍SDCard控制器的初始化原理,不涉及SDCard的读写原理
第三节:
简述SDCard控制器片上架构。
本节简单介绍SD控制器片上架构,模块功能及接口信息。
第四节:
详述SDCard控制器模块设计流程。
本节详述如何借助QuartusⅡ7.2开发工具来实现SDCard控制器底层模块设计及仿真。
第五节:
详述NiosⅡ配置及C代码设计。
本节详细介绍如何在NiosⅡ7..2IDE开发工具上编写用户C代码,编译及下载代码。
第六节:
详述SDCard控制器实验验证。
本节详细介绍如何在DE2开发板上,在SPI模式下对SDCard的初始化功能进行实验验证,并得出结论。
第一节简述SOPC设计流程
本文提及的SDCard控制器本质为一款SOPC芯片,其设计流程符合SOPC设计的一般流程。
结合SOPC的一般流程简单介绍SDCard控制器的设计流程。
其流程如图1.1所示:
图1.1SDCard控制器的设计流程图
(1)分析SDCard控制器原理:
本文实现SDCard控制器的初始化功能,其初始化原理将在第二节中简单阐述。
(2)分析软硬件功能。
在掌握SDCard工作原理之后,不仅要确定其控制器的功能,而且要分析系统层次,分割软硬件各自承担的功能,最终实现软硬件协同工作。
(3)片上规划,设计架构。
依据片上系统的功能层次和软硬件功能分割情况,进行片上规划,设计控制器的架构。
第三节将简单阐述。
(4)设计模块,配置软核。
根据片上架构,开始设计基于LEs(LogicElements)的用户硬件模块,并调出NiosⅡIP核进行参数配置。
参数选择以适合用户需求为主。
(5)模块仿真验证。
对用户基于LEs设计的模块(扩展名为:
.vhd或者.bdf)进行时序仿真,验证其功能及时序是否正确。
再进行打包封装(扩展名为:
.bsf),以供顶层文件调用例化。
(6)例化顶层系统。
在完成底层模块的验证之后,根据模块的接口信息,进行模块间的连接,形成顶层文件(扩展名为:
.bdf)。
并对顶层文件进行编译,下载到FPGA片上,供软件程序调试。
(7)编写C代码。
在QuartusⅡ7.2上完成了控制器片上硬件的设计,开始在NiosⅡ7.2IDE为NiosⅡ处理器开发用户的C代码,并在该开发工具上对C代码进行编译,最后下载到FPGA上进行软件调试。
(8)实验验证。
DE2开发板上FPGA已经通过SPI接口与SDCard连接,只需分配好管脚并可以实现FPGA与SD卡的通信。
借助QuartusⅡ7.2上的SignalTapⅡ工具辅助验证SDCard控制器的初始化功能。
第二节简述SDCard控制器原理
2.1SD卡接口简介
SD卡(SecureDigitalMemoryCard)是一种基于半导体快闪记忆器的新一代记忆设备。
其广泛应用到MP3,移动电话,PDA,数码相机,电子图书等电子产品中。
其结构及控制模式如图2.1(a),(b)所示:
(a)(b)
图2.1(a)SD卡内部结构图及外部引脚(b)SD卡SPI模式的连接图
在SPI模式下,其针脚定义如表1.1所示:
表1.1SPI模式下针脚定义
针脚
名称
类型
描述
1
CS
I
片选
2
DI
I
数据输入
3
Vss
S
地
4
Vcc
S
供电电压
5
CLK
I
时钟
6
Vss2
S
地
7
DO
O
数据输出
2.2SD卡命令简介
SD卡自身具有完备的命令系统,以实现各项操作。
命令格式如下图2.1所示:
图2.1SD控制器的命令格式
其中,CONTENT包括6bits的命令代码index和32bits的地址参数address。
SPI模式下SD卡应答格式如下图2.2所示:
图2.2SPI模式下SD卡应答R1格式
在SPI模式下SD卡和控制器之间的通信模式如下所示:
CommandFromControllertoSD
DI
DO
ResponseFromSDtoController
图2.3SPI模式下控制器与SD的通信模式
2.3SD卡初始化简介
SD卡初始化时应遵循一定的步骤。
首先要将SPI时钟CLK降低到100KHZ至400KHZ之间,然后至少等待74个时钟周期,接着拉低片选信号CS,并发送CMD0命令,对SD卡进行复位并使其进入SPI模式,CMD0对应的index=0x00;校验码CRC=0x95。
若是控制器接收到R1=0x01则说明SD卡进入空闲状态。
继续发送CMD1来激活卡的初始化过程。
C 至此完成了SD卡的初始化。 上电 图2.4初始化流程图 根据以上的流程图,给出发送CMD0及CMD1的时序图如图2.5所示: (a) (b) 图2.5(a)发送CMD0的时序图(b)发送CMD1的时序图 2.4本节小结 本节简单介绍SD卡外部接口信息,控制器的命令格式及响应格式,简单介绍其初始化原理及时序图。 本节是SD控制器功能设计的基础。 SD控制器的架构设计及模块设计均根据其原理来实现。 第三节简述SDCard控制器架构 根据上文对SD控制器原理的分析,本节开始划分控制器功能层次,分配软硬件功能,制定片上架构。 本实验对SD控制器的片上规划如图3.1所示: CMD CS CLK Recivev_doneDO response 图3.1SD控制器的片上规划 (1)时钟管理模块: 提供时钟分频,得到两个不同频率的时钟clk_25MHZ和clk_195KHZ。 内部由PLL锁相环,7位计数器及二选一选择器构成。 外部输入时钟频率为50MHZ。 (2)NiosⅡ处理器: 作为控制器的核心,主要负责片选SD卡,选择SD卡时钟频率,生成命令,加载命令,启动命令发送,读取SD卡响应命令,分析判断命令。 (3)命令合成模块: 接收来自NiosⅡ处理器的Index,address,CRC等数据,加上开始位‘0’,传输位‘1’,结束位‘1’,合成完整的命令。 (4)命令发送模块: 加载命令,发送命令。 响应接收模块: 接收SD的响应,并将数据送回NiosⅡ处理器。 只接收响应数据,不对数据做任何分析判断。 第四节详述SDCard控制器模块设计 4.1命令发送模块设计流程 命令发送模块的接口信息如图4.1所示: 图4.1发送模块的接口信息 其中: clk: 时钟 reset: 复位 load: 加载命令 send: 发送使能、有效 data_load: 命令数据(48bits) CMD_out: 串行发送 功能: 负责发送命令,load=1加载data_load,load=0后,send=1则串行输出data_load,data_load发送完之后CMD_out保持高电平。 该模块只负责发送信息,不负责其他任何功能。 模块的设计流程如下: (1)在QuartusⅡ上建立工程文件: 点击File->NewProjectWizard...得到图4.1所示: 图4.1点击工程向导 (2)填写工程库文件路径,工程名字,顶层文件名字,三者名字要对应。 如图4.2所示 图4.2填写工程向导 (3)选择FPGA的型号,要和DE2开放板上的FPGA型号对应,如图4.3所示 图4.3选择器件型号 (4)在按Next之后选择Finish,完成工程向导,可以开始VHDL程序编写。 点击菜单工具栏左上角New(新建文件)图标得到下图,选择VHDLFile打开编辑界面,建立*.vhd文件。 如图4.4所示: 图4.4选择VHDLFile编辑工具 (5)编写好VHDL程序,如果该文件为顶层文件,那么其entity名称,文件名称要和工程名称一致。 点击全编译快捷按钮 ,开始编译用户程序。 如图4.5所示: 图4.5编写好VHDL程序之后点击全编译 (6)全编译通过之后出现以下界面如图4.6所示。 如果编译出错,则会停止继续编译,并且在下面Messege栏目中出现错误原因。 图4.6编译成功 (7)建立仿真波形文件*.vwf。 在图4.4界面中点击OtherFiles,并选择VectorWaveformFile。 如图4.7所示: 图4.7选择波形编辑工具 (8)在波形编辑界面中,鼠标指向Name栏的空白处双击出现如图4.8(a)的图标,其中Radix指引脚数据显示格式,本模块选择Binary格式,即二进制格式。 点击NodeFinder..得到图4.8(b)所示,选择Pins: all。 然后点击List按钮,再点击双箭头“>>”得到图4.8(c)所示。 点击OK键后得到图4.8(c)所示,输入波形需要人工添加。 在波形左边有竖排工具栏用于编辑激励波形,其中OverwriteClock图标是用于时钟频率设置,在菜单Edit->EndTime..中可设置激励波形的时间长度。 通过设置得到了图4.8(e)所示。 保存之后打开菜单Processing->SimulationTool得到图4.8(f),点击Start键开始仿真,得到了图4.8(g)的仿真结果。 根据输入输出波形来判断验证模块功能。 图4.8(a)选择引脚显示格式 图4.8(b)选择实体的所有引脚 图4.8(c)选择要显示的引脚 图4.8(d)得到波形激励文件 图4.8(e)手动输入激励波形 图4.8(f)打开仿真工具 图4.8(g)波形仿真结果 (9)验证完命令发送模块之后,对send_model.vhd进行打包成为send_model.bsf。 点击菜单File->Create/Updata->CreateSymbolFilesForCurrentFile,得到了如图4.9所示的图形。 send_model.bsf将作为顶层控制器的调用模块。 图4.9send_model.bsf图形 4.2响应接收模块设计流程 响应接收模块的接口信息如图4.10所示: 图4.10响应接收模块接口信息图 其中clk: 时钟 Reset: 复位 data_out: SD卡数据输入 rec_done: 接收完成信号,为单周期高电平脉冲 R_data: 读取的数据 功能描述: 在检测到‘0’时开始接收8位数据,接收完数据后将数据写入R_data八位寄存器中,并发一个高电平脉冲,作为NiosⅡ中断信号,Nios跳入中断程序读取R_data进行分析(该信号在初始化功能中暂没使用,保留该信号主要是为以后服务于读写功能的开发)。 该模块只负责接收数据,不负责数据分析。 该模块在QuartusⅡ的设计,编译,仿真流程同命令接收模块一样。 响应接收模块打包的文件为rec_mode.bsf,其图形如图4.11所示: 图4.11rec_mode.bsf图形 4.3命令合成模块设计流程 命令合成模块的接口信息如图4.11所示: 图4.12命令合成模块接口信息图 其中Index: 命令代码, Address: 命令参数 CRC: 校验码 Reset: 复位信号 CMD_load: 完整命令数据 命令合成模块,将指令拆分成开始标志位‘0’,传输标志位‘1’和结束标志位‘1’。 其中address,index,CRC三者由NiosⅡ处理器写入。 该模块的设计流程类似命令发送模块的设计流程。 命令合成模块打包文件CMD_comb.bsf如图4.13所示: 图4.13CMD_comb.bsf图形 4.4时钟管理模块设计流程 时钟管理模块的接口信息如图4.12所示: clkin flagclkout 图4.14时钟管理模块接口信息图 其中clkin: 外部输入时钟,频率为50MHZ flag: 选择信号,用于切换时钟频率 clkout: 时钟输出,作为SD控制器及SD卡时钟 该模块的设计流程如下: (1)调用锁相环PLL及配置参数: 在QuartusⅡ下建立工程文件,其流程同上图4.1,图4.2,图4.3,在建立文件的时候选择图表输入工具如图4.15所示: 图4.15选择图表输入工具 打开IP库调用PLL核。 选择菜单Tools->MegaWizardPlug-InManager..得到图4.16(a)所示。 图4.16(a)打开IP库 点击Next得到图4.16(b)。 选择左边IP库中的ALTPLL,并且在输出文件路径中输入该核的名称PLL0。 点击Next以配置PLL参数。 得到图4.16(b)。 图4.16(b)IP核的选择 点击Next之后,得到图4.16(c)。 选择外部输入时钟50MHZ,因为DE2提供了外部输入时钟为50MHZ。 图4.16(c)选择外部输入时钟 点击Next之后得到图4.16(d),去掉“Createan‘areget’inputtoasynchronouslyresetthePLL”和”Create‘locked’output”。 点击两次Next之后得到图4.16(e) 图4.16(e)时钟参数配置 选择clockdivisionfactor为: 2,表示输出频率为输入频率的一半。 然后点击Finish,得到图4.16(f),点击Finish。 至此完成了PLL的调用和参数配置。 图4.16(f)PLL核的文件生成 (2)调用计数器及配置参数 完成了PLL的调用及配置之后,接着调用计数器IP核。 其调用过程与PLL相似。 选择菜单Tools->MegaWizardPlug-InManager..。 选择相应的IP核并填写名称: frequence。 如图4.17(a)所示: 图4.17(a)选择计数器LPM_COUNTER并填写输出文件名称 点击Next得到图4.17(b),选择计数器输出总线位为: 7位;选择计数方向为: Uponly。 图4.17(b)计数器的参数配置 继续点击Next,其它参数按默认,忽略跳过,最后选择Finish,得到了计数器IP核的输出文件如图4.17(c)所示。 图4.17(c)计数器IP核的输出文件 (3)调用二选一选择器: 其调用流程与上文类似。 同样选择IP核类型并填写IP核的名称: lpm_mux0。 得到图4.18(a)所示。 图4.18(a)选择IP核并填写IP核的名称 点击Next之后,配置该选择器为二选一,参数如图4.18(b)所示: 图4.18(b)配置选择器参数 点击Next之后,最后得到了文件的输出界面如图4.18(c)所示: 图4.18(c)选择器的文件输出 (4)例化PLL,计数器和选择器到顶层文件clk_managment.bdf中。 打开图形编辑界面如图4.15所示。 在图像编辑界面空白处双击得到了以下图形如图4.19(a)所示。 图4.19(a)调出打包模块 展开Project项目,会看到里面出现模块文件*.bsf。 其中有PLL,frequence,lpm_mux0三个模块,分别双击之后放到编辑界面的空白处,根据接口定义连接三个模块。 其连接图如图4.19(b)所示: 4.19(b)连接底层打包模块成顶层文件 由于计数器功能用于分频,所以只取其最高位连接二选一选择器。 对该文件进行打包,点击菜单File->Create/Updata->CreateSymbolFilesForCurrentFile,得到clk_managment.bsf文件供SD控制器顶层文件调用。 其图像如图4.20所示: 图4.20clk_managment.bsf图形 4.5本节小结 本节详细阐述了SD控制器底层模块的设计流程。 模块的设计流程基本一样,其区别在于采用的输入方式为VHDL语言输入或者是图表输入,或者是调用IP核的输入。 本节介绍的流程是将各个模块分别作为一个工程来设计,而更方便的做法是直接建立起一个SD控制器的工程,再在工程下建立起多个模块文件,分别对模块进行设计,编译,仿真之后供SD控制器顶层文件调用。 第五节详述NiosⅡ配置及C代码设计 本节开始介绍SOPC工具的的使用,如何调用NiosⅡ核并配置其参数。 并且基于该核的参数利用NiosⅡ7.2IDE来编写C代码,实现相应的功能。 5.1配置NiosⅡ软核 (1)NiosⅡ接口信息如图5.1所示: 图5.1NiosⅡ处理器接口信息 其中clk: 时钟输入 reset: 复位信号 Rec_done: 接收完响应命令的标志 R_data[7..0]: 响应命令数据 Int_flag: 初始化标志 Index[5..0]: 命令代码 Address[31..0]: 命令参数 CRC[6..0]: 校验码 Send: 发送命令控制信号 Load: 加载命令数据 CS: SD卡的片选信号 error_led: 错误标志,该引脚连接LED灯。 NiosⅡ处理器生成命令之后写入load=1,加载到发送模块,然后写入send=1,load=0开始发送命令。 当接收到SD卡的响应命令后,rec_done=1,处理器中断读取该数据R_data[7..0]进行分析。 Int_flag作为初始化的标志,同时作为时钟管理模块的控制信号,来选取系统的输入时钟频率。 当发送命令之后在一定时间内没收到正确的响应命令则将error_led置高,点亮LED。 (2)建立SD控制器的工程文件SD_Controller.qpf。 其流程与上文建立模块工程文件的流程一样。 选择图表输入方式如图4.15。 建立工程名字为: SD_Controller,并将所有子模块目录下的*.bdf,*.vhd,*.bsf文件复制到SD控制器的工程目录下,供顶层文件调用。 打开SOPC界面。 点击菜单Tools->SOPCBuilder,得到了图5.2(a)所示: 图5.2(a)SOPC工具界面 选择目标语言并填写NiosⅡ处理器的名称: SD_core。 按OK之后双击左边的IP核NiosⅡProcessing,得到了图5.2(b)所示: 图5.2(b)选择NiosⅡ核的类型 按Finish之后,选择片内存储器,在左边IP库中双击MemoriesandMemoryControllers->On-Chip->On-ChipMemory(RAM)。 得到图中关于RAM的参数配置界面。 如图5.2(c)所示: 5.2(c)片上存储器的参数配置 默认参数按Finish。 按照图5.1NiosⅡ处理器接口信息,继续配置其PIO核。 双击Peripherals->MicrocontrollerPeripherals->PIO(ParallelI/O),得到了图5.2(d)关于PIO的参数配置图形。 图5.2(d)PIO核的参数配置 此处配置的是Index[5..0],因而选择数据宽度为: 6bits,端口类型选择OutputPortOnly。 按Finish确定之后,在PIO核处右键选择Rename之后将名称改为: Index。 如图5.2(e)所示: 图5.2(e)修改PIO核的名称为: Index 其他的接口的操作步骤类似Index[5..0]的操作方式,包括: send,load,CRC[6..0],address[31..0],int_flag,CS,error_led。 配置输入端口,其中clk,reset为默认端口,无需手动分配PIO核。 配置R_data[7..0]的操作步骤如图5.2(e)所示,数据宽度填写为: 8bits,管脚方向选择为: InputPortOnly。 点击Finish完成参数配置,再重新修改该PIO核的名称为: R_data。 配置rec_done方法如R_data,在配置完数据宽度为: 1bits,方向为: InputPortOnly,点击Next得到图5.8(f)所示。 图5.8(f)配置中断引脚的参数 其中勾选Synchronouslycapture-Risingedge;勾选GenerateIRQ->Edge,表示rec_done上升沿触发中断。 然后点击Finish完成参数配置。 在完成所有PIO核的调用之后,得到如图5.8(g)所示: 图5.8(g)完成NiosⅡ的配置 在图中双击CPU得到如图5.8(h)所示。 选择NiosⅡ的指令存储器之后按Finish完成。 图5.8(h)选择NiosⅡ处理器的存储器 点击菜单System->Auto-AssignBase
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SOPC 设计 教程
![提示](https://static.bdocx.com/images/bang_tan.gif)