module ram_ctrl( input wire sclk, input wire rst_n, input wire wr_en,//写使能 input wire [7:0] pi_data,//输入ram中的数据 output wire [7:0] po_data,//输出的数据 output reg [23:0] po_hex_data,//输出HEX6的数据 output reg po_data_end//输出数据标志信号 ); parameter CNT_05S_END = 25'd24_999_999;//0.5s计数最大值 reg [7:0] wr_addr;//ram写地址 reg [7:0] rd_addr;//ram读地址 reg cnt_start;//开始计数标志 reg [24:0] cnt_05s;//0.5s计数器 reg cnt_05s_flag;//0.5秒计数器标志信号用于ram读地址的++ ram_256_8 ram_256_8_inst ( .clka (sclk ), // input clka .wea (wr_en ), // input [0 : 0] wea .addra (wr_addr ), // input [7 : 0] addra .dina (pi_data ), // input [7 : 0] dina .clkb (sclk ), // input clkb .addrb (rd_addr ), // input [7 : 0] addrb .doutb (po_data ) // output [7 : 0] doutb ); //0.5s开始计数控制信号 always@(posedge sclk or negedge rst_n) if(!rst_n) cnt_start <= 1'b0; else if(cnt_05s_flag==1'b1 && rd_addr==8'd255) cnt_start <= 1'b0; else if(wr_en == 1'b1) cnt_start <= 1'b1; //0.5s计数 always@(posedge sclk or negedge rst_n) if(!rst_n) cnt_05s <= 'd0; else if(cnt_05s == CNT_05S_END) cnt_05s <= 'd0; else if(cnt_start == 1'b1) cnt_05s <= cnt_05s + 1'b1; //0.5s计数完成标志信号产生 用于读地址的++ always@(posedge sclk or negedge rst_n) if(!rst_n) cnt_05s_flag <= 1'b0; else if(cnt_05s == CNT_05S_END) cnt_05s_flag <= 1'b1; else cnt_05s_flag <= 1'b0; //ram写地址 always@(posedge sclk or negedge rst_n) if(!rst_n) wr_addr <= 'd0; else if(wr_en) wr_addr <= wr_addr + 1'b1; //ram读数据的标志产生 always@(posedge sclk or negedge rst_n) if(!rst_n) rd_addr <= 'd0; else if(rd_addr=='d255 && cnt_05s_flag==1'b1) rd_addr <= 'd0; else if(cnt_05s_flag) rd_addr <= rd_addr + 1'b1; //ram的数据输出标志 always@(posedge sclk or negedge rst_n) if(!rst_n) po_data_end <= 1'b0; else po_data_end <= cnt_05s_flag; //输出HEX6的数据 always@(posedge sclk or negedge rst_n) if(!rst_n) po_hex_data <= 'hffffff; else po_hex_data <= {po_data[3:0],po_data[7:4],16'h0000}; endmodule |