81 lines
1.9 KiB
Coq
81 lines
1.9 KiB
Coq
|
//a module bridge the avalon streaming interface and avalon memory map interface
|
||
|
//collect data from interface and write to RAM
|
||
|
//long to short
|
||
|
//32 bits to 16 bits
|
||
|
|
||
|
|
||
|
module st2mm_l2s(
|
||
|
|
||
|
//clock and reset
|
||
|
input wire clk,
|
||
|
input wire rst,
|
||
|
|
||
|
//avalon ST(Streaming) sink: 0 readlatency and 0 readallowence
|
||
|
input wire [31:0] st_data, // st.data
|
||
|
output wire st_ready, // .ready
|
||
|
input wire st_valid, // .valid
|
||
|
input wire [1:0] st_empty, // .empty
|
||
|
input wire st_endofpacket, // .endofpacket
|
||
|
input wire st_startofpacket, // .startofpacket
|
||
|
|
||
|
//avalon MM(Memory Mapped) source
|
||
|
output wire [8:0] mm_address,
|
||
|
output wire mm_chipselect, // only for write
|
||
|
output wire mm_clken, //only for write; write enable
|
||
|
input wire [31:0]mm_readdate, //do not read
|
||
|
output wire mm_write,
|
||
|
output wire [8:0] mm_writedata
|
||
|
|
||
|
);
|
||
|
|
||
|
reg[1:0] state;
|
||
|
localparam STATE_IDLE = 2'd0; //waiting for startofpacket
|
||
|
localparam STATE_WRITE = 2'd1; //write to mm
|
||
|
localparam STATE_LOCK = 2'd3; //Finish writing
|
||
|
|
||
|
reg[8:0] ctr; // count data and the address for MM
|
||
|
localparam CTR_ZERO = 9'd0;
|
||
|
assign mm_address = ctr;
|
||
|
assign mm_writedata = st_data;
|
||
|
|
||
|
assign mm_chipselect = (state == STATE_WRITE && st_valid)? 1'b1: 1'b0;
|
||
|
assign mm_clken = (state == STATE_WRITE && st_valid)? 1'b1: 1'b0;
|
||
|
assign st_ready = (state == STATE_WRITE)? 1'b1: 1'b0;
|
||
|
|
||
|
|
||
|
always @ (posedge clk or posedge rst)
|
||
|
begin
|
||
|
if (rst)
|
||
|
begin
|
||
|
state <= STATE_IDLE;
|
||
|
ctr <= CTR_ZERO;
|
||
|
end
|
||
|
else case(state)
|
||
|
STATE_IDLE:
|
||
|
begin
|
||
|
ctr <= CTR_ZERO;
|
||
|
if (st_startofpacket)
|
||
|
state <= STATE_WRITE;
|
||
|
end
|
||
|
STATE_WRITE:
|
||
|
begin
|
||
|
if (st_valid)
|
||
|
ctr <= ctr + 1'b1;
|
||
|
if (st_endofpacket)
|
||
|
state <= STATE_LOCK;
|
||
|
end
|
||
|
STATE_LOCK:
|
||
|
begin
|
||
|
state <= STATE_IDLE;
|
||
|
ctr <= CTR_ZERO;
|
||
|
end
|
||
|
default:
|
||
|
state <= STATE_IDLE;
|
||
|
endcase
|
||
|
end
|
||
|
|
||
|
|
||
|
|
||
|
endmodule
|
||
|
|