Wishbone B3总线Generic RAM写法

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

  1 /*
  2 ************************************************************************************************
  3 *    File   : ram_wb.v
  4 *    Module : ram_wb
  5 *    Author : Lyu Yang
  6 *    Data   : 01,01,1970
  7 *    Description : wishbone generic ram
  8 ************************************************************************************************
  9 */
 10
 11 // synthesis translate_off
 12 `timescale 1ns / 1ps
 13 // synthesis translate_on
 14 `timescale 1ns / 100ps
 15 module ram_wb (
 16     clk_i,
 17     rst_i,
 18     cyc_i,
 19     stb_i,
 20     we_i,
 21     sel_i,
 22     adr_i,
 23     dat_i,
 24     dat_o,
 25     cti_i,
 26     ack_o
 27 );
 28
 29 parameter adr_width = 10;
 30 parameter mem_size  = 1024;
 31
 32 // clock
 33 input                   clk_i;
 34 // async reset
 35 input                   rst_i;
 36
 37 // wishbone signals
 38 input                   cyc_i;
 39 input                   stb_i;
 40 input                   we_i;
 41 input   [3:0]           sel_i;
 42 input   [adr_width+1:0] adr_i;
 43 input   [31:0]          dat_i;
 44 output  [31:0]          dat_o;
 45 input   [2:0]           cti_i;
 46 output  reg             ack_o;
 47
 48 wire [31:0]          wr_data;
 49
 50 // mux for data to ram
 51 assign wr_data[31:24] = sel_i[3] ? dat_i[31:24] : dat_o[31:24];
 52 assign wr_data[23:16] = sel_i[2] ? dat_i[23:16] : dat_o[23:16];
 53 assign wr_data[15: 8] = sel_i[1] ? dat_i[15: 8] : dat_o[15: 8];
 54 assign wr_data[ 7: 0] = sel_i[0] ? dat_i[ 7: 0] : dat_o[ 7: 0];
 55
 56 ram #(
 57     .dat_width(32),
 58     .adr_width(adr_width),
 59     .mem_size(mem_size)
 60 ) ram0 (
 61     .dat_i(wr_data),
 62     .dat_o(dat_o),
 63     .adr_i(adr_i[adr_width+1:2]),
 64     .we_i(we_i & ack_o),
 65     .clk(clk_i)
 66 );
 67
 68 // ack_o
 69 always @ (posedge clk_i or posedge rst_i)
 70 if (rst_i)
 71     ack_o <= 1‘b0;
 72 else if (!ack_o)
 73     begin
 74         if (cyc_i & stb_i)
 75             ack_o <= 1‘b1;
 76     end
 77 else if ((sel_i != 4‘b1111) | (cti_i == 3‘b000) | (cti_i == 3‘b111))
 78     ack_o <= 1‘b0;
 79
 80 endmodule
 81
 82 //////////////////////////////////////////////////////////////////////////
 83 module ram
 84 (
 85     clk,
 86     we_i,
 87     adr_i,
 88     dat_i,
 89     dat_o
 90 );
 91
 92 parameter adr_width = 10;
 93 parameter dat_width = 32;
 94 parameter mem_size  = 1024;
 95
 96 input [dat_width-1:0]      dat_i;
 97 input [adr_width-1:0]      adr_i;
 98 input                        we_i;
 99 output reg [dat_width-1:0] dat_o;
100 input                      clk;
101
102 reg [dat_width-1:0] ram [0:mem_size - 1];
103
104 initial $readmemh("data.txt", ram);
105
106 always @ (posedge clk)
107 begin
108     dat_o <= ram[adr_i];
109     if (we_i)
110         ram[adr_i] <= dat_i;
111 end
112
113 endmodule // ram
114      

  使用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)。

时间: 2024-10-24 03:20:02

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

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

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 WB_BIU模块是OR1200处理器与外部Wishbone总线连接的接口模块,15.1节给出了WB_BIU模块的对外连接关系,并指出WB_BIU模块的三个作用.因为OR1200处理器支持Wishbone B3版本,所以在15.2节介绍了Wishbone B3版本中的寄存反馈总线周期,重点说明了其中的周期类型识别地址标签CTI_O/CTI_I.突发类型扩展地址标签BTE_O/BTE_I的作用. 15.1 WB_BIU模块的对外连接关系 通过

RAM建模和初始化

冯诺依曼提出的存储计算,计算存储,因此,几乎所有的CPU和ASIC都会使用存储器,它们的类型很多,包括异步RAM.同步RAM.ZBT RAM.DDR DRAM.ROM等.由于大部分的异步RAM和SRAM都是晶圆代工厂定制的,一次需要修改成适合于FPGA结构的Verilog等效模型.FPGA的综合工具会将这些模型推译出FPGA芯片特有的嵌入式RAM.RAM的特点是一拍写入,两拍读出.所有RAM的设计都是在速度和容量直接的折中. RAM的Verilog建模: 方式1: ///////////////

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

本文由云+社区发表 事件总线核心逻辑的实现. EventBus的作用 Android中存在各种通信场景,如Activity之间的跳转,Activity与Fragment以及其他组件之间的交互,以及在某个耗时操作(如请求网络)之后的callback回调等,互相之之间往往需要持有对方的引用,每个场景的写法也有差异,导致耦合性较高且不便维护.以Activity和Fragment的通信为例,官方做法是实现一个接口,然后持有对方的引用,再强行转成接口类型,导致耦合度偏高.再以Activity的返回为例,一

基于OR1200的一个简单SOPC

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 在本书第2章建立了最小系统,最小系统只由CPU.QMEM模块组成,借助于最小系统,我们分析了OR1200各类指令的执行过程.熟悉了流水线的工作原理以及CPU内部各个模块的代码实现,第10章在最小系统上增添了IMMU.DMMU模块,借此分析了OR1200中内存管理单元的实现原理.本章将建立一个基于OR1200的简单SOPC,后面的示例程序将运行在这个简单SOPC之上,借助于该SOPC分析OR1200中ICache.DCache.Wishbo

PCI-CAN卡驱动与数据通信调试小记

以前做项目,不注意记录调试过程中遇到的问题,以后应该注意这一点.今天抽空总结一下PCI-CAN卡驱动与数据通信调试过程中遇到的问题,方便以后回忆和思考. 1. 中断服务之字节流报文组包状态机 这是一个典型的适合采用状态机来思考和处理数据的场合.报文一般分为这几个字段:报文头,长度,命令,数据,校验和.在报文接收端,能看到的只是一连串的字节,这需要状态机的控制. 状态机分这几个状态:(1)接收报文头:(2)接收报文长度字段:(3)接收剩余部分,以报文长度作为跳出判断状态条件:(4)校验报文:(5)

软件设计杂谈

\ disclaimer: 本文所讲的设计,非UI/UE的设计,单单指软件代码/功能本身在技术上的设计.UI/UE的主题请出门右转找特赞(Tezign). 在如今这个Lean/Agile横扫一切的年代,设计似乎有了被边缘化的倾向,做事的周期如此之快,似乎已容不下人们更多的思考.MVP(Minimal Viable Produce)在很多团队里演化成一个形而上的图腾,于是工程师们找到了一个完美的借口:我先做个MVP,设计的事,以后再说. 如果纯属个人玩票,有个点子,hack out还说得过去:但要

让Python跑得更快

点击关注 异步图书,置顶公众号 每天与你分享 IT好书 技术干货 职场知识 Tips 参与文末话题讨论,即有机会获得异步图书一本. Python很容易学.你之所以阅读本文可能是因为你的代码现在能够正确运行,而你希望它能跑得更快.你可以很轻松地修改代码,反复地实现你的想法,你对这一点很满意.但能够轻松实现和代码跑得够快之间的取舍却是一个世人皆知且令人惋惜的现象.而这个问题其实是可以解决的. 有些人想要让顺序执行的过程跑得更快.有些人需要利用多核架构.集群,或者图形处理单元的优势来解决他们的问题.有

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

前言 看到网上有的文章说JIRA是使用Textile这门标记语言,有些语法和Wikitext和Markdown相像.JIRA在2017年进行了一次大更新,某些语法可能和以前不大一样,这里纪录一下常用的一些语法. 标题 h1.一级标题 h2.二级标题 h3.三级标题 h4.四级标题 h5.五级标题 用法示例: h1.ddd 一共有h1到h5这五种大小的标题,但是h6也是有效果的,不过h6起到的作用是将小写字母变成大写字母,示例如下: h6.ddd 以上会得到DDD的输出. 字体 用法 效果 *黑体

通过EventBus框架GET大牛的框架思维

EventBus的作用 Android中存在各种通信场景,如Activity之间的跳转,Activity与Fragment以及其他组件之间的交互,以及在某个耗时操作(如请求网络)之后的callback回调等,互相之之间往往需要持有对方的引用,每个场景的写法也有差异,导致耦合性较高且不便维护.以Activity和Fragment的通信为例,官方做法是实现一个接口,然后持有对方的引用,再强行转成接口类型,导致耦合度偏高.再以Activity的返回为例,一方需要设置setResult,而另一方需要在o