您的位置 首页 模拟

零根底学FPGA (二十) 触类旁通,根据SOPC的定时器中止与串口数据收发

SOPC的课程已经结束了,短短4天,要消化的内容还真不少。今天又开始了DDR2 SDRAM的课程,其实在我来北京之前他们已经开始SDRAM的课程了,想起我做SDRAM的时候,真的是好费劲,又没人指

  SOPC的课程现已结束了,短短4天,要消化的内容还真不少。今日又开端了DDR2 SDRAM的课程,其实在我来北京之前他们现已开端SDRAM的课程了,想起我做SDRAM的时分,真的是好费力,又没人点拨,代码写了一大串,前仿真也做的差不多,后仿就不行了,有些东西不知道怎样处理,还涉及到时序束缚这门听起来巨大上的常识,所以那段时刻把我纠结的不轻。看样子在我脱离北京之前这边应该是一直讲SDRAM了,上课的是李凡教师,一个很和蔼,很低沉的教师,听说现已做了三四十年的工程师了,也是国内顶尖的人物了。计划这几天好好再学一下SDRAM,究竟这东西用途很广,远景也很明亮,估量消化掉SOPC的内容后就要再开端SDRAM的征途了,这样在北京的20天也就不虚此行了~

  今日咱们讲守时器中止与串行口中止,信任学过单片的朋友都用过这东西,对这东西也并不生疏,其实无非便是咱们曾经是对单片机编程,今日是对咱们前次自己建立的那个硬件体系进行编程,即咱们的NIOS II 处理器。

  和上个试验相同,小墨同学先来跟咱们学文档,从文档下手,做到每一条代码都有根有据吧,这次仍是要用到这个文档 n2cpu_nii5v3,我会附在文章后边等会,供咱们下载

  咱们先来看守时器这个核

  

360桌面截图20150128201231.jpg

 

  学IP核总要先知道这个核是干什么的吧,这儿就和咱们一同来啃啃英文,有一点仍是提示咱们,文档仍是要看原版,即便你的英文不怎样好,也要试着去看,渐渐的就好了,我一般是喜爱开着有道词典一般看英文,遇到没见过的词鼠标一点就出来了,个人感觉比较便利,咱们也能够试一下

  咱们先来整体看一下这个核,上面一段英文是说呢,

  1、这个守时器核能够装备成32位或许64位的守时器,这个咱们在SOPC builder里边现已装备好了

  2、能够操控守时器的开端,中止与复位

  3、有两种计数形式,一种是计数一次就中止,一种是持续计数。其实咱们的守时器是先让咱们设定一个初值给它,然后守时器从这个初值开端递减,第一种计数形式便是守时器从初值递减到0时就中止计数了,第二种形式呢便是依然持续计数

  4、第四行就告知了咱们这个计数器的计数方法,即递减式计数

  5、然后后边那几行呢大约便是说有几种操作选项,例如咱们能够开端或许封闭守时器中止啊,敞开看门狗守时器啊,当守时器计满一次数的时分宣布一个高脉冲信号啊之类的

  大约便是这些内容了吧~

  然后咱们能够去看一下它的功用描绘框图这一页,加深一些了解

  

360桌面截图20150128202646.jpg

 

  大约意思便是说,这个守时器核里包含了这么多寄存器,什么状况寄存器,操控寄存器之类的,当咱们敞开寄存器的时分,count里会主动载入咱们设定的初值,开端计数,当计满一次的时分会产生一个中止给CPU,知道大体意思就行,详细的到后边寄存器视图再仔细看他们的详细功用

  下面咱们需求看一下它的software files这一页,知道要用到哪些头文件

  

360桌面截图20150128203158.jpg

 

  要点来了,咱们首要的使命便是看这个守时器核的寄存器映射视图,这也就直接关系到咱们代码的编写

  

360桌面截图20150128203416.jpg

 

  上面一段话大体意思是说啊,咱们假如运用了硬件笼统层体系库供给给NIOS II处理器的这样一个规范装备的话,咱们就没必要去拜访守时器这个核的寄存器了,一般来说这个寄存器映射图是准们给咱们编写器材驱动用的

  前面一段话我了解的不是很好,不敢在这儿忽悠咱们,可是咱们的意图便是编写器材驱动嘛,所以咱们仍是能够运用的

  下面就能够看到这个核为咱们供给的几组寄存器了,大体阅读一下,首要是看下面的功用介绍

  先来看这两个寄存器

  

360桌面截图20150128204209.jpg

 

  状况寄存器的第零位呢是TO位,TO从字面上了解便是timeout,即时刻溢出嘛,便是说当咱们计数器计到0 的时分TO位会主动被置1,假如咱们想要置0的话需求在状况寄存器里手动清0,这也就解说了为什么咱们后边的代码每次进入中止今后为什么要清TO位了

  RUN寄存器能够经过上面的解说大约说,RUN寄存器是用来指示守时器当时状况的一个数据位,即当寄存器作业的时分他被设置为1,不然设置为0 ,并且这一位不受你往状况寄存器写数据的影响。

  操控寄存器呢大约便是敞开封闭中止,开端计数或许中止计数之类的,咱们能够自己消化英文,下面的period_n寄存器无非便是咱们设置一个初值给它,咱们也能够自己看

  好了,需求看的也就这些了,下面便是咱们依据咱们从文档中取得的常识去编写咱们的代码了

  

360桌面截图20150128205326.jpg

 

  首要便是界说头文件么

  system.h即咱们硬件体系生成时产生的,里边界说了咱们各种模块的基址啊,位宽啊之类的,下面便是咱们要操作的七段数码管的基址及相关信息,,有了基址咱们才干拜访到数码地点的PIO,才干给他赋相应的值

  

360桌面截图20150128205639.jpg

 

  其他那些头文件无非便是守时器核的寄存器头文件和数据类型头文件,还有IO操作的的一些函数的头文件

  代码部分其实很简略,先是设置守时器中止,每进入一次中止将TO位清零,这儿用到IOWR这个函数便是IO头文件里边界说的一个函数之一,用来对状况寄存器进行写数据,然后便是数据自加1,因为咱们在sopc builder里边设置的时分设置的守时器守时单位是ms,所以咱们计数1000次也便是1S了

  主函数部分便是上来调用函数对数码管的位选和片选端初始化,将守时器中止翻开,这些都没什么,要留意一点便是中止函数的注册,即 alt_irq_register(TIMER_IRQ,TIMER_BASE,handle_Timer0_interrupts);

  便是咱们给我的守时器一个界说,即咱们要拜访的守时器的基址,和要命名的姓名,只要注册了中止,咱们才干进入中止函数

  好了,咱们能够暂时越过调试这一环节,因为工程比较简略,咱们能够直接下板

  

360桌面截图20150129110928.jpg

 

  鄙人板的过程中咱们可能会遇到这样下载失利的状况

  No Nios II target connection paths were located. Check connections and that a Nios II .sof is downloaded.

  留意要按次序来做,一般是先下载硬件装备文件.SOF,再对软件进行全编译,然后再下载一般就能够处理了

  下面咱们再来看UART这个核

  

360桌面截图20150129111751.jpg

 

  先来整体来看一下这个核,大体上是说啊,这个UART核能够经过Avalon总线,作为Avalon总线的一个从机,来完成FPGA与外围器材之间的通讯,这个核遵守RS232时序协议,供给了可手动装备的波特率啊,奇偶校验位啊,中止位啊之类的数据位,操控数据流向啊,答应设计者调用体系给出的必要的一些函数啊之类的

  再大体看一下功用框图

  

360桌面截图20150129112444.jpg

 

  和之前的差不多,核的内部也是一系列寄存器,时钟进来之后进入divisor ,进行波特率的装备,然后经过操控寄存器啊,状况寄存器啊操控数据的读写功用,大体上是这个意思,详细还要看后边的寄存器映射视图

  过分详细的东西这儿不做介绍,留给咱们渐渐消化,首要是来看一下它的寄存器映射视图

  

360桌面截图20150129113009.jpg

 

  这儿有6组寄存器,包含什么读写寄存器,操控寄存器,状况寄存器,波特率设置寄存器之类的,详细功用迥然不同,简略来看一下

  先来看一下读寄存器吧

  

360桌面截图20150129113309.jpg

 

  大体上是说啊,这个读寄存器能够保存住来自RXD口输入过来的数据,当一个新的字符彻底进入这个寄存器之后啊,那么状况寄存器的rrdy位将会主动置1,当读寄存器中的数据被读出的时分,rrdy位主动置0,假如当读寄存器中的数值还没有被读完,又有新字符输入的话,那么就会产生过错,状况寄存器的的roe位主动置1,新的数据将会掩盖原有的数据,对读寄存器写数据是没有影响的,大体上便是这个意思了

  状况寄存器位数太多,这儿就不逐个解说,大体上是说,当产生各种过错,例如什么奇偶校验位过错,中止位过错之类的,接纳发送过错之类的,还有指示读写寄存器状况的,当有数据的时分置1,空的时分置0之类的,咱们仍是自己去了解

  操控寄存器首要是操控中止,包含这种中止,这儿咱们只需求用到发送中止和接纳中止,其他的咱们能够自己看一下

  

360桌面截图20150129114859.jpg

 

  代码部分呢主先来看一下初始化部分

  

360桌面截图20150129115222.jpg

 

  因为咱们设置的NIOS II处理器是32位的,因而咱们的寄存器偏移地址依据基址也就知道了,即32/8 = 4,

  先对操控寄存器操作,翻开就收发送使能端,control寄存器是第5个寄存器,偏移为12

  IOWR_16DIRECT(UART_BASE,12,0xc0);

  状况寄存器清零,状况寄存器偏移为8

  IOWR_16DIRECT(UART_BASE,8, 0x0);

  注册中止函数

  alt_irq_register(UART_IRQ,UART_BASE,Uart_rx_ISR);

  接纳中止部分首要便是将状况寄存器的数值读回,判别状况寄存器的rrdy位的状况,假如是1的话那么标明数据接纳结束,能够读了,然后将数据保存起来,将接纳数据方位1标明咱们现已收到数据了

  

360桌面截图20150129120555.jpg

 

  今后小墨同学的教程会跟这款开发板配套,想跟小墨同学一同学习,一同前进的的能够考虑一下购买一块开发板,究竟学习要舍得出资嘛

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/moni/116463.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部