System object methods can only be called once

조회 수: 4 (최근 30일)
Guowei Zha
Guowei Zha 2017년 3월 19일
답변: Kiran Kintali 2021년 5월 16일
I get a error in HDL coder when using hdl.RAM objects. The testbench is test.m, and the calling fuction is gamma_table_new.m. In this gamma_table_new function, a MAT file was loaded to initiallized the hdl.RAM gamma_table_ram. The original scripts are attached as attchments and also posted as below.
Actually I've been trying to load experiment data into ram(not register), applying to FPGA. The pasted gamma_table was just for test. I just came up with initiallization with MAT file and I'm not sure if there are other solutions.Can anyone help?Thanks!
%%%%%%%%%%%%%%%%%%%test.m%%%%%%%%%%%%%%%
im_width=1080;
im_height=20;
indata=double(imread('1.bmp'));
for i=1:im_height
for j=1:im_width
R_in=indata(i,j,1);G_in=indata(i,j,2);B_in=indata(i,j,3);
[R_out,G_out,B_out]=gamma_table_new(R_in,G_in,B_in);
outdata(i,j,1)=R_out;
outdata(i,j,2)=G_out;
outdata(i,j,3)=B_out;
end
end
figure;
subplot(2,1,1);imshow(indata,[]);
subplot(2,1,2);imshow(outdata,[]);
%%%%%%%%%%%%%%%%%%%test.m%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%gamma_table_new.m%%%%%%%%%%%%%%%
function [R_out,G_out,B_out]=gamma_table_new(R_in,G_in,B_in)
persistent gamma_table_ram;
data_gamma=0;
data_in=0;
if isempty(gamma_table_ram)
gamma_table_ram=hdl.RAM('RAMType','Single port','WriteOutputValue','Old data');
gamma_table_struct= coder.load('gamma_table.mat');
gamma_table=gamma_table_struct.g1;
for i=0:255
data_in=gamma_table(i+1);
data_gamma=step(gamma_table_ram,data_in,i,true);
end
end
step(gamma_table_ram,data_in,R_in,false);
R_out=step(gamma_table_ram,data_in,R_in,false);
step(gamma_table_ram,data_in,G_in,false);
G_out=step(gamma_table_ram,data_in,G_in,false);
step(gamma_table_ram,data_in,B_in,false);
B_out=step(gamma_table_ram,data_in,B_in,false);
end %%%%%%%%%%%%%%%%%%%gamma_table_new.m%%%%%%%%%%%%%%%

답변 (1개)

Kiran Kintali
Kiran Kintali 2021년 5월 16일
Consider splitting the logic into reset, update, output secttions.
Persistent variables result in registers. Persistent variable initalization should be in its own if isempty() condition. The logic moves to reset section of the generated HDL Code.
See following pages for best practices on this topic.
Persistent Variables and Persistent Array Variables
Initialize Persistent Variables in MATLAB Functions
Map Persistent Arrays and dsp.Delay to RAM
https://www.mathworks.com/help/hdlcoder/ug/how-to-map-persistent-arrays-to-ram.html

카테고리

Help CenterFile Exchange에서 Code Generation에 대해 자세히 알아보기

제품

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by