跟我写ARM处理器之一:从写module arm开始

发布者:科技革新者最新更新时间:2016-07-19 来源: eefocus关键字:ARM处理器  module 手机看文章 扫描二维码
随时随地手机看文章
我决定把我写ARM处理器的经验分享给大家。不是自卖自夸,我这个核是非常好的核。一个证明方法是下载入FPGA,看她是不是能工作。这种证明方法,我已经做到了。大家如果可以下载整个工程文件,稍微改造一下,即能验证是否成功。但是这还不是推广她的方法。因为对于大多数人来说,只是知其然不知其所以然。人们对于不熟悉、不了解的事情,总是觉得神秘,那么对于她的应用,就会大打折扣。推广她的最好的方法,就是让她成为人人能够轻松写的核。我希望以此推动大家对于SOC设计的热情。可以想象,如果最神秘,最复杂的CPU核,都可以轻松的写出来的话,那么还有什么能够难得到我们的呢?

 
   在写之前,我要申明两点精神。这两点精神当然不是我创造的,我只是引用起来,让大家更能读下去,能相信我是能创造这个奇迹的,当然你也能创造这个奇迹的。第一点就是毛主席在军事上经常用的“分而歼之”,在政治上的意思就是“拉一派,打一派”。这一招在毛主席的斗争生涯中屡试不爽,成就了他成了伟人。这一点国外叫做“divide and conqur(没拼写对,懒得查了)",也是很重要的一个方法。所以在面对庞然大物的时候,千万别害怕,一定要祭起这个”法宝“。第一步,先试着“divide",一定让这个庞然大物小起来,然后再小下去,先条分缕析了,已经算成功了一大半了;第二步,从最小的开始,一点点的做,做对了,做好了。好到什么程度?好到这一小点绝不会打扰我们继续征服下一小点为至。那么征服这个庞然大物就只是时间问题了。包括我现在写这个文章,就得用这个精神,不然的话,千头万绪,从哪里说呢?从哪里说的清呢?不用怕,我既然用这个方法征服了ARM core,那么把它讲出来,讲明白,绝对比写arm core要简单,我相信我也能够完成的。
   
   但是我缺一点东西:那就是视角问题。因为我是站在我的立场上,我了解一切,我讲的时候,只是想当然的从我的角度认为大家该了解什么。但实际上,这中间的差距,就像梦想和现实的差距一样远。所以我需要大家有反馈,那一点忽略了,及时提醒我,让我始终站在大家的立场上,讲东西,而不是让我自说自话。如果我自说自话,效果非常差。所以请大家成全我,成全我就是成全自己。如果可能,请及时提出不明白的地方。让我把这今天的这一小节征服到不会打扰我征服下一小节,这是符合我上面的精神。
   
   有网友,可能会问,我费心费力的图什么?为什么要成全我?我图啥呢?反正我从小也算一个调皮的孩子,越是大人不让我干的事情,我还是愿意冒险试一下。当然总体来说,我小时候也算听话,属于只做”建设性“破坏的人,掏马蜂窝、堵烟筒这事不干。现在有一件特别有意义的事情,比如ARM公司的这些达人们,卖ARM7核卖的不亦乐乎。突然,我闯进来,说这东西根本不值钱,你得卖真货,不是特别有意思么?ARM公司越不爽,其实对于大家来说越是爽。因为大家总体的水平提高了,那么ARM公司就必须努力提高自己的水平,这样才能凸显他自己的价值。所以这件事情想起来就特别有意思,所以我就决定做这么一件”建设性“破坏的事情。所以请大家成全我,成全别人其实也是成就自己,请大家和我一起实践吧。所以,我如果是个软件工程师,我一定会写些病毒啥的,有意思呀!但放心我只会做“建设性”的,我做的病毒绝不会给大家带来太多麻烦,因为这不符合我的风格。但我现在既然是一个硬件工程师,就得想方法在硬件上做一些大事。做一些让让某些“大人”不爽的事。人在世上,也就图一乐嘛。呵呵,说多了。
   
   说了半天,还没有说第二点精神。其实第二点也就包括在第一点上了。不过还是有分别的。这第二点精神就是古人的”格物致知“的功夫。古代这些儒学大家们经常对着一花一叶格个半天啥的,就是这种精神的极致。"divide and conqur"只是斗争原则,但是怎么conqur呢?我觉得要用古人的”格物致知“,也就是耐得烦,从最细小的东西”格“起。我在后面对每一个net,每一个wire都描述出来,就是这样”格“的结果。cpu是一套复杂的系统,要做的好,就得用net, wire, register搭起来,听说intel就是这么干的。不过我是和它有分别的。因为我的这一套,还是把很多功夫交给综合器完成,我只是描述出来,让综合器明白而已。
   
   闲话休提,我希望大家看了我这一系列的文章后,能够把我的arm核写出来。当然你能发挥,我希望的是大家发挥,把这个核写的更好。因为我在做离经叛道的事情,哪能希望别人”墨守成规“把我的核当成标杆?我只是希望抛砖引玉。我要抛出一块砖,对arm这个皇帝的新衣说出:你根本没穿衣服!难道我知道这个了,不应该告诉大家么?所以尽情的糟蹋我的arm核吧,因为这样,它存在的意义更大。
   
   开始写了:第一句是: module arm ( 。这恐怕是verilog设计的经典开篇了。然后是什么?是定义接口。接口其实规定了大部分的功能,对于IP核的重用,交代清楚接口,跟下家说明清楚,别人才好用核。

    module arm (
                 clk,
                 rst,
                 cpu_en,
  clk是时钟,rst是异步复位信号。这个就不需要我多解释了。cpu_en是什么?cpu_en是同步使能信号。也就是说只有在cpu_en==1'b1时,整个核才工作。如果cpu_en==1'b0时,那么这个arm 核就不工作了。简单的说,就是在这个verilog文件里面的所有register都不做什么改变。这就好像有些童话里面说的“时间停止”,城堡里面的人都静住了,一切都停止了。那么寄存器就属于住在城堡里面的人,因为只要他们安静了,没有活物了,那些依靠人而存在的工具就不会动了。这个cpu_en对于整个模块也是重要的,比如你不想让它工作了,就可让cpu_en==1'b0,那么他就不工作。再让他工作,只要让"cpu_en==1'b1"就可。我在这个FPGA的项目中,就应用这个输入连到一个“开关”上。如果扳到"1'b1",那系统开始工作;如果扳到"1'b0",那它就停住,我就通过串口,把新的code下到它的rom中。

                cpu_restart,
                irq,
                fiq,
                rom_abort,
                ram_abort,
 这是ARM的五个中断源,具体的可以参考ARM的文档,我在这里只是简略带一遍。cpu_restart相当于一个同步复位,它只要是高电平,那么系统又重头开始了。irq,fiq是两个中断,只要它等于“1'b1”如果cpsr没关掉它,就得执行相应的中断。rom_abort, ram_abort是对应于rom,ram读错误,则启动一个中断来处理这些事情。

               rom_en,
               rom_addr,
               rom_data,
  这三个信号连接到ROM中,是指令的来源。取指令的方法是:rom_en==1'b1时,在下一个时钟,存放在rom_addr位置的code就出现在rom_data了。当然如果rom_en==1'b0,则rom_data保持原来的值不变。这是一个非常普通的ROM。取指令的主动权掌握在ARM核中。如果它要处理非常复杂的指令,一个周期根本处理不过来,那怎么办?那就不启动rom_en,只有当处理完了,有空闲了再启动rom_en,更新rom_data。

               ram_cen,
               ram_wen,
               ram_addr,
               ram_wdata,
               ram_rdata,
               ram_flag
              );
  前五个“ram_cen,ram_wen,ram_addr,ram_wdata,ram_rdata”是典型的单端口RAM的接口。功能是:在ram_cen==1'b1时,开始执行对RAM的操作,同时ram_wen==1'b1,执行写操作,把ram_wdata写入ram_addr对应的位置;如果ram_wen==1'b0,表示是读操作,就得在下一个时钟,把放在ram_addr的数据出现在ram_rdata。
  ram_flag是我新增加的。因为RAM里面出现了LDRB, STRH这样对字节、字的操作。为了操作简单,我给每一个字节对应了一个标志位:如果ram_flag[0]==1'b1表示第一个字节的操作有效;如果ram_flag[0]==1'b1,则读写操作对第一个字节无效。比如我执行STRB 0x4000_0000,则ram_flag==4'b0001, 表示只对地址0x4000_0000的低8bit进行写入。如果STRH 0x4000_0002,则ram_flag==4'b1100, 表示写入0x4000_0000的高 2 byte。
   所以我建议连上4块RAM,每块RAM的位宽都是8 bit。让ARM核对每byte的操作是独立的。那每一块的cen就是:ram_cen&ram_flag[3]; ram_cen&ram_flag[2]; ram_cen&ram_flag[1]; ram_cen&ram_flag[0]。

   好了,接下来,就是他们位宽的定义:
    input              clk;
    input              rst;
    input              cpu_en;

    input              cpu_restart;
    input              irq;
    input              fiq;
    input              rom_abort;
    input              ram_abort;

    output             rom_en;
    output    [31:0]   rom_addr;
    input     [31:0]   rom_data;

    output             ram_cen;
    output             ram_wen;
    output    [31:0]   ram_addr;
    output    [31:0]   ram_wdata;
    input     [31:0]   ram_rdata;
    output    [31:0]   ram_flag;

  好了,本篇到此结束,下一节再见!

关键字:ARM处理器  module 引用地址:跟我写ARM处理器之一:从写module arm开始

上一篇:跟我写ARM处理器之二:主体结构的确定
下一篇:u-boot在s3c2410开发板上移植过程

推荐阅读最新更新时间:2024-03-16 15:00

凌力尔特公司推出双输出25A或单输出50A µModule® 稳压器
加利福尼亚州米尔皮塔斯 (MILPITAS, CA) 2016 年 9 月 8 日 凌力尔特公司 (Linear Technology Corporation) 推出双输出 25A 或单输出 50A Module (微型模块) 稳压器 LTM4650-1A 和 LTM4650-1B,这两款器件可扩展,以向大功率、低压、28nm 以下的 GPU、FPGA、ASIC 和微处理器提供 300A 电流。这些数字器件具较低内核电压,在稳定状态 (DC) 和快速负载电流瞬态时,均需要非常准确的电压调节。LTM4650-1A在整个基准、电压、负载和温度 ( 40 C 至 125 C) 范围内保证具有 0.8% 的总 DC 电压准确度,而 LT
[电源管理]
凌力尔特公司推出双输出25A或单输出50A µ<font color='red'>Module</font>® 稳压器
解答arm处理器的七种工作模式
ARM处理器存在七种工作模式:用户模式、快速中断模式、外部中断模式、管理模式、数据访问中止模式、未定义指令中止模式、系统模式。除了用户模式外,其它六种均为特权模式。处理器模式可以通过控制进行切换,也可以通过外部中断或异常处理过程进行切换。大多数的用户程序运行在用户模式下,这时,应用程序不能访问一些受操作系统保护的系统,应用程序也不能直接进行处理器模式切换。当需要进行处理器模式切换时,应用程序可以产生异常处理,在异常处理中进行处理器模式的切换。 用户模式(usr):属于正常的用户模式,ARM处理器正常的程序执行状态。 快速中断模式(fiq):用于处理快速中断,对高速数据传输或通道处理。 外部中断模式(irq):对一般情
[单片机]
解答<font color='red'>arm处理器</font>的七种工作模式
二代百元笔记本将用ARM处理器配备双触摸屏
据国外媒体报道,“百元笔记本”电脑基金会OLPC日前表示,为提升电池续航时间,下一代产品XO-2很可能改用ARM处理器。   OLPC董事长尼古拉斯·尼葛洛庞帝(Nicholas Negroponte),下一代百元笔记本XO-2基本上已确定采用ARM处理器。当前,一代百元笔记本XO-1采用的是AMD早期的Geode处理器。   对此,OLPC首席技术官爱德·麦克尼利(Ed McNierney)表示:“XO-1的功耗只有5W,很多人认为这已经很低了,但我们认为还是有些高。”   麦克尼利还称,ARM处理器不仅能满足用户的基本需求,还能降低功耗。改用ARM处理器后,所面临的最大问题是操作系统问题。   OLPC表示,届时
[手机便携]
ARM处理器架构处理器的工作状态
之前,一直都在看arm的驱动开发,最近看了ucos,同时也开始对arm的架构有了更深入一点的了解。大学学微机原理的时候学的是x86的架构,它和arm还是有挺多区别的。下面就整理一些自己的所学和在网上转载的关于arm架构的内容。有一本很好的讲arm架构的书:《ARM System Developer's Guide》。 从编程人员的视角来看,arm核是由数据总线连接的功能单元组成,如下图所示: 数据通过数据总线流向处理器核心,这里的数据可以是将要执行的指令,也可以是数据项.上面的图是Von Neumann体系的arm核,数据项和指令共用同一总线.而哈佛结构体系的arm核就会用两个不同的总线.
[单片机]
<font color='red'>ARM处理器</font>架构处理器的工作状态
基于ARM处理器与GPRS技术的水厂监控系统
目前远程监控主要有以下方式: 短距离长线监控、通过市话网、通过Internet 网络、通过自组网络(CDPD网)及通过数传电台监控。 短距离长线监控和通过自组网络自行建设通信网络, 信号质量得以保证, 但建网初期投资巨大, 运营期间维护耗费较高; 通过市话网和Internet 方式, 通信效果好, 信号量大, 运营费用相对低廉, 但接入网络受到限制, 且网络运行效果取决于网络运营商, 难以达到工业现场覆盖面; 数传电台出现较早、应用广泛, 信号传输实时性好、运行费用低, 但建网初期投资巨大、传输范围有限, 易受空间无线信号干扰。 通用分组无线业务GPRS(General Packet Radio Ser -vice) 是在现有GSM
[单片机]
基于<font color='red'>ARM处理器</font>与GPRS技术的水厂监控系统
ARM嵌入式系统开发:软件设计与优化--第二章ARM处理器基础
1、寄存器: 总共有37个寄存器,最多可以有17个活动寄存器(16个数据寄存器,2个状态寄存器:CPSR和SPSR) R13:堆栈指针:指向当前处理器模式的堆栈栈顶 R14:链接寄存器,保存子程序的返回地址。【当执行子程序调用指令(BL)时,R14可得到R15(程序计数器PC)的备份】 R15:程序技术器,处理器下一条要取出的指令地址。【ARM状态下,指令4字节对齐,位 为0。位 保存PC】 【注】快速中断的r8-r12是分组寄存器,r13-r14每种模式都有自己的分组寄存器。r15没有分组寄存器。用户模式和系统模式没有分组寄存器。 2、当前程序状态寄存器CPSR: 3、处理器模式: 除了用户模式外,每一种
[单片机]
ARM嵌入式系统开发:软件设计与优化--第二章<font color='red'>ARM处理器</font>基础
三星ARM处理器S3C4510B的HDLC通道使用和编程
简介:本文介绍MPC8250的结构与特点,并与 MPC860的特点进行对比,在此基础之上分析MPC8250应用于宽带接入产品的优势所在。最后提出一种充分利用MPC8250优点的接入路由器硬件设计方案。 1:S3C4510B简介 S3C4510B(以下简称4510)是韩国三星公司开发的一款基于ARM7TDMI架构的16/32位高性能微处理器。具用丰富的外围接口,如以太网,HDLC等,可灵活配置,适用于多种应用。4510具有以下性能特点: ◆ 8K字节的内部CACHE,也可用作内部SRAM ◆ 两线IIC接口,作为IIC主器件使用 ◆ 以太网控制器 ◆ 双通道HDLC控制器 ◆ 双UART ◆ 双GDMA通道 ◆ 两个32位定时器
[单片机]
ARM处理器出货量超过100亿个
  ARM宣布由其合作伙伴所出货的处理器总量已超过100亿个。ARM公司于1991年开发出其第一个嵌入式RISC内核——ARM6™处理器;如今,ARM公司的半导体合作伙伴所生产的基于ARM技术的处理器每年的出货量已近30亿个。   “ARM的合作伙伴截止目前的累计出货量,足以使地球上每一个人拥有一个以上的基于ARM技术的处理器。”ARM公司首席执行官Warren East表示。“共计100亿个基于ARM技术的处理器已投入使用,这是ARM发展历程中的一个重大里程碑,同时也体现了ARM®处理器架构被全球主要电子公司中的绝大部分所采用,并且用于最广泛的应用领域这一增长趋势。”   ARM处理器产品线覆盖了微处理器应用的每一个领域,从
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved