OpenRisc-10-基于or1200最小sopc系统搭建(四)--(sram,ssram)
来源:互联网 发布:网络小额贷款运营模式 编辑:程序博客网 时间:2024/06/06 18:47
最近在弄openrisc,之前有人在弄,并且写了一篇master thesis,我已经上传了:
http://download.csdn.net/detail/rill_zhen/5303401
下面的内容应该就是根据论文中的指导完成的,但是,不是我完成的,所以转载如下:
Ø DE2-115和DE2-70的存储器配置
DE2-115相对于DE2-70在存储器方面有两处不同的地方就是:其一,SDRAM容量加倍了,但是DE2-115中的两片SDRAM(32Mx16),在硬件上直接连在一块了(像ADDR,WE,CAS,RAS这些信号两块SDRAM都是共用的),若用就只能把两块32Mx16的SDRAM连在一起当做128M的SDRAM来用;而DE2-70上两块SDRAM(好像各是16Mx16)则是分别控制的,既可以连起来用,也可以分别当做两个独立的SDRAM来用。之所以这样是为了节省信号线吧,但却给DE2-115板上的资源利用带来了很大的不便,比方说,我现在要用友晶的D5M视频采集模块来采集数据,搭建SOC系统,来验证我写的H.264视频编码器。D5M中的DE2-115的参考设计是把整块SDRAM(128M)都当做是视频流的buffer的,这样也忒浪费了吧,况且我如果再搭建SOC系统,移植操作系统的话还有什么资源可用呢(需要把编码生成的bitstream数据通过网口传送到PC机端验证),那便只能拼板,而查了一下两块DE2-115拼板用的HSMC排线,居然要3000多元钱。而DE2-70虽然sdram和fpga的容量不如DE2-115但却可以满足我的要求。其二,DE2-115的sram,又从DE2-70的32bit 2M同步SRAM(SSRAM),恢复到了DE2(DE2-35)时期的16位SRAM时代,我不是很懂,是SRAM的价格比SSRAM的价格要便宜吗,不过我知道现在的软核处理器(OR1200)都是32位的SRAM控制起来要比SSRAM麻烦得多,得在32bit和16bit之间反复转换。
Ø Sram控制器的3中验证方案
本文设计了设计符合wishbone规范的SRAM控制器,用wishbone的总线功能模型BFM作了验证,在FPGA(DE2,DE2-115)上实现和验证,本文已给出了DE2-70上的wishbone总线规范的SSRAM控制器(用opencores的yadmc核来控制SSRAM,实在没有必要)。
以DE2上的256K x 16 IS61LV25616为例来做研究吧,其实DE2-115上的SRAM也一样。需要用到IS61LV25616的model。
我觉得,Sram_wrapper的验证方案有以下3种,第一种直接用BFM和所写的sram_wrapper相连,读写数据,第二种用BFM作为master接口,sram_wrapper作为slave接口连接到wishbone总线上进行验证,第三种方案是对整个soc平台做系统验证。第二种是否没有必要?
Ø DE2中sram控制器的时序要求
IS61LV25616的一些常用引脚的功能
读和写时序按照参照datasheet中所介绍的这两种方式
在wishbone接口中需满足途中的基本时序要求。
IS61LV25616的verilog model在网络上很容易可以找到
1 // IS61LV25616 Asynchronous SRAM, 256K x 16 = 4M; speed: 10ns. 2 // Note; 1) Please include "+define+ OEb" in running script if you want to check 3 // timing in the case of OE_ being set. 4 // 2) Please specify access time by defining tAC_10 or tAC_12. 5 6 `define OEb 7 `define tAC_10 //tAC_10 or tAC_12 defines different parameters 8 `timescale 1ns/1ns 9 10 module IS61LV25616 (A, IO, CE_, OE_, WE_, LB_, UB_); 11 12 parameter dqbits =16; 13 parameter memdepth =262143; 14 parameter addbits =19; 15 parameter Toha =2; 16 17 parameter Tsa =2; 18 19 `ifdef tAC_10 //if "`define tAC_10 " at beginning,sentences below are compiled 20 parameter Taa =10, 21 Thzce =3, 22 Thzwe =5; 23 `endif 24 25 `ifdef tAC_12 //if "`define tAC_12 " at beginning,sentences below are compiled 26 parameter Taa =12, 27 Thzce =5, 28 Thzwe =6; 29 `endif 30 31 input CE_, OE_, WE_, LB_, UB_; 32 input [(addbits -1) : 0] A; 33 inout [(dqbits -1) : 0] IO; 34 35 wire [(dqbits -1) : 0] dout; 36 reg [(dqbits/2-1) : 0] bank0 [0 : memdepth]; 37 reg [(dqbits/2-1) : 0] bank1 [0 : memdepth]; 38 //array to simulate SRAM 39 // wire [(dqbits - 1) : 0] memprobe = {bank1[A], bank0[A]}; 40 41 wire r_en = WE_ & (~CE_) & (~OE_); //WE=1,CE=OE=0 Read 42 wire w_en = (~WE_) & (~CE_) & ((~LB_) | (~UB_)); //WE=CE=0,LB or UB="0",OE=x Write 43 assign #(r_en ? Taa : Thzce) IO = r_en ? dout : 16'bz; 44 45 initial 46 $timeformat (-9, 0.1, " ns", 10); //show current simulation time 47 48 assign dout [(dqbits/2-1) : 0] = LB_ ?8'bz : bank0[A]; 49 assign dout [(dqbits -1) : (dqbits/2)] = UB_ ?8'bz : bank1[A]; 50 51 always @(A or w_en) 52 begin 53 #Tsa //address setup time 54 if (w_en) 55 #Thzwe 56 begin 57 bank0[A] = LB_ ? bank0[A] : IO [(dqbits/2-1) : 0]; 58 bank1[A] = UB_ ? bank1[A] : IO [(dqbits -1) : (dqbits/2)]; 59 end 60 end 61 62 // Timing Check 63 `ifdef tAC_10 64 specify//sepcify delay 65 specparam 66 tSA =0, 67 tAW =8, 68 tSCE =8, 69 tSD =6, 70 tPWE2 =10, 71 tPWE1 =8, 72 tPBW =8; 73 `else 74 75 `ifdef tAC_12 76 specify 77 specparam 78 tSA =0, 79 tAW =8, 80 tSCE =8, 81 tSD =6, 82 tPWE2 =12, 83 tPWE1 =8, 84 tPBW =8; 85 `endif 86 `endif 87 88 $setup (A, negedge CE_, tSA); 89 $setup (A, posedge CE_, tAW); 90 $setup (IO, posedge CE_, tSD); 91 $setup (A, negedge WE_, tSA); 92 $setup (IO, posedge WE_, tSD); 93 $setup (A, negedge LB_, tSA); 94 $setup (A, negedge UB_, tSA); 95 96 $width (negedge CE_, tSCE); 97 $width (negedge LB_, tPBW); 98 $width (negedge UB_, tPBW); 99 `ifdef OEb100 $width (negedge WE_, tPWE1);101 `else102 $width (negedge WE_, tPWE2);103 `endif104 105 endspecify106 107 endmodule
Ø Sram控制器的设计
Sram_wrapper用状态机控制的,两个周期用于读写低16位,两个周期用于读写高16位,sram datasheet中的时序应该能满足,但是过于保守了,效率应该低了。
Sram_wrapper的源码
// Author(s):// - Huailu Ren, hlren.pub@gmail.com//// Revision 1.1 16:56 2011-4-28 hlren// created//// synopsys translate_off`include"timescale.v"// synopsys translate_onmodule sram_wrapper ( wb_clk_i, wb_rst_i, wb_dat_i, //wb_dat_o, wb_adr_i, wb_sel_i, wb_we_i, wb_cyc_i, wb_stb_i, // Bi-Directional SRAM_DQ, // Outputs wb_dat_o, wb_ack_o, wb_err_o, SRAM_ADDR, SRAM_LB_N, SRAM_UB_N, SRAM_CE_N, SRAM_OE_N, SRAM_WE_N);//// clock and reset signals//input wb_clk_i; input wb_rst_i;//// WB slave i/f//input [31:0] wb_dat_i; output [31:0] wb_dat_o; input [31:0] wb_adr_i; input [ 3:0] wb_sel_i; input wb_we_i; input wb_cyc_i; input wb_stb_i; output wb_ack_o; output wb_err_o;//// SRAM port//inout [15:0] SRAM_DQ; // SRAM Data bus 16 Bitsoutput [17:0] SRAM_ADDR; // SRAM Address bus 18 Bitsoutput SRAM_LB_N; // SRAM Low-byte Data Maskoutput SRAM_UB_N; // SRAM High-byte Data Maskoutput SRAM_CE_N; // SRAM Chip chipselectoutput SRAM_OE_N; // SRAM Output chipselectoutput SRAM_WE_N; // SRAM Write chipselect reg [17:0] SRAM_ADDR; reg SRAM_LB_N; reg SRAM_UB_N; reg SRAM_CE_N; reg SRAM_OE_N; reg SRAM_WE_N; reg [3:0] state, state_r; reg [15:0] wb_data_o_l, wb_data_o_u; reg [16:0] wb_addr_i_reg; reg [31:0] wb_data_i_reg; //reg [31:0] wb_data_o_reg;reg [ 3:0] wb_sel_i_reg; reg ack_we, ack_re;// *****************************************************************************// FSM// *****************************************************************************localparam IDLE =0; localparam WE0 =1; localparam WE1 =2; localparam WE2 =3; localparam WE3 =4; localparam RD0 =5; localparam RD1 =6; localparam RD2 =7; localparam RD3 =8; localparam ACK =9; assign SRAM_DQ = ( (state_r == WE0 || state_r == WE1) ? wb_data_i_reg[15: 0] : (state_r == WE2 || state_r == WE3) ? wb_data_i_reg[31:16] : 16'hzzzz);assign wb_dat_o = {wb_data_o_u,wb_data_o_l}; assign wb_ack_o = (state == ACK); assign wb_err_o = wb_cyc_i & wb_stb_i & (| wb_adr_i[23:19]); always @ (posedge wb_clk_i orposedge wb_rst_i) begin if(wb_rst_i) state <= IDLE; elsebegin case (state) IDLE : begin if (wb_cyc_i & wb_stb_i & wb_we_i &~ack_we) state <= WE0; elseif (wb_cyc_i & wb_stb_i &~wb_err_o &~wb_we_i &~ack_re) state <= RD0; end WE0 : state <= WE1; WE1 : state <= WE2; WE2 : state <= WE3; WE3 : state <= ACK; RD0 : state <= RD1; RD1 : state <= RD2; RD2 : state <= RD3; RD3 : state <= ACK; ACK : state <= IDLE; default : state <= IDLE; endcase end end always @ (posedge wb_clk_i orposedge wb_rst_i) begin if (wb_rst_i) state_r <= IDLE; else state_r <= state; end//// Write acknowledge//always @ (posedge wb_clk_i orposedge wb_rst_i) begin if (wb_rst_i) ack_we <=1'b0;else if (wb_cyc_i & wb_stb_i & wb_we_i &~ack_we) ack_we <= #11'b1;else ack_we <= #11'b0;end //// Read acknowledge//always @ (posedge wb_clk_i orposedge wb_rst_i) begin if (wb_rst_i) ack_re <=1'b0;else if (wb_cyc_i & wb_stb_i &~wb_err_o &~wb_we_i &~ack_re) ack_re <= #11'b1;else ack_re <= #11'b0;end always @ (posedge wb_clk_i orposedge wb_rst_i) begin if (wb_rst_i) begin wb_addr_i_reg <=32'b0; wb_data_i_reg <=32'b0; wb_sel_i_reg <=4'b0;end else if (wb_cyc_i & wb_stb_i &~ack_re &~ack_we) begin wb_addr_i_reg <= wb_adr_i[18:2]; wb_data_i_reg <= wb_dat_i[31:0]; wb_sel_i_reg <= wb_sel_i[3:0]; end end always @ (posedge wb_clk_i orposedge wb_rst_i) begin if (wb_rst_i) begin SRAM_ADDR <=18'b0;end else case (state) WE0, WE1, RD0, RD1 : SRAM_ADDR <= {wb_addr_i_reg[16:0], 1'b0}; WE2, WE3, RD2, RD3 : SRAM_ADDR <= {wb_addr_i_reg[16:0], 1'b1};default : SRAM_ADDR <=18'hz;endcase end always @ (posedge wb_clk_i orposedge wb_rst_i) begin if (wb_rst_i) begin SRAM_LB_N <=1'b1;end else case (state) WE0, WE1, RD0, RD1 : SRAM_LB_N <=~wb_sel_i[0]; WE2, WE3, RD2, RD3 : SRAM_LB_N <=~wb_sel_i[2]; default : SRAM_LB_N <=1'b1;endcase end always @ (posedge wb_clk_i orposedge wb_rst_i) begin if (wb_rst_i) begin SRAM_UB_N <=1'b1;end else case (state) WE0, WE1, RD0, RD1 : SRAM_UB_N <=~wb_sel_i[1]; WE2, WE3, RD2, RD3 : SRAM_UB_N <=~wb_sel_i[3]; default : SRAM_UB_N <=1'b1;endcase end always @ (posedge wb_clk_i orposedge wb_rst_i) begin if (wb_rst_i) begin SRAM_CE_N <=1'b1;end else case (state) WE0, WE1, RD0, RD1 : SRAM_CE_N <=1'b0; WE2, WE3, RD2, RD3 : SRAM_CE_N <=1'b0;default : SRAM_CE_N <=1'b1;endcase end always @ (posedge wb_clk_i orposedge wb_rst_i) begin if (wb_rst_i) begin SRAM_OE_N <=1'b1;end else case (state) RD0, RD1, RD2, RD3 : SRAM_OE_N <=1'b0;default : SRAM_OE_N <=1'b1;endcase end always @ (posedge wb_clk_i orposedge wb_rst_i) begin if (wb_rst_i) begin SRAM_WE_N <=1'b1;end else case (state) WE0, WE1, WE2, WE3 : SRAM_WE_N <=1'b0;default : SRAM_WE_N <=1'b1;endcase end // // assemble ouput data //always @ (posedge wb_clk_i orposedge wb_rst_i) begin if (wb_rst_i) begin wb_data_o_l <=16'b0; wb_data_o_u <=16'b0;end else case (state_r) RD0, RD1 : wb_data_o_l <= SRAM_DQ; RD2, RD3 : wb_data_o_u <= SRAM_DQ; endcase endendmodule
Ø Sram_wrapper的wishbone BFM验证
Sram_wrapper的BFM验证的testbench代码如下:
1 // Author(s): 2 // - Huailu Ren, hlren.pub@gmail.com 3 // 4 5 // Revision 1.1 17:45 2011-4-28 hlren 6 // created 7 // 8 9 // synopsys translate_off 10 `include"timescale.v" 11 // synopsys translate_on 12 13 module tb_sram_wrapper ; 14 15 // 16 // clock and reset signals 17 // 18 reg wb_clk_i; 19 reg wb_rst_i; 20 21 // ***************************************************************************** 22 // wishbone master bus functional model 23 // ***************************************************************************** 24 25 wire [31:0] wb_din_w; 26 wire [31:0] wb_dout_w; 27 wire [31:0] wb_adr_w; 28 wire [ 3:0] wb_sel_w; 29 wire wb_we_w; 30 wire wb_cyc_w; 31 wire wb_stb_w; 32 wire wb_ack_w; 33 wire wb_err_w; 34 35 wb_mast u_wb_mast( 36 .clk ( wb_clk_i ), 37 .rst ( wb_rst_i ), 38 39 .adr ( wb_adr_w ), 40 .din ( wb_din_w ), 41 .dout ( wb_dout_w ), 42 .cyc ( wb_cyc_w ), 43 .stb ( wb_stb_w ), 44 .sel ( wb_sel_w ), 45 .we ( wb_we_w ), 46 .ack ( wb_ack_w ), 47 .err ( wb_err_w ), 48 .rty ( wb_rty_w ) 49 ); 50 51 // ***************************************************************************** 52 // sram controller 53 // ***************************************************************************** 54 55 wire [15:0] SRAM_DQ_w; // SRAM Data bus 16 Bits 56 wire [17:0] SRAM_ADDR_w; // SRAM Address bus 18 Bits 57 wire SRAM_LB_N_w; // SRAM Low-byte Data Mask 58 wire SRAM_UB_N_w; // SRAM High-byte Data Mask 59 wire SRAM_CE_N_w; // SRAM Chip chipselect 60 wire SRAM_OE_N_w; // SRAM Output chipselect 61 wire SRAM_WE_N_w; // SRAM Write chipselect 62 63 sram_wrapper DUT_sram_wrapper( 64 .wb_clk_i ( wb_clk_i ), 65 .wb_rst_i ( wb_rst_i ), 66 67 .wb_dat_i ( wb_dout_w ), 68 .wb_dat_o ( wb_din_w ), 69 .wb_adr_i ( wb_adr_w ), 70 .wb_sel_i ( wb_sel_w ), 71 .wb_we_i ( wb_we_w ), 72 .wb_cyc_i ( wb_cyc_w ), 73 .wb_stb_i ( wb_stb_w ), 74 .wb_ack_o ( wb_ack_w ), 75 .wb_err_o ( wb_err_w ), 76 77 // SRAM 78 .SRAM_DQ ( SRAM_DQ_w ), 79 .SRAM_ADDR ( SRAM_ADDR_w ), 80 .SRAM_LB_N ( SRAM_LB_N_w ), 81 .SRAM_UB_N ( SRAM_UB_N_w ), 82 .SRAM_CE_N ( SRAM_CE_N_w ), 83 .SRAM_OE_N ( SRAM_OE_N_w ), 84 .SRAM_WE_N ( SRAM_WE_N_w ) 85 ); 86 87 // ***************************************************************************** 88 // sram model 89 // ***************************************************************************** 90 91 IS61LV25616 u_sram_model( 92 .A ( {1'b0,SRAM_ADDR_w[17:0]} ), 93 .IO ( SRAM_DQ_w ), 94 .CE_ ( SRAM_CE_N_w ), 95 .OE_ ( SRAM_OE_N_w ), 96 .WE_ ( SRAM_WE_N_w ), 97 .LB_ ( SRAM_LB_N_w ), 98 .UB_ ( SRAM_UB_N_w ) 99 );100 101 102 initialbegin103 wb_clk_i <=0;104 wb_rst_i <=0;105 end106 107 always@(wb_clk_i) begin108 #10 wb_clk_i <=~wb_clk_i;109 end110 111 reg [31:0] tmp_dat;112 113 reg [31:0] d0,d1,d2,d3;114 115 initialbegin116 repeat (1) @ (posedge wb_clk_i);117 wb_rst_i <=1;118 repeat (3) @ (posedge wb_clk_i);119 wb_rst_i <=0;120 //write your test here!121 repeat (1) @ (posedge wb_clk_i);122 u_wb_mast.wb_wr1(32'h04,4'b1111,32'haabbccdd);123 u_wb_mast.wb_rd1(32'h04,4'b1111,tmp_dat);124 u_wb_mast.wb_wr1(32'h08,4'b1111,32'hddccbbaa);125 u_wb_mast.wb_rd1(32'h08,4'b1111,tmp_dat);126 $display($time,,"readfrom %x, value = %x\n",32'h00,tmp_dat);127 //adr,adr+4,adr+8,adr+12128 u_wb_mast.wb_wr4(32'h00,4'b1111,1,32'h01,32'h02,32'h03,32'h04);129 u_wb_mast.wb_rd4(32'h00,4'b1111,3,d0,d1,d2,d3);130 $display($time,,"read4from %x, value = %x , %x , %x , %x\n",32'h05,d0,d1,d2,d3);131 #100132 $finish;133 134 end135 136 initial137 begin138 $fsdbDumpfile("sram_wrapper.fsdb");139 $fsdbDumpvars;140 end141 endmodule
仿真结果
# INFO: WISHBONE MASTER MODEL INSTANTIATED (tb_sram_wrapper.u_wb_mast)
#
# 571 readfrom 00000000, value = ddccbbaa
#
# 1891 read4from 00000005, value = 00000001 , 00000002 , 00000003 , 00000004
#
没有错误
Ø Sram_wrapper的soc系统仿真验证
加入sram_wrapper模块之后,并没有在sram空间上跑代码,只是对sram作了以下简单的读写实验,测试代码如下所示
1 #include "orsocdef.h" 2 #include "board.h" 3 #include "uart.h" 4 5 int 6 main (void) 7 { 8 long gpio_in; 9 REG32 (RGPIO_OE) =0xffffffff;10 11 uart_init();12 13 uart_print_str("2Hello World!\n");14 15 int i;16 int t0, t1;17 t0 =0xaabbccdd;18 for(i=0;i<10;i++){19 //REG32 (RGPIO_OUT) = t0;20 REG32 (SRAM_BASE + i*4) = t0;21 t1 = REG32 (SRAM_BASE + i*4);22 //REG32 (RGPIO_OUT) = t1;23 if(t0 == t1)24 uart_print_str("correct!\n");25 else26 uart_print_str("error!\n");27 t0 = t0 -0x01010101;28 }29 30 while(1){31 gpio_in = REG32 (RGPIO_IN);32 gpio_in = gpio_in &0x0000ffff;33 REG32 (RGPIO_OUT) = gpio_in;34 }35 36 return0;37 }
仿真结果
# 2
# H
# e
# l
# l
# o
#
# W
# o
# r
# l
# d
# !
#
#
#
#
# c
# o
# r
# r
# e
# c
# t
# !
… …
在fpga上的验证几个月前跑过,没有留图,结果与设想的一致,是没有错误的。
Ø Ssram控制器的设计与验证
Ssram控制器的设计与验证,与sram相似,只不过它是同步的,ssram的model自己写即可,而且它是32位的,控制起来就简单多了。
关于DE2-70上的ssram控制器,参考设计orpXL中用yadmc核来控制ssram,是没有必要的。Ssram的控制代码如下
1 //----------------------------------------------------------------------------// 2 // Filename : ssram_wrapper.v // 3 // Author : Huailu Ren ...() // 4 // Email : hlren.pub@gmail.com // 5 // Created : 23:54 2011/5/17 // 6 //----------------------------------------------------------------------------// 7 // Description : // 8 //// 9 // $Id$ // 10 //----------------------------------------------------------------------------// 11 12 module ssram_wrapper( 13 input clk_i, 14 input rst_i, 15 16 input wb_stb_i, 17 input wb_cyc_i, 18 outputreg wb_ack_o, 19 input [31: 0] wb_addr_i, 20 input [ 3: 0] wb_sel_i, 21 input wb_we_i, 22 input [31: 0] wb_data_i, 23 output [31: 0] wb_data_o, 24 // SSRAM side 25 inout [31: 0] SRAM_DQ, // SRAM Data Bus 32 Bits 26 inout [ 3: 0] SRAM_DPA, // SRAM Parity Data Bus 27 // Outputs 28 output SRAM_CLK, // SRAM Clock 29 output [18: 0] SRAM_A, // SRAM Address bus 21 Bits 30 output SRAM_ADSC_N, // SRAM Controller Address Status 31 output SRAM_ADSP_N, // SRAM Processor Address Status 32 output SRAM_ADV_N, // SRAM Burst Address Advance 33 output [ 3: 0] SRAM_BE_N, // SRAM Byte Write Enable 34 output SRAM_CE1_N, // SRAM Chip Enable 35 output SRAM_CE2, // SRAM Chip Enable 36 output SRAM_CE3_N, // SRAM Chip Enable 37 output SRAM_GW_N, // SRAM Global Write Enable 38 output SRAM_OE_N, // SRAM Output Enable 39 output SRAM_WE_N // SRAM Write Enable 40 ); 41 42 // request signal 43 wire request; 44 45 // request signal's rising edge 46 reg request_delay; 47 wire request_rising_edge; 48 wire is_read, is_write; 49 50 // ack signal 51 reg ram_ack; 52 53 // get request signal 54 assign request = wb_stb_i & wb_cyc_i; 55 56 // Internal Assignments 57 assign is_read = wb_stb_i & wb_cyc_i &~wb_we_i; 58 assign is_write = wb_stb_i & wb_cyc_i & wb_we_i; 59 60 // Output Assignments 61 assign wb_data_o = SRAM_DQ; 62 63 assign SRAM_DQ[31:24] = (wb_sel_i[3] & is_write) ? wb_data_i[31:24] : 8'hzz; 64 assign SRAM_DQ[23:16] = (wb_sel_i[2] & is_write) ? wb_data_i[23:16] : 8'hzz; 65 assign SRAM_DQ[15: 8] = (wb_sel_i[1] & is_write) ? wb_data_i[15: 8] : 8'hzz; 66 assign SRAM_DQ[ 7: 0] = (wb_sel_i[0] & is_write) ? wb_data_i[ 7: 0] : 8'hzz; 67 68 assign SRAM_DPA =4'hz; 69 70 assign SRAM_CLK = clk_i; 71 assign SRAM_A = wb_addr_i[20:2]; 72 assign SRAM_ADSC_N =~(is_write); 73 assign SRAM_ADSP_N =~(is_read); 74 assign SRAM_ADV_N =1'b1; 75 assign SRAM_BE_N[3] =~(wb_sel_i[3] & request); 76 assign SRAM_BE_N[2] =~(wb_sel_i[2] & request); 77 assign SRAM_BE_N[1] =~(wb_sel_i[1] & request); 78 assign SRAM_BE_N[0] =~(wb_sel_i[0] & request); 79 assign SRAM_CE1_N =~request; 80 assign SRAM_CE2 =1'b1; 81 assign SRAM_CE3_N =1'b0; 82 assign SRAM_GW_N =1'b1; 83 assign SRAM_OE_N =~is_read; 84 assign SRAM_WE_N =~is_write; 85 86 // get the rising edge of request signal 87 always @ (posedge clk_i) 88 begin 89 if(rst_i ==1) 90 request_delay <=0; 91 else 92 request_delay <= request; 93 end 94 95 assign request_rising_edge = (request_delay ^ request) & request; 96 97 // generate a 1 cycle acknowledgement for each request rising edge 98 always @ (posedge clk_i) 99 begin100 if (rst_i ==1)101 ram_ack <=0;102 elseif (request_rising_edge ==1)103 ram_ack <=1;104 else105 ram_ack <=0;106 end107 108 // register wb_ack output, because onchip ram0 uses registered output109 always @ (posedge clk_i)110 begin111 if (rst_i ==1)112 wb_ack_o <=0;113 else114 wb_ack_o <= ram_ack;115 end116 117 endmodule
并没有写testbench,直接在fpga上跑了,而且是跑的程序。经验证没有问题。
源码可以在这里下载
- 稍后。。。
To Do
- 用所写的sram_wrapper基于DE2平台让or1200在sram空间跑下代码
- 修改以下用所写的sram_wrapper移植到DE2-115平台上
To Do--关于opencore,or1200的soc平台
- OR1200的引导方案设计(基于硬件或者软件uart控制)
- 移植uc/os II操作系统
- 驱动起来DE2-70上的网卡
- 加入jtag模块
- 移植u-boot
- 移植ucLinux
- ……
See Also
(原创)基于or1200最小sopc系统搭建(三)--串口
(原创)基于or1200最小sopc系统搭建(二)--QuartuII工程及DE2平台下载
(原创)基于or1200最小sopc系统搭建(一)--搭建及仿真(DE2,DE2-70)
(原创)构建基于aemb的sopc系统(五)--系统仿真与fpga验证(DE2-70平台)
- OpenRisc-10-基于or1200最小sopc系统搭建(四)--(sram,ssram)
- OpenRisc-10-基于or1200最小sopc系统搭建(四)--(sram,ssram)
- OpenRisc-8-基于or1200最小sopc系统搭建(二)--QuartuII工程及DE2平台下载
- OpenRisc-9-基于or1200最小sopc系统搭建(三)--串口
- OpenRisc-8-基于or1200最小sopc系统搭建(二)--QuartuII工程及DE2平台下载
- OpenRisc-9-基于or1200最小sopc系统搭建(三)--串口
- OpenRisc-7-基于or1200最小sopc系统搭建(一)--搭建及仿真(DE2,DE2-70)
- OpenRisc-7-基于or1200最小sopc系统搭建(一)--搭建及仿真(DE2,DE2-70)
- 基于or1200最小sopc系统搭建(一)--搭建及仿真(DE2,DE2-70)
- OpenRisc(OR1K,OR1200)仿真调试系统
- or1200构建sopc系统之软件环境搭建
- 创建or1200最小SOPC,并进行仿真
- 基于OR1200的一个简单SOPC
- OpenRisc-12-or1200软件环境搭建
- OpenRisc-13-or1200硬件环境搭建
- OpenRisc-12-or1200软件环境搭建
- OpenRisc-13-or1200硬件环境搭建
- 基于OR1200的嵌入式SoPC硬件平台设计
- xshell设置
- OpenRisc-7-基于or1200最小sopc系统搭建(一)--搭建及仿真(DE2,DE2-70)
- 第十二天【java虐我千百遍,我待java如初恋】
- OpenRisc-8-基于or1200最小sopc系统搭建(二)--QuartuII工程及DE2平台下载
- OpenRisc-9-基于or1200最小sopc系统搭建(三)--串口
- OpenRisc-10-基于or1200最小sopc系统搭建(四)--(sram,ssram)
- OpenRisc-11-编写ipcore 的linux driver,然后run helloworld
- OpenRisc-12-or1200软件环境搭建
- OpenRisc-13-or1200硬件环境搭建
- Socket通信中的多进程编程实例
- linux 网络的一些链接资源
- OpenRisc-14-or1200第一个裸机程序
- OpenRisc-15-or1200的soc完善
- 程序员,你当的了吗?——读《高效能程序员的修炼》有感