|
自己写的一个连续读写SRAM的程序,还没用芯片试验过,各位帮忙看看~~哈哈~~
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 11:26:03 07/28/2008
// Design Name:
// Module Name: SRAM
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module SRAM(ce,oe,we,lb,ub,io,a,clk);
input clk; //系统时钟
output ce,oe,we,lb,ub; //读写使能信号
output [17:0]a; //地址端口
inout [15:0]io; //读写端口
//定义端口变量
wire clk;
wire [15:0]io;
wire [17:0]a;
reg ce,oe,we,lb,ub;
//定义寄存器变量
reg data_in_en; //写使能信号,等于1时写数据到RAM中
reg [15:0]data_in_reg; //从RAM读数据进来时的寄存器
reg [15:0]data_out_reg; //CPLD写数据到RAM中的寄存器
reg a_in_en; //地址写入使能,当CPLD写数据到RAM时为1
reg [17:0]a_in_reg; //写数据时的地址
reg [17:0]a_out_reg; //读数据时的地址
reg [3:0]state; //状态机状态
assign io=data_in_en?data_out_reg:16'hzzzz; //读数据时输出高阻态再读,输出直接输出到RAM
assign a=a_in_en?a_in_reg:a_out_reg; //读写地址输出
//状态变量赋值
parameter
idel=0,
start=1,
w1=2,
w2=3,
w3=4,
r1=5,
r2=6,
r3=7;
//初始化
initial
begin
state=0;
a_in_reg=0;
a_out_reg=0;
data_in_reg=0;
data_out_reg=0;
end
//状态机控制RAM的读写
always@(posedge clk)
begin
case(state)
idel:
begin
ce<=0; //
we<=1; //
oe<=1; ///////////初始状态,RAM输出高阻
lb<=0; //
ub<=0; //
data_in_en<=1; //写入使能CPLD发送数据到RAM
a_in_en<=1; //地址选择写入地址
state<=start;
end
start:
begin
if(data_in_en)
state<=w1;
else
state<=r1;
end
w1: //开始写数据到RAM
begin
a_in_en<=1; //写入地址使能,送写入地址信号到RAM,初始地址为18'b00_0000_0000_0000_0000
ce<=0; //
oe<=1; //
we<=0; ///////////设置RAM写入使能
lb<=0; //
ub<=0; //
state<=w2;
end
w2:
begin
data_out_reg<=16'h1234; //往写入寄存器赋值,写入数据发送到IO
state<=w3;
end
w3:
begin
a_in_reg<=a_in_reg+1; //选择下一个地址继续
ce<=0; //
oe<=1; //
we<=1; ////////////写入结束,RAM恢复输出高阻
lb<=0; //
ub<=0; //
state<=start; //回到开始状态判断进入读还是写
end
r1:
begin
a_in_en<=0; //读出地址使能,送读出地址到RAM
ce<=0; //
oe<=0; //
we<=1; /////////////设置RAM读出使能
lb<=0; //
ub<=0; //
state<=w2;
end
r2:
begin
data_in_reg<=io; //读出IO数据存储到读出寄存器中
state<=r3;
end
r3:
begin
a_out_reg<=a_out_reg+1; //读出下一个地址的数据
ce<=0; //
oe<=1; //
we<=1; //////////////读出结束,RAM恢复输出高阻
lb<=0; //
ub<=0; //
state<=start; //回到开始状态判断进入读还是写
end
default:
state<=idel;
endcase
end
endmodule |
阿莫论坛20周年了!感谢大家的支持与爱护!!
该献的血还是要献的。你不献他不献。难道让我去献? --- 出自坛友:lovejp1981
|