概述
片内存储器(RAM、ROM)
片内存储器分为ROM和RAM两大类。
RAM是随机存储器,存储单元的内容可以按需随意存入和取出。这种存储器在断电后将丢失所有数据。
- 单端口RAM:只有一套地址总线,读写操作是分开的。
- 双端口RAM:有两套地址总线,一套用于读数据,另一套用于写数据。
//单端口RAM
//深度为8,位宽为8
module single_ram(clk,addr,cs_n,we_n,din,dout);
input clk; //时钟信号
input [2:0]addr;//地址信号
input cs_n;//片选信号
input we_n;//读写操作使能信号,为低时写入数据,为高时读出数据
input [7:0]din;//输入数据
output [7:0]dout;//输出数据
reg [7:0]dout;
reg [7:0]ram[7:0];// 8*8 bit存储
always@(posedge clk )begin
if(cs_n)begin
dout <= 8'bzzzz_zzzz;
end
else begin
if(we_n) dout <= ram[addr]; //读出数据
else ram[addr] <= din; //写入数据
end
end
endmodule
//双端口RAM
//深度为8,位宽为8
module dual_ram(w_clk,r_clk,waddr,raddr,w_en,r_en,wdata,rdata);
input w_clk; //写时钟信号
input r_clk; //读时钟信号
input [2:0]waddr;//写数据地址信号
input [2:0]raddr;//读数据地址信号
input w_en;//写操作使能信号,高有效
input r_en;//读操作使能信号,高有效
input [7:0]wdata;//写入数据
output [7:0]rdata;//读出数据
reg [7:0]rdata;
reg [7:0]ram[7:0]// 8*8 bit
always@(posedge w_clk) begin
if(w_en) ram[waddr] <= din;
end
always@(posedge r_clk) begin
if(r_en) rdata <= ram[raddr];
end
endmodule
ROM是只读存储器,读出事先存储的数据,其存入的数据无法改变。这种存储器只能读不能写,断电之后数据也不会丢失。
//深度为8,位宽为8
module rom_test(clk,addr,cs_en,dout);
input clk;
input cs_en;//使能信号,低有效
input [2:0]addr;//地址线
output [7:0]dout;//读出的数据
reg [7:0]dout;
reg [7:0]rom[7:0];
initial begin
rom[0] = 8'b0000_0000;
rom[1] = 8'b0000_0001;
rom[2] = 8'b0000_0010;
rom[3] = 8'b0000_0011;
rom[4] = 8'b0000_0100;
rom[5] = 8'b0000_0101;
rom[6] = 8'b0000_0110;
rom[7] = 8'b0000_0111;
end
always@(posedge clk) begin
if(cs_en) dout <= 8'bzzzz_zzzz;
else dout <= rom[addr];
end
endmodule
最后
以上就是土豪烤鸡为你收集整理的RAM和ROM(verilog)片内存储器(RAM、ROM)的全部内容,希望文章能够帮你解决RAM和ROM(verilog)片内存储器(RAM、ROM)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复