`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型 如果不通过对缓存数据打拍的话 读地址和读数据应该是相差一拍的。
实际上通过的仿真波形是这样: