OpenCores
URL https://opencores.org/ocsvn/or1k_soc_on_altera_embedded_dev_kit/or1k_soc_on_altera_embedded_dev_kit/trunk

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [soc/] [rtl/] [altera_ram/] [altera_ram_top.v] - Rev 12

Compare with Previous | Blame | View Log

//===============================================================================
//
//          FILE:  altera_ram_top.v
// 
//         USAGE:  ./altera_ram_top.v 
// 
//   DESCRIPTION:  Wishbone bridge for Altera RAM core
// 
//       OPTIONS:  ---
//  REQUIREMENTS:  ---
//          BUGS:  ---
//         NOTES:  ---
//        AUTHOR:  Xianfeng Zeng (ZXF), xianfeng.zeng@gmail.com
//                                      xianfeng.zeng@SierraAtlantic.com
//       COMPANY:  
//       VERSION:  1.0
//       CREATED:  10/10/2009 06:15:19 PM HKT
//      REVISION:  ---
//===============================================================================
 
// synopsys translate_off
`include "timescale.v"
// synopsys translate_on
 
 
module altera_ram_top (
  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, wb_ack_o, wb_err_o
 
);
 
//
// Paraneters
//
parameter	Idle  = 12'b100000000000,
		Read0 = 12'b010000000000,
		Read1 = 12'b001000000000,
		Read2 = 12'b000100000000,
		Read3 = 12'b000010000000,
		Write0= 12'b000001000000,
		Write1= 12'b000000100000,
		Write2= 12'b000000010000,
		Write3= 12'b000000001000,
		Ack   = 12'b000000000100,
		Read_done  = 12'b000000000010,
		Write_done =  12'b000000000001;			
 
//
// I/O Ports
//
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;
 
 
//
// Internal regs and wires
//
reg		ack_we;
reg		wren;
reg [31:0]	adr;
reg [31:0]	cur_adr;
reg [31:0]	data_save;
reg [3:0]       sel;
 
wire 		wb_err;
 
reg		clk;
integer		i;
wire [7:0]	data_q;
reg  [7:0]	data;
 
reg [11:0]	State;
 
wire		bit_shift;
 
//
// Aliases and simple assignments
//
assign wb_err = wb_cyc_i & wb_stb_i & (|wb_adr_i[20:14]);	// If Access to > 16KB (4-bit leading prefix ignored)
assign wb_err_o = wb_err;
 
//
// Use State Machine to 32->8 or 8->32
//
always @ (negedge wb_clk_i or posedge wb_rst_i)
begin
	if (wb_rst_i) begin
		State <= Idle;
		wren <= 1'b0;
	end
	else
		case (State)
			Idle: begin
				if (wb_cyc_i & wb_stb_i) begin
					adr <= {5'b0000,wb_adr_i[26:2],2'b00};
					cur_adr <= {5'b0000,wb_adr_i[26:2],2'b00};
					sel <= wb_sel_i;
					if (wb_we_i) begin
						data_save <= wb_dat_i; 
						State <= Write0;
					    end
					else
						State <= Read0;
				end
				wren <= 1'b0;
			end
			Read0: begin
				State <= Read1;
				cur_adr <= adr + 1;
//				data_save[31:24] <= data_q;
			end
			Read1: begin
				State <= Read2;
				cur_adr <= adr + 2;
				data_save[31:24] <= data_q;
			end
			Read2: begin
				State <= Read3;
				cur_adr <= adr + 3;
				data_save[23:16] <= data_q;
			end
			Read3: begin
				State <= Read_done;
				data_save[15:8] <= data_q;
			end
			Read_done: begin
			     data_save[7:0] <= data_q;
				State <= Ack;
			end
			Ack: begin
				State <= Idle;
				wren <= 1'b0;
			end
			Write0: begin
				if (sel[3]) begin
					data <= data_save[31:24];
					wren <= 1'b1;
				end else
					wren <= 1'b0;
				cur_adr <= adr;
				State <= Write1;
			end
			Write1: begin
				if (sel[2]) begin
					data <= data_save[23:16];
					wren <= 1'b1;
				end else
					wren <= 1'b0;
				cur_adr <= adr + 1;
				State <= Write2;
			end
			Write2: begin
				if (sel[1]) begin
					data <= data_save[15:8];
					wren <= 1'b1;
				end else
					wren <= 1'b0;
				cur_adr <= adr + 2;
				State <= Write3;
			end
			Write3: begin
				if (sel[0]) begin
					data <= data_save[7:0];
					wren <= 1'b1;
				end else
					wren <= 1'b0;
				cur_adr <= adr + 3;
				State <= Ack;
			end
			default: State <= Idle;
		endcase
end
 
assign wb_dat_o = data_save;
assign wb_ack_o = (State == Ack) ? 1'b1 : 1'b0;
 
//
// Connect to altera 1-port RAM
//
altera_ram	altera_ram_inst (
	.address	( cur_adr[13:0] ),
	.clock		( wb_clk_i ),
	.data		( data ),
	.wren		( wren ),
	.q		( data_q )
	);
 
//
// SRAM i/f monitor
//
// synopsys translate_off
integer fsram;
initial begin
	fsram = $fopen("sram.log");
end
always @(posedge wb_clk_i)
        if (wb_cyc_i)
                if (State == Ack)
			if (wb_we_i)
                        	$fdisplay(fsram, "%t [%h] <- write %h, byte sel %b", $time, wb_adr_i, wb_dat_i, wb_sel_i);
                	else
                        	$fdisplay(fsram, "%t [%h] -> read %h, byte sel %b", $time, wb_adr_i, wb_dat_o, wb_sel_i);
// synopsys translate_on
 
endmodule
 
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.