`timescale 1ns/1ns
module ram_mod(
input clk,
input rst_n,
input write_en,
input [7:0]write_addr,
input [3:0]write_data,
input read_en,
input [7:0]read_addr,
output reg [3:0]read_data
);
//=========================================================================\\
//*********************************NOTE************************************\\
//=========================================================================\\
// 1.深度为8 位宽位4
/*
输入描述:
clk:系统时钟信号
rst_n:异步复位信号,低电平有效
read_en,write_en:单比特信号,读/写使能信号,表示进行读/写操作
read_addr,write_addr:8比特位宽的信号,表示读/写操作对应的地址
write_data:4比特位宽的信号,在执行写操作时写入RAM的数据
输出描述:
read_data:4比特位宽的信号,在执行读操作时从RAM中读出的数据
*/
//=========================================================================\\
//*****************************define sinals*******************************\\
//=========================================================================\\
reg [3:0] RAM_DATA[7:0] ;
integer i ;
//=========================================================================\\
//*****************************main code***********************************\\
//=========================================================================\\
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
for(i = 0 ; i <= 7 ; i = i + 1)begin
RAM_DATA[i] <= 'd0 ;
end
end
else if(write_en)
RAM_DATA[write_addr] <= write_data ;
else
RAM_DATA[write_addr] <= RAM_DATA[write_addr] ;
end
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
read_data <= 'd0 ;
else if(read_en)
read_data <= RAM_DATA[read_addr] ;
else
read_data <= read_data ;
end
endmodule
这道题题目都给的时序图是这样。读地址和读数据是同步的,但是给的读数据是reg型 如果不通过对缓存数据打拍的话 读地址和读数据应该是相差一拍的。
实际上通过的仿真波形是这样:

京公网安备 11010502036488号