片内存储器分为RAM和ROM两类。
RAM :随机存取存储器(random access memory,RAM)又称作“随机存储器”。是与CPU直接交换数据的内部存储器,也叫主存(内存)。它可以随时读写,而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储媒介。
根据地址总线、数据总线以及读写控制线的数目,可以将RAM分为单端口RAM和双端口RAM两大类。
单端口RAM只有一套地址总线,读操作和写操作是分开的Verilog HDL代码如下:
module ram_single(clk,addm,cs_n,we_n,din,dout);
input clk; //clock
input[2:0] addm; //address
input cs_n; //option signal
input we_n; //enable signal
input[7:0] din; //input
output[7:0] dout; //output
reg [7:0] dout;
reg[7:0] raml[7:0]; //8*8bit register
always@(posedge clk)begin
if(cs_n)
dout <= 8'bzzz_zzzz;
else begin
if(we_n)
dout <= raml[addm];
else
raml[addm] <= din;
end
end
endmodule
双端口RAM具有两套地址总线,一套用于读数据,一套用于写数据,两者可以分别进行操作,Verilog HDL代码如下:
module ram_dual(q,addr_in,addr_out,d,we,rd,clk1,clk2);
input clk1; //clock
input clk2; //clock
input[2:0] addr_in; //write address
input[2:0] addr_out; //read address
input we; //write enable
input rd; //read enable
output[7:0] q; // data output
input [7:0] d; // data in
reg [7:0] q;
reg[7:0] raml[7:0]; //8*8bit register
always@(posedge clk1)begin
if(we)
raml[addr_in] <= d;
end
always@(posedge clk2)begin
if(rd)
q <= raml[addr_out];
end
endmodule
ROM即只读存储器,是一种只能读出事先存储的数据的存储器,其特性是存入的数据无法改变。也就是说,这种存储器只能读不能写。由于ROM在断电之后数据不会丢失,所以通常用在不需要经常变更资料的电子或电脑系统中,资料不会因为电源的关闭而消失,Verilog HDL代码如下:
module rom(dout,clk,addm,cs_n);
input clk,cs_n;
input[2:0] addm;
output[7:0] dout;
reg[7:0] dout;
reg[7:0] rom[7:0];
initial begin
rom[0] = 8'b1234_0001;
rom[1] = 8'b1234_0010;
rom[2] = 8'b1234_0011;
rom[3] = 8'b1234_0100;
rom[4] = 8'b1234_0101;
rom[5] = 8'b1234_0110;
rom[6] = 8'b1234_0111;
rom[7] = 8'b1234_1000;
end
always@(posedge clk) begin
if(cs_n)
dout <= 8'bzzz_zzzz;
else
dout <= rom[addm];
end
endmodule