重要接口部件——SRAM
SRAM在数学模型中对应着静态数组。
当给出地址下标后,数组会输出所存储的数据值。当给出数据地址(Address),并被时钟上升采样后,SRAM的数据输出Q端将会输出存储的数据;当SRAM处于存储数据改写状态时,SRAM将在时钟上升沿采样数据输入D端的信号,并将其存储到内部单元中。
下面是SRAM的Verilog仿真模型:
module spram #(parameter ADDR_WIDTH=6 ,DATA_WIDTH=8)(
input [(DATA_WIDTH-1):0] data,
input [(ADDR_WIDTH-1):0] addr,
input we, clk,
output [(DATA_WIDTH-1):0] q
);
reg [DATA_WIDTH-1:0] ram[2**ADDR_WIDTH-1:0];
reg [ADDR_WIDTH-1:0] addr_reg;
always @ (posedge clk)begin
if (we) begin
ram[addr] <= data;
end
addr_reg <= addr;
end
assign q = ram[addr_reg];
endmodule
SRAM的时序
标准的SRAM读写时序如下图所示,该图源自SMIC65nmSRAM模型,其他厂家SRAM时序图也基本一样。
同步SRAM的时序与寄存器(D触发器)的最大区别就是读取的数据内容相对于寄存器晚一个时钟节拍,写时序则是完全一样(在时钟沿锁存)。
SRAM时序于APB读写时序基本一致。
寄存器堆
无论时RegFile还是SRAM,如果地址位宽于数据存储深度比例较大,都会有较大的面积浪费。
例如256×256的RAM,地址位宽为256位,数据存储个数位256个,在ASIC中回有较大的MUX单元浪费,而相对FPGA,也有一些额外的开销浪费,所以在使用时尽量用小的地址位宽。
此外在FPGA中,只有SRAM而没有RegFile,而在CPLD中则存在异步SRAM,即类似组合电路的RAM,一旦给出地址,数据立刻输出。
双口RAM
除了上面的单口RAM外,还有一种支持双地址操作的RAM,称为双口RAM(Dual Port RAM)。
双口RAM分成两种:一种是简单双口RAM,采用单一时钟,支持一个都地址口和一个写地址口;另外一种时真双口RAM,真双口RAM支持两个时钟,同时支持完整的两套地址读写。
在低端FPGA种一般只有简单双口RAM,只有在高端的FPGA中才有真双口RAM,这是因为真双口RAM的成本代价很高,而简单双口RAM的设计相对容易。
在ASIC工艺厂商里同样只有真双口RAM与双口Register File,而没有简单的双口RAM。
下面内容时一个简单双口RAM的行为模型:
module dpram #(parameter ADDR_WIDTH=6 ,DATA_WIDTH=8) (
input [(DATA_WIDTH-1):0] data,
input [(ADDR_WIDTH-1):0] read_addr,
input [(ADDR_WIDTH-1):0] write_addr,
input we,
input clk,
output [(DATA_WIDTH-1):0] q
);
reg [DATA_WIDTH-1:0] ram[2**ADDR_WIDTH-1:0];
reg [(DATA_WIDTH-1):0] q_out;
always @ (posedge clk) begin
if (we) begin
ram[write_addr] <= data;
end
q_out <= ram[read_addr]; // read old data!
end
assign q = q_out ;
endmodule
源自:《通信IC设计》,摘录下来,只做学习;