首页 > 其他 > 详细

OC8051内部逻辑分析(1)

时间:2014-09-18 22:03:54      阅读:278      评论:0      收藏:0      [点我收藏+]

  采用数据流的方式进行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 = 1b0;
 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 1b1;
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 31h0;
32     ack_o <= #1 1b0;
33   end else if (stb_i && ((DELAY==3b000) || (cnt==3b000))) begin
34     data <= #1 {buff[addr+3], buff[addr+2], buff[addr+1], buff [addr]};
35     ack_o <= #1 1b1;
36   end else
37     ack_o <= #1 1b0;
38 end
39 
40 always @(posedge clk or posedge rst)
41 begin
42   if (rst)
43     cnt <= #1 DELAY;
44   else if (cnt == 3b000)
45     cnt <= #1 DELAY;
46   else if (stb_i)
47     cnt <= #1 cnt - 3b001;
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时,程序才能正常运行,其他设置均会出错。

OC8051内部逻辑分析(1)

原文:http://www.cnblogs.com/lkiller/p/3980099.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!