FPGA RAM

Applications, development tools, FPGA, C, WEB
Post Reply
tzw
Posts: 9
Joined: Wed Nov 09, 2016 1:03 pm

FPGA RAM

Post by tzw » Wed Mar 15, 2017 4:28 pm

Hey,
I'm trying to build a readable and writable RAM in the FPGA for storing a feedforward function. Synthesis works for the code, but when I test my code using the monitor tool I get the same value in all registers. I would really appreciate it, if someone more experienced could help me out :) . I tried to stick to the code which was written for the dac buffer in the scope module and the asg module

Here is a code snippet:

// discrete feedforward function
parameter FFRSZ = 14; //feedforward RAM Size 2^FFRSZ

reg [14-1:0] ram_ff_values[0:(1<<FFRSZ)-1]; //discrete feedforward function values
reg [14-1:0] ram_ff_slope[0:(1<<FFRSZ)-1]; //corresponding feedforward function slope for each value

//write to RAM
always @(posedge clk_i) begin
buf_value_we <= sys_wen && (sys_addr[19:16] == 'h1);
buf_slope_we <= sys_wen && (sys_addr[19:16] == 'h2);
ff_addr_w <= sys_addr[16-1:2];
end

always @(posedge clk_i) begin
if (buf_value_we) ram_ff_values[ff_addr_w] <= sys_wdata[14-1:0]; //write feedforward function values to RAM
end

always @(posedge clk_i) begin
if (buf_slope_we) ram_ff_slope[ff_addr_w] <= sys_wdata[14-1:0]; //write feedforward function slope values to RAM
end

//read buffer
always @(posedge clk_i) begin
ff_addr_r <= sys_addr[16-1:2];
ff_value_rd <= ram_ff_values[ff_addr_r];
ff_slope_rd <= ram_ff_slope[ff_addr_r];
end

always @(posedge clk_i)
if (rstn_i == 1'b0) begin
sys_err <= 1'b0 ;
sys_ack <= 1'b0 ;
end else begin
sys_err <= 1'b0 ;

casez (sys_addr[19:0])
20'h1zzzz : begin sys_ack <= sys_en; sys_rdata <= {{32-14{1'b0}}, ff_value_rd} ; end //read feedforward function values
20'h2zzzz : begin sys_ack <= sys_en; sys_rdata <= {{32-14{1'b0}}, ff_slope_rd} ; end //read feedforward function slope

default : begin sys_ack <= sys_en; sys_rdata <= 32'h0 ; end
endcase

end

tzw
Posts: 9
Joined: Wed Nov 09, 2016 1:03 pm

Re: FPGA RAM

Post by tzw » Fri Mar 17, 2017 5:41 pm

Delaying the read enable like in the scope module fixed the problem.

always @(posedge clk_i) begin //delay read enable for RAM for 3 clock cycles
if (rstn_i == 1'b0)
rval <= 4'h0 ;
else
rval <= {rval[2:0], (sys_ren || sys_wen)};
end
assign rd_dv = rval[3];

always @(posedge clk_i)
if (rstn_i == 1'b0) begin
sys_err <= 1'b0 ;
sys_ack <= 1'b0 ;
end else begin
sys_err <= 1'b0 ;

casez (sys_addr[19:0])

20'h1???? : begin sys_ack <= rd_dv; sys_rdata <= {16'h0, 2'h0,ff_value_rd} ; end //read feedforward function values
20'h2???? : begin sys_ack <= rd_dv; sys_rdata <= {16'h0, 2'h0,ff_slope_rd} ; end //read feedforward function slope
default : begin sys_ack <= sys_en; sys_rdata <= 32'h0 ; end
endcase

end

Post Reply
jadalnie klasyczne ekskluzywne meble wypoczynkowe do salonu ekskluzywne meble tapicerowane ekskluzywne meble do sypialni ekskluzywne meble włoskie

Who is online

Users browsing this forum: No registered users and 32 guests