以32x256大小的交织器(按行写,按列读)为例描述存储器的基本模型、读写时序、读写技巧
1.语法定义
parameter ROM_DEPTH;
parameter ROM_WIDTH;
reg [8:0] Line;
reg [8:0] Column;
reg [ROM_WIDTH-1:0] memory [ROM_DEPTH-1:0];
有点类似于C语言中的二维数组的,但在硬件描述中为存储器模型。
用Line、Column定位到读写中的某一个具体位置,注意Line位宽为ROM_DEPTH,而不是ROM_WIDTH;Column同理。
2.模型例化:传入常参数
//定义module时按以下格式
module ROM_inter
#(
parameter ROM_DEPTH,
parameter ROM_WIDTH
)(
output reg [31:0] rdata,
input [31:0] wdata
);
//例化模型可以传参
ROM_inter
#(
.ROM_DEPTH (9'h08),
.ROM_WIDTH (9'h08)
//传入参数例化为8行8列的存储器
)int_ins(
.wdata (dec_signal),
.rdata (int_dec_sig),
);
3.时序约束
两个相关变量不要在同一个时钟边沿变化。例如addr随时钟驱动自增,输出也随着时钟驱动读取地址对应数据,此时最好选取相反的时钟边沿,更好地满足时序约束。
always@(posedge clk)
begin
addr <= addr+8'b1;
end
always@(negedge clk)
begin
rdata <= memory[addr];
end
4.时序同步
(1)缓存法:例如挂载在AMBA总线下的外设,总线协议要求地址与命令一拍,随后传输数据一拍。要使地址、命令与数据一 一对应,需要将先到的地址、命令缓存一拍
always@(posedge clk)
begin
addr_r <= addr;
cmd_r <= cmd;
end
always@(posedge clk)
begin
memory[addr_r] <= wdata;
end
(2)放置在同一个时钟周期内。
例如要对同一个数据的不同数据段进行处理
always@(posedge clk)
begin
case(signal[7:4])
4'b0000: begin decode[27:4] <= 24'h000001; end
4'b0001: begin decode[27:4] <= 24'h000003; end
endcase
decode[31:28]<= PN_code;
decode[3:0] <= signal[3:0];
end
5.读写规则与技巧
规则:地址索引只能放后面,即只能按行读不能按列读。
rdata <= memory[Line][7:0]; √
rdata <= memory[2:0][Column]; X
技巧:如果确实要同时读入,可以用连接符’ ‘{ }’’,或者在同一个时钟驱动内列举所有连接端
always@(posedge clk)begin
if(w_r==1'b1)begin //read mode
rdata <= {memory[2][Column],memory[1][Column],memory[0][Column]}
end else if(w_r==1'b0)begin //write mode
memory[Line][Column+2'b10] <= wdata[02];
memory[Line][Column+2'b01] <= wdata[01];
memory[Line][Column+2'b00] <= wdata[00];
end else begin
rdata <= 3'hx;
end
end
6.读写时for循环的处理
https://blog.youkuaiyun.com/qq_40946355/article/details/105496865
2860

被折叠的 条评论
为什么被折叠?



