zoukankan      html  css  js  c++  java
  • 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时,程序才能正常运行,其他设置均会出错。

  • 相关阅读:
    Vim插件列表
    比nerdtree更好的文件浏览器:vimfiler
    在不同的窗口之间跳转
    unite
    ARMv7 .n和.w指令宽度指示符后缀
    Mybatis之分表设计与分表插入
    thymeleaf之菜单树
    管理后台菜单查询
    Linux下Tomcat重新启动
    网页缓存清除
  • 原文地址:https://www.cnblogs.com/lkiller/p/3980099.html
Copyright © 2011-2022 走看看