乒乓操作的写入控制器,由wr_en使能,使能后,将会根据内存写入次数的计数,输出合适的地址,内存块的片选信号,以及将数据源的数据输出,由于wr_req要求先数据一个时钟,这样,如果使能模块判断可以写入,则wr_en和data_in同时进入此模块,一个时钟后,输出地址,数据,片选
从而完成数据的写入。[3:0]wea为bram的位数有效信号:地址一般指均是1B(8位数据)的地址,所以对于32位输入,地址每次要加4,且用四位[3:0]wea告知Bram写入哪些八位,全1则四个8位都写入,0010意味着写入第二个八位。
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2018/09/14 22:30:46
// Design Name:
// Module Name: wt2bram_ctl
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
// 乒乓操作的写入控制器,由wr_en使能,使能后,将会根据内存写入次数的计数,输出合适的地址,内存块的片选信号,以及将数据源的
//数据输出,由于wr_req要求先数据一个时钟,这样,如果使能模块判断可以写入,则wr_en和data_in同时进入此模块,一个时钟后,输出地址,数据,片选
//从而完成数据的写入。[3:0]wea为bram的位数有效信号:地址一般指均是1B(8位数据)的地址,所以对于32位输入,地址每次要加4,且用四位[3:0]wea
//告知Bram写入哪些八位,全1则四个8位都写入,0010意味着写入第二个八位。
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
module wt2bram_ctl(reset,clk,wr_en,data_in,data_out,addra,bram_time,bram_en1,bram_en2,wea,state
);
input clk;
input reset;
input wr_en;
input [31:0]data_in;
output[13:0] bram_time;
output bram_en1;
output bram_en2;
output [3:0]wea;
output [31:0]data_out;
output [31:0]addra;
output state;
reg [13:0]bram_time;
reg bram_en1;
reg bram_en2;
reg [3:0]wea;
reg [31:0]addra;
reg [31:0]data_out;
reg [12:0]count;
always @(posedge clk or negedge reset)
if(!reset)
begin
count <= 13'b0;
addra <= 32'b0;
data_out <= 32'b0;
bram_time <= 14'b0;
wea <= 4'b0000;
bram_en1 <= 1'b0;
bram_en2 <= 1'b0;
end
else if(wr_en)
begin
count <= count + 1;
if(count == 0)
addra <=0;
else
addra <= addra + 4;
data_out <= data_in;
wea <= 4'b1111;
if(count == 8191)
bram_time <= bram_time + 1;
else
bram_time <= bram_time;
bram_en1 <= ~bram_time[0];
bram_en2 <= bram_time[0];
end
else
begin
count <= count;
addra <= addra;
data_out <= data_out;
bram_time <= bram_time;
bram_en1<= 1'b0;
bram_en2<= 1'b0;
wea <= 4'b0000;
end
assign state = bram_time[0];
endmodule