以下Verilog HDL代码符合wishbone总线B3标准协议,在Altera和Xilinx的开发工具上可以实现综合,自动推断并采用片上RAM资源,可以完成内存内容的初始化。

 /*
 ************************************************************************************************
 *    File   : ram_wb.v
 *    Module : ram_wb
 *    Author : Lyu Yang
 *    Date   : 01,01,1970
 *    Description : wishbone generic ram
 ************************************************************************************************
 */

 // synthesis translate_off
 `timescale 1ns / 1ps
 // synthesis translate_on
 `timescale 1ns / 100ps
 module ram_wb (
     clk_i,
     rst_i,
     cyc_i,
     stb_i,
     we_i,
     sel_i,
     adr_i,
     dat_i,
     dat_o,
     cti_i,
     ack_o
 );

 ;
 ;

 // clock
 input                   clk_i;
 // async reset
 input                   rst_i;

 // wishbone signals
 input                   cyc_i;
 input                   stb_i;
 input                   we_i;
 :]           sel_i;
 :] adr_i;
 :]          dat_i;
 :]          dat_o;
 :]           cti_i;
 output  reg             ack_o;

 :]          wr_data;

 // mux for data to ram
 :] = sel_i[] ? dat_i[:] : dat_o[:];
 :] = sel_i[] ? dat_i[:] : dat_o[:];
 : ] = sel_i[] ? dat_i[: ] : dat_o[: ];
 : ] = sel_i[] ? dat_i[ : ] : dat_o[ : ];

 ram #(
     .dat_width(),
     .adr_width(adr_width),
     .mem_size(mem_size)
 ) ram0 (
     .dat_i(wr_data),
     .dat_o(dat_o),
     .adr_i(adr_i[adr_width+:]),
     .we_i(we_i & ack_o),
     .clk(clk_i)
 );

 // ack_o
 always @ (posedge clk_i or posedge rst_i)
 if (rst_i)
     ack_o <= 'b0;
 else if (!ack_o)
     begin
         if (cyc_i & stb_i)
             ack_o <= 'b1;
     end
 'b111))
     ack_o <= 'b0;

 endmodule

 //////////////////////////////////////////////////////////////////////////
 module ram
 (
     clk,
     we_i,
     adr_i,
     dat_i,
     dat_o
 );

 ;
 ;
 ;

 :]      dat_i;
 :]      adr_i;
 input                        we_i;
 :] dat_o;
 input                      clk;   

 :] ram [:mem_size - ];

 initial $readmemh("data.txt", ram);

 always @ (posedge clk)
 begin
     dat_o <= ram[adr_i];
     if (we_i)
         ram[adr_i] <= dat_i;
 end 

 endmodule // ram
      

  使用Verilog中的$readmemh(filepath, data)或者$readmemb(filepath, data)功能,不仅在仿真中可以实现内存内容的初始化,现在的综合工具可以分析并得出适合各家工具的初始化文件并完成综合。

  另外,data.txt中数据内容的描述格式为:@十六进制地址[空白间隔 Tab Space \n]十六进制数据。例如,笔者在写Nios II处理器bootloader时候,片上存储bootloader程序的初始化文件部分为:

@00000000
00808014
@00000001
1001483a
@00000002
10bff804
@00000003
00bffd16
@00000004
00400034kljdaklj

  需要注意的是,地址可以不写,如果不写的话工具读取的时候认为地址从0开始连续分布。如果内容少于所需,那么剩余部分填充内容不确定(一般为0)。

Wishbone B3总线Generic RAM写法的更多相关文章

  1. OR1200处理器中Wishbone总线接口模块WB_BIU介绍

    下面内容摘自<步步惊芯--软核处理器内部设计分析>一书 WB_BIU模块是OR1200处理器与外部Wishbone总线连接的接口模块.15.1节给出了WB_BIU模块的对外连接关系,并指出 ...

  2. Wishbone接口通用RAM

    /* ************************************************************************************************ ...

  3. 自己动手写事件总线(EventBus)

    本文由云+社区发表 事件总线核心逻辑的实现. EventBus的作用 Android中存在各种通信场景,如Activity之间的跳转,Activity与Fragment以及其他组件之间的交互,以及在某 ...

  4. RAM建模和初始化

    冯诺依曼提出的存储计算,计算存储,因此,几乎所有的CPU和ASIC都会使用存储器,它们的类型很多,包括异步RAM.同步RAM.ZBT RAM.DDR DRAM.ROM等.由于大部分的异步RAM和SRA ...

  5. OpenRisc-44-or1200的pipeline整体分析

    引言 我们在前面分析了ORPSoC,or1200_top,和or1200_cpu的整体架构,在最近,我们也分析了or1200的pipeline(流水线)中的两级,EX级和IF级. 但是,我们还没有从宏 ...

  6. 《Linux 性能及调优指南》1.4 硬盘I/O子系统

    翻译:飞哥 (http://hi.baidu.com/imlidapeng) 版权所有,尊重他人劳动成果,转载时请注明作者和原始出处及本声明. 原文名称:<Linux Performance a ...

  7. OpenRisc-47-or1200的WB模块分析

    引言 “善妖善老,善始善终”,说的是无论什么事情要从有头有尾,别三分钟热度. 对于or1200的流水线来说,MA阶段是最后一个阶段,也是整条流水线的收尾阶段,负责战场的清扫工作.比如,把运算指令的运算 ...

  8. python 读取csv文件

    python中有一个读写csv文件的包,直接import csv即可 新建test.csv 1.写 import csv with open("test.csv","w& ...

  9. JIRA中的标记语言的语法参考

    前言 看到网上有的文章说JIRA是使用Textile这门标记语言,有些语法和Wikitext和Markdown相像.JIRA在2017年进行了一次大更新,某些语法可能和以前不大一样,这里纪录一下常用的 ...

随机推荐

  1. linux删除乱码文件[转载]

    一些乱码文件不可以通过普通的rm命令进行管理.可以通过删除i节点的方式删除. [root@192_168_100_35 musicwap]# ls??,?K?k?ͨa*.?J]?k?Φ??P???Z? ...

  2. [PAT] 1141 PAT Ranking of Institutions(25 分)

    After each PAT, the PAT Center will announce the ranking of institutions based on their students' pe ...

  3. 爬虫基础库之requests

    requests Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但是,它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作, ...

  4. C语言实现二叉排序树

    程序以'#'结尾的二叉排序树. /*(双重指针 BSTree *T)问:数据结构中 二叉树建立结点为什么用 双重指针?详细解释下双重指针 答:指针的指针.因为树的结点要用指针描述.如果只用指针,作形参 ...

  5. Delphi获取毫秒级时间戳

    function GetJavaTime( d: TDateTime ): Int64; var dJavaStart: TDateTime; begin //java里的时间是从1970年1月1日0 ...

  6. ejs模板在express里的默认文件夹路径修改

    默认的是这句: app.set('view engine','ejs') ===>/views文件夹 我想要变成/websong app.set('views','webosg'); app.s ...

  7. 阿里云轻量级学生机搭建FTP最新教程

    碰了几次壁,我整理一下分析自己在阿里云上成功安装FTP的教程. 1.使用root用户进入云服务器. 2.rpm  -qa|grep vsftpd 查看是否安装了ftp,一般阿里云服务器你以前没安装过, ...

  8. Bzoj 1055 玩具取名(区间DP)

    题面 题解 字符很麻烦,不妨用数字代替(比如1代表'W') const char c[5] = {0, 'W', 'I', 'N', 'G'}; 接着,像这种两个子串可以合并成另一个子串的题可以考虑区 ...

  9. Python开发基础-Day7-闭包函数和装饰器基础

    补充:全局变量声明及局部变量引用 python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 global关键字用来在函数或其 ...

  10. 【20181020T1】蛋糕

    题面 [正解] 显然先按a排个序,然后用b乱搞 第一问用D开头的定理求最长下降子序列 第二问乱搞 for (int i=1;i<=n;i++) { int* t=upper_bound(f+1, ...