微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 跟我写ARM处理器之一:从写module arm开始

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

时间:11-10 来源:互联网 点击:

module arm ( 。这恐怕是verilog设计的经典开篇了。然后是什么?是定义接口。接口其实规定了大部分的功能,对于IP核的重用,交代清楚接口,跟下家说明清楚,别人才好用核。

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

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

rom_en,
rom_addr,
rom_data,
这三个信号连接到ROM中,是指令的来源。取指令的方法是:rom_en==1b1时,在下一个时钟,存放在rom_addr位置的code就出现在rom_data了。当然如果rom_en==1b0,则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==1b1时,开始执行对RAM的操作,同时ram_wen==1b1,执行写操作,把ram_wdata写入ram_addr对应的位置;如果ram_wen==1b0,表示是读操作,就得在下一个时钟,把放在ram_addr的数据出现在ram_rdata。
ram_flag是我新增加的。因为RAM里面出现了LDRB, STRH这样对字节、字的操作。为了操作简单,我给每一个字节对应了一个标志位:如果ram_flag[0]==1b1表示第一个字节的操作有效;如果ram_flag[0]==1b1,则读写操作对第一个字节无效。比如我执行STRB 0x4000_0000,则ram_flag==4b0001, 表示只对地址0x4000_0000的低8bit进行写入。如果STRH 0x4000_0002,则ram_flag==4b1100, 表示写入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;

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top