首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

FreeARM7 IP核的微处理器逻辑扩展与验证

FreeARM7 IP核的微处理器逻辑扩展与验证

1  FreeARM7 IP核简介

    FreeARM微处理器的ARM7系列(简称FreeARM7)首发于www.socvista.com,由Freearm联合其他ARM爱好者基于ARMv4架构开发而成。整个IP核代码采用可综合的Verilog HDL描述,接口简单,描述精炼,全部代码不超过2000行。在整体设计上,采用了三级流水线和哈佛结构,全面兼容各种中断和操作指令(除Thumb和协处理器指令)。经过评估可知,该IP核基于FPGA和SMIC工艺库都有很好的实现结果。

    FreeARM7接口定义如表1所列,概括起来可分为4类:

    ◆ 系统接口,提供系统控制信号;
    ◆ 中断源,提供ARM架构需要的5个中断信号;
    ◆ ROM接口,与提供指令的ROM之间的接口;
    ◆ 单口RAM接口,与单口RAM和外设之间数据交互的接口。

    其中,单口RAM接口可以实现两类用途:一、 挂接单口RAM,使得FreeARM7能够正确地读写数据;二、 挂接外设,使得FreeARM7能够正确操作外设。

表1  FreeARM7接口定义


2  微处理器改进与逻辑扩展

    基于FreeARM7的微处理器改进与逻辑扩展的结构如图1所示。预期的实现目标是:在主机上编写嵌入式程序汇编成机器码后,经过USB1.1设备控制器传输至双端口RAM中,在微处理器代码下载模式下,代码下载控制逻辑将双端口RAM中的机器代码装载至ROM中,之后启动微处理器正常工作模式,微处理器执行ROM中的嵌入式代码,接收主机通过USB传送来的参数值,并将运行结果通过USB返回至主机。

图1  微处理器改进与逻辑扩展

    基于Cyclone II FPGA具体实现时,ROM、 RAM和双端口RAM都是利用Quartus II软件中MegaWizard PlugIn Manager工具[2]例化相应的存储模块,而其他硬件逻辑的扩展都是以IP核(Verilog描述)的形式出现。

2.1  微处理器IP核改进

    FreeARM7 IP核是微处理器的核心部分,不能直接作为微处理器使用,其原因是数据总线需要读取ROM内的数据、本文选择Philips公司32位ARM7微处理器LPC2101作为原型设计。LPC2101带有适当的存储资源,内嵌2 KB片内静态RAM和8 KB的Flash存储器,且软件可移植性好,工作可靠。参考LPC2101工作原理,当FreeARM7的输出信号ram_addr的最高4位为4'b0时,表示数据总线需要读取ROM的数据。为解决该问题,新增一个wrap文件lpc2101_arm.v完成该功能。它的作用是:当ram_addr[31:28]==4'b0时,该逻辑直接从rom_en、rom_addr、rom_data的接口中读取ROM数据,送入ram_rdata。

图2  USB设备控制器IP核结构

2.2  USB1.1设备控制器

    本文选用的USB设备控制器是课题组早期项目之一,它是由Opencores网站[3]提供的初级开源版本改进而成,其结构如图2所示。IP核支持低速和全速模式,共有1个控制传输端点(EP0)、7个其他可配置端点,且缺少微处理器也能响应主机对设备的枚举。收发器电路主要完成模/数信号转换,即在OUT事物中将模拟信号D+和D-转换成串行接口引擎模块可识别的数字信号rxd、rxdp和rxdn,在IN事物中将数字信号txdp和txdn在使能信号txoe的控制下转换成模拟信号D+和D-;串行接口引擎模块主要完成收发包,根据传输方向可分为接收和发送,主要包括总线检测、同步检测、时钟恢复、不归零反向编码和解码、位填充及位去除、数据的串/并转换;协议层包括协议引擎态机、组包、解包、FIFO控制器;端点0控制器主要负责响应主机标准请求;描述符RAM存储了设备的各种描述符;其他端点控制器及FIFO提供了配置接口,目的是预留给开发者进行IP核移植。

2.3  代码下载控制逻辑

    该逻辑主要功能是在代码下载模式下,将双端口RAM中的汇编程序转移到ROM中,其主要任务是产生读双端口RAM使能信号和地址信号,以及写ROM的使能信号和地址信号。在硬件逻辑中通过计数器实现。当系统复位或退出代码下载模式时,计数器rom_wr_cnt清零,否则当USB接收完一个包(64字节)后,置计数器使能信号cnt_vld有效,rom_wr_cnt开始计数。cnt_vld直接作为读双端口RAM的使能信号,cnt_vld两级缓存后作为写ROM的使能信号。同时,rom_wr_cnt的低8位直接作为读双端口RAM的地址信号,rom_wr_cnt计算结果经过两级缓存后作为写ROM的地址信号。当64字节转移完毕后,置cnt_vld无效,此时rom_wr_cnt锁存当前值,等待下一个包接收完毕后再次置cnt_vld有效,代码下载控制逻辑就将下一个包的数据追加到ROM中,反复进行就完成了代码经由USB接口下载至ROM中。

3  嵌入式代码的开发

3.1  μVision3.63环境设置

    利用μVision3.63新建一个工程,选择器件类型为NXP(founded by Philips)系列的LPC2101,在默认工程环境的基础上做如下确认:

    ①  在“output”选项卡中选中“Create HEX File”,确保产生可供下载的机器码。
    ②  在“Target”选项卡中选择Code Generation为“ARMMode”,确保以ARM指令集为依据产生机器码。
    ③ 在“C/C++”和“Asm”选项卡中分别去选“Enable ARM/Thumb Interworking”,确保生成的代码只包含ARM指令。

3.2  Bootloader的设置

    Bootloader启动一般分为两个阶段。第一阶段主要包含依赖于微处理器的体系结构硬件初始化的代码,设置堆栈并跳转到第二阶段的C程序入口点,通常采用汇编语言来实现。第二阶段通常用C语言完成[4],以便实现更复杂的功能,也使程序有更好的可读性和可移植性。在μVision3.63软件自带的示例工程“Hello”中,通过下面3行代码实现了两个阶段的工作交接:

IMPORT__main
LDRR0, =__main
BXR0

    由于本文讨论的微处理器只是在FreeARM7基础之上做了一些基本的扩展,微处理器的体系结构硬件单一,因此第一阶段主要是对堆栈位置和大小进行设置。对USB接口的初始化在第二阶段的C程序中进行,初始化程序如下:

#define USB_FLAG *(volatile unsigned char *) 0xe0000000
#define USB_CUR_ADDR *(volatile unsigned long *) 0xe0000004
#define USB_CUR_DATA *(volatile unsigned long *) 0xe0000008
void UsbSend (char *send){//写双端口RAM
  int i;
  USB_CUR_ADDR = 0;
for(i=0; i<64; i++){
  USB_CUR_DATA = send;
  USB_FLAG |= 0x01; //写使能有效
  USB_CUR_ADDR++;
}
while(USB_FLAG & 0x03)
  USB_FLAG &= 0xfa;//标志位、写使能清零
}
void UsbReceive (char *receive){//读双端口RAM
  int i=0;
  USB_CUR_ADDR = 0;
  while (USB_FLAG & 0x02);{
    receive[i++] = USB_CUR_DATA;
    USB_CUR_ADDR++;
    if(i==64) break;
}
  USB_FLAG &=0xfd; //标志位清零
}
int main(){//主函数入口
……
  USB_FLAG=0;
  USB_CUR_ADDR=0;
  USB_CUR_DATA=0;
  ……
}

4  微处理器的功能验证

    在完成前面的工作之后,借助FPGA对微处理器进行了功能验证。选用Altera公司DE2开发板作为硬件逻辑的实现载体,微处理器IP核工作时钟为开发板上27 MHz晶振输入,USB控制器IP核工作时钟为27 MHz晶振倍频至48 MHz。功能验证流程如图3所示,在主机上利用μVision3.63编写、编译验证程序后,微处理器进入下载模式接收主机对设备的代码下载,之后进入用户模式接收主机端传送的验证程序参数值,在运行代码后将执行结果返回至主机,通过与主机软件模拟结果比较达到验证微处理器运行结果的目的。

图3  功能验证流程

4.1  验证程序开发

    数据加密标准(DES)是著名的对称密钥分组密码,它由美国标准FIPS 462定义[5]。基于ARM7指令系统,DES的C语言实现难度不大,但它是对IP核工作能力的一次综合检验。将DES算法分解为密钥生成算法和加解密算法,对应验证程序中两个子函数,其最终的代码实现框架如下:

void DES_key(void *kval, void *key){
  ……
}
void DES(const void *i_blk, void *o_blk, void *key, char ed){
  ……
}
int main{
  ……
  unsigned long kval[2]; //初始密钥
  unsigned long in[2]; //明文
  unsigned long out[2]; //密文
  unsigned long key[32];//工作密钥
  unsigned char temp[64];//USB收发临时变量
  UsbReceive(temp);//接收明文和密钥
  ……//由temp向kval和in赋值
  DES_key(kval, key); //初始密钥生成工作密钥
  DES(in, out, key, e); //DES加密
  ……//由out向temp赋值
  UsbSend(temp);//发送加密结果至主机
  DES(out, in, key, d); //DES解密
  ……//由in向temp赋值
  UsbSend(temp);//发送解密结果至主机
  ……
}

4.2  主机驱动与通信软件开发

    Windows驱动程序模型(Windows Driver Model, WDM)旨在提供一种灵活的方式来简化各种驱动程序的开发,实现对新硬件的支持,降低驱动程序开发的复杂度。基于WDM采用Driver Studio开发USB驱动程序,会自动生成一个驱动程序框架,在此基础上添加读写管道即可完成驱动程序的开发[6]。

    USB通信软件采用MFC编写,主要功能有:将.hex文件以十六进制的形式发送至USB;接收USB返回的数据,并以十六进制的形式显示。采用DES程序标准测试向量,其中初始密钥K=1A624C89520DEC46,明文P=748502CD38451097,密文C=DD0CFEB783CF3FDE,在通信软件中代码下载及验证数据的收发如图4所示。按照上述原理,还编写了其他若干验证程序并下载至ROM中,微控制器的执行结果均正确。

图4  代码下载及验证数据的收发

深圳潮光光耦網——光耦(隔離器)應用服務商
原裝、正品、現貨
潮光光耦网-全球光耦资源整合者
返回列表