OC8051内部逻辑分析(1)

  采用数据流的方式进行OC8051内部的逻辑分析,需要首先理解其存储器架构,然后追踪程序到再到数据流。

  前面有提到过,OC8051程序和数据存储器逻辑分离,在物理上,其可能有4种存储器,分别为内部程序存储器irom,内部数据存储器iram,外部程序存储器器xrom,外部数据程序存储器xram,其中访问xram和访问iram的指令不同(mov、movx,并要通过DPTR寄存器)。OC8051使用oc8051_defines.v控制所采用的存储结构,oc8051_defines.v部分代码如下:

  

 1 //
 2 // oc8051 ITERNAL ROM
 3 //
 4 `define OC8051_ROM
 5
 6
 7 //
 8 // oc8051 memory
 9 //
10 //`define OC8051_CACHE
11 //`define OC8051_WB
12
13 //`define OC8051_RAM_XILINX
14 //`define OC8051_RAM_VIRTUALSILICON
15 `define OC8051_RAM_GENERIC
16
17
18 `define OC8051_XILINX_ROM

  `define OC8051_ROM:使用内部iROM,而外部xROM ,OC8051提供了3种可选的接口,1、CACHE;2、WISHBONE;3、内部信号线直通。

  irom和iram是属于8051的部分,xrom,xram则可以没有,在实际的实现上,irom和xrom只要有一个就行。OC8051提供了irom的一个FPGA(XILINX)实现和一个行为仿真模型,均在文件oc8051_rom.v里,通过`define OC8051_XILINX_ROM,使用XILINX的实现,否则使用的是通用的仿真模型。另外OC8051工程提供了一个工具可以将HEX文件转换为.v,这种转换的实现和`define OC8051_XILINX_ROM所选用的实现是一样的,其更新ROM中代码非常不方便;这和其采用的ROM模型有关,通过如下代码可以看出其采用的存储器模型:

 1 reg [7:0] buff [0:65535]; //64kb
 2
 3 assign ea = 1‘b0;
 4
 5 initial
 6 begin
 7   $readmemh("../../../bench/in/oc8051_rom.in", buff);
 8 end
 9
10 always @(posedge clk or posedge rst)
11  if (rst)
12    ea_int <= #1 1‘b1;
13   else ea_int <= #1 !ea;
14
15 always @(posedge clk)
16 begin
17   data_o <= #1 {buff[addr+3], buff[addr+2], buff[addr+1], buff[addr]};
18 end

  这样的存储模型很难直接使用通用的存储器进行实现。因为8051为8位微处理器,一般而言,程序存储器位宽为8即可,然而OC8051的实现使用了预取指令,需要一次发射3条指令(具体可通过其内部代码得到证实。);上述代码所示模型,需要存储器一个周期发射4Byte的程序,而由于8051送出来的地址是非字对齐的,因此这样的行为模型需要存储器支持非对其访问。如:addr=1;则data_o={buff[4],buff[3],buff[2],buff[1]},而如果采用32位宽的存储器,0~3个字节是一组,4~7为一组,一次只能出来一组的32位数据。

  外部程序存储器接口可以选择CACHE方式和WB方式和直通方式,由于内部cpu实现方式,其行为模型依然需要和内部程序存储器一样。oc8051_xrom.v代码如下:

 1 module oc8051_xrom (rst, clk, addr, data, stb_i, cyc_i, ack_o);
 2
 3 parameter DELAY=5;
 4
 5
 6 input rst, clk, stb_i, cyc_i;
 7 input [15:0] addr;
 8 output ack_o;
 9 output [31:0] data;
10
11
12 reg ack_o;
13 reg [31:0] data;
14
15 reg [7:0] buff [0:65535];
16 //reg [7:0] buff [8388607:0];
17 reg [2:0] cnt;
18 integer i;
19
20
21 initial
22 begin
23 //  for (i=0; i<65536; i=i+1)
24 //    buff [i] = 8‘h00;
25   $readmemh("../../../bench/in/oc8051_xrom.in", buff);
26 end
27
28 always @(posedge clk or posedge rst)
29 begin
30   if (rst) begin
31     data <= #1 31‘h0;
32     ack_o <= #1 1‘b0;
33   end else if (stb_i && ((DELAY==3‘b000) || (cnt==3‘b000))) begin
34     data <= #1 {buff[addr+3], buff[addr+2], buff[addr+1], buff [addr]};
35     ack_o <= #1 1‘b1;
36   end else
37     ack_o <= #1 1‘b0;
38 end
39
40 always @(posedge clk or posedge rst)
41 begin
42   if (rst)
43     cnt <= #1 DELAY;
44   else if (cnt == 3‘b000)
45     cnt <= #1 DELAY;
46   else if (stb_i)
47     cnt <= #1 cnt - 3‘b001;
48   else cnt <= #1 DELAY;
49 end
50
51 endmodule

  可以看出基本和irom行为模型一样,只不过支持参数定义其延迟周期(一般外部存储器访问速度会要慢些。)

  ps:今天在仿真过程发现,使用外部xrom(tb中读入得ea=0:使用xrom,ea=1:使用irom),接口配置为WB接口(`define OC8051_WB),其延迟参数只有定义为DELAY=2时,程序才能正常运行,其他设置均会出错。

时间: 2024-08-05 23:12:20

OC8051内部逻辑分析(1)的相关文章

使用Chipscope时如何防止reg_wire型信号被优化掉

随着FPGA设计复杂程度越来越高,芯片内部逻辑分析功能显得越来越重要.硬件层次上的逻辑分析仪价格十分昂贵,而且操作比较复杂.目前,FPGA芯片的两大供应商都为自己的FPGA芯片提供了软件层面上的逻辑分析仪,可以帮助我们在线分析芯片内部逻辑.而且操作简单方便.但是往往因为某些原因,有些信号在综合的时候就会被优化掉,就可能会导致我们的设计失败,当然在为逻辑分析仪添加观察信号的时候也无法找到该信号.从而对设计.调试人员的工作带来一定的不便.下面就分别以Xilinx公司的逻辑分析仪ChipScope和A

OC8051软件编程说明

1.复位 复位通过复位引脚RST输入,复位必须达到两个周期的高电平才能将系统复位.复位后,PC指针为0000H,因此0000H即为复位向量入口,复位后从此处开始运行程序.复位后P口(P0,P1,P2,P3)被设置为FFH,堆栈指针值为07H,其他特殊功能寄存器的初值均为00H,内部RAM的值不受复位影响,复位后,其值不确定. 2.寄存器列表 图1为OC8051的寄存器列表: 图1 OC8051寄存器列表 下面依次说明几个特殊功能寄存器功能. PSW(程序状态字) CY PSW.7 : 进位标志

make the OC8051 run

好吧,我使用了一个洋气的标题,anyway,this's my begin of the oc8051.so,管它中文还是英文,我要开写了. 作为开头,很多细节我就先略过了,主要简单的介绍几个步骤to make the OC8051 run. 1.获取OC8051源代码.(opencore或某电子类论坛下载). 2.修改oc8051_defines.v.此文件可让用户对硬件进行裁剪和配置. 修改如下(部分): 1 // 2 // oc8051 pherypherals 3 // 4 `defin

SQL Server子查询填充DataSet时报500内部错误的解决办法

运行环境为Visual Studio 2010,数据库为SQL Server 2008. 执行下面SQL语句 SELECT SubsiteId, SubsiteTitle, count(CollectionID) CollectionNumber,count(LName) PlantNumber FROM (SELECT DISTINCT SubsiteId, SubsiteTitle, CollectionID, LName, CName FROM Cumplag_Garden_Plants

如何在linux Shell脚本里面把一个数组传递到awk内部进行处理

前段时间和几位同事讨论过一个问题:Shell脚本里面怎样把一个数组传递到awk内部进行处理? 当时没有找到方法.前两天在QQ群里讨论awk的时候,无意间又聊起这个话题.机缘巧合之下找到一个思路,特此分享. 测试环境: [root]# head -1 /etc/redhat-release Red Hat Enterprise Linux Server release 6.5 (Santiago) [root]# awk --version | head -1 GNU Awk 3.1.7 众所周知

汇友建工相互保险社筹建(三)——制度之内部管理制度

汇友建工相互保险社筹建(三)——内部管理制度 麻雀虽小,五脏俱全!一个作为公司的运营,无论是所谓的相互保险社还是股份制保险公司,该有的关于保险公司的各个部门的设置,依然是没有任何的变化,作为一个从股份制保险公司出来的人们,还是会受到股份制保险公司的影响,在筹建一个新公司的时候,不由自主的受到原公司的影响. 汇友建工相互保险社在筹建的过程中也走了这样一条路,依据主要的部门设置,就有了相对应的关于各部门的制度,故而对于内部的管理制度,如果梳理起来基本上就已经达到了几十个制度(这么多的制度,会不会一开

如何解决C#编译中&quot;csc不是内部或外部命令&quot;的问题

安装完 VisualStudio 2010编译环境后,是不能用命令行直接编译写好的csc文件的,如果不配置环境变量,在命令提示符(cmd)中编译扩展名为cs的文件,会出现错误提示“csc不是内部或外部命令,也不是可运行的程序,或批处理文件”.这时只需配置好环境变量,就可以成功执行csc命令编译C#源码了. 解决方案: 使用记事本编写一个C#程序,保存后将扩展名改为cs,存储在D盘中.这个文件会成为本例中的一个样本.代码大意为向命令行中写下“i love u”. 找到NET Framework的安

js 自执行函数 函数内部可以通过函数名调用本身 函数外部调用报 未定义错误

先看错误过程 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>ipt-test</title> </head> <body> <script> var a=true; !function main(){   if(a){     a=false;     main();   }   console.log('

windows下scrapy框架学习笔记—&#39;scrapy&#39; 不是内部或外部命令

最近几天在深入的学习scrapy框架,但是装完各种需要的基础包之后却发现scrapy命令在别的路径下都用不了,我一开始是把python安装在F:\Python路径下的,安装了scrapy后它默认都会安装在这个路径下,scrapy在路径F:\Python\Scripts路径下,我的scrapy命令只能在此路径下用,因此创建什么工程也都只能在此文件下. 想了一下它的工作原理:它在F:\Python\Scripts路径下,就会在Scripts文件下存在一个scrapy批处理文件,那么在DOS下想要命令