FPGA中重要接口部件的设计(一)

文章目录

  • 1.SRAM
  • 2.双口RAM
  • 3.移位寄存器

1.SRAM

1.SRAM在数学中对应静态数组。
(1)当给出数据地址(address),并被时钟上升沿采样后,SRAM的数据输出Q端将会输出存储的数据;
(2)当SRAM处于存储数据改写状态时,SRAM将会在时钟上升沿采样数据输入D端的信号,并将其存储到内部单元中。
SRAM的Verilog仿真模型:

// A SRAM
module sram_6_8 #(parameter ADDR_WIDTH = 6,DATA_WIDTH = 8) (
input [DATA_WIDTH-1:0] data,
input [ADDR_WIDTH-1:0] addr,
input we,
input 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)
		ram[addr] <= data;
		
addr_reg <= addr;
end

assign q = ram[addr_reg];

endmodule

2.同步SRAM的时序与寄存器(D触发器)最大的区别在于:读取的数据内容相对于寄存器晚一个时钟节拍,而写时序是一样的(在时钟沿锁存)。SRAM时序与APB读写时序基本一致。

2.双口RAM

1.除以上的单口RAM外,还有支持双地址操作的RAM,称为双口RAM(Dual Port RAM)。
2.双口RAM分为两种:
(1)简单双口RAM,采用单一时钟,支持一个读地址口和一个写地址口;
(2)真双口RAM,支持两个时钟,同时支持完整的两套地址读写。
简单双口RAM的Verilog模型:

module ram_6_8 #(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)
		ram[write_addr] <= data;
		
	q_out <= ram[read_addr];  //read old data!
end

assign q = q_out;

endmodule

3.移位寄存器

1.移位寄存器实际上就是多个D触发器串联在一起,实现数据的固定延迟。实现N个周期的延迟需要N-1个触发器串接实现。
2.移位寄存器的另一种实现方式:通过双口RAM完成延迟:读地址与写地址相邻,且每周期都移动一个位置,并形成一个固定差值,即延迟节拍数。
标准基于D触发器的移位寄存器代码如下:

module shift_reg_8_16 #(parameter TAPS = 8,WIDTH = 16) (
input clk,
input rst_n,
input [WIDTH-1:0] d_in,
output [WIDTH-1:0] d_out
);

generate
genvar i;   //利用generate语句自动生成并行多位移位寄存器

for(i = 0;i < WIDTH;i = i + 1)
begin:shift_reg
reg [TAPS-1:0] r_reg;
wire [TAPS-1:0] r_next;

always@ (posedge clk or negedge rst_n)
	if(!rst_n)
		r_reg <= 0;
	else
		r_reg <= r_next;

//更新移位寄存器状态,可以在此处修改左移、右移或者状态
assign r_next = {d_in[i],r_reg[TAPS-1:1]};
assign d_out[i] = r_reg[0];
end

endgenerate

endmodule

你可能感兴趣的:(FPGA)