如何在一个进程中同时访问二维数组或数组数组中的四个元素? 在这个示例中,我试图同时访问intg1,合成正在进行中。
type img_whole is array (78 downto 0, 130 downto 0) of std_logic_VECTOR(7 downto 0);
signal img1: img_whole;
signal i1_1: integer range 0 to 79:=0;
signal j1_1:integer range 0 to 131:=0;
type intg is array (78 downto 0, 130 downto 0) of integer range 0 to 1751998;--no double??
signal intg1 : intg;
integral :process (clka,finished,finished1)
variable tempo: integer range 0 to 1751998;
begin
if clka'event and clka = '1' then
if finished="1" and finished1="0" then
if i1_1 < 78 and j1_1 <130 then
j1_1<=j1_1+1;
elsif j1_1=130 and i1_1<78 then
j1_1<=0 ;
i1_1<=i1_1+1;
elsif j1_1<130 and i1_1=78 then
j1_1<=j1_1+1;
elsif j1_1=130 and i1_1=78 then
finished1<="1";
end if;
tempo:= to_integer(unsigned('0' & img1(i1_1,j1_1)));
if i1_1-1>=0 then
tempo:=intg1(i1_1-1,j1_1)+tempo;
end if;
if j1_1-1>=0 then
tempo:=intg1(i1_1,j1_1-1)+tempo;
end if;
if i1_1-1>=0 and j1_1-1>=0 then
tempo:=tempo-intg1(i1_1-1,j1_1-1);
end if;
intg1(i1_1,j1_1)<=tempo;
end if;
end if;
end process;
我正在尝试同时访问intg1,合成正在进行中。 这段代码用于从二维数组中获取整数图像。
答案 0 :(得分:0)
代码中存在功能和综合问题。
功能问题:
finished1
仅在此过程中被'1'
驱动,但从未被'0'
驱动,因此如果初始值为'0'
,那么此过程中的操作只能在上电后执行一次,因为finished1
的{{1}}值会因进程启用条件而禁止进一步更新。
'1'
和i1_1
是在流程开始时被驱动的信号,然后在流程的后期使用,但由于信号,使用j1_1
分配的值在下一个过程评估之前不可用。这是故意的吗?
使用模拟器确保正确的功能,这可以在合成之前完成。
综合问题:
<=
是一张至少有79 * 131&gt;的表格。 10个K条目,每个log2(1751999)&lt; = 18位,因此是一个非常大的表。该设计需要在表中进行异步查找,因为没有额外的周期(时钟边沿)可从索引的新值获得,例如intg1
,直到根据表查找生成进程的输出。大型表中的异步查找需要巨大的多路复用网络,这可能是合成时间长的原因。并且基于不同的索引值甚至多次执行此查找。
次要:i1_1
,并且流程的敏感度列表中不需要finished
,因为这是一个由finished1
计时的流程。
以上问题列表可能不完整。
要修复表查找问题(第一个合成问题),请使用循环进行管道式设计,例如:
生成索引值clka
等
i1_1
表格查找
生成中级intg1
,并更新tempo
。
当前设计在单个周期中执行步骤2.和3.因此无法在表中进行同步查找,因为周期中只有一个时钟边沿,这用于写回到intg1
表。因此,通过在两个周期中分割查找和写回操作,可以使用时钟边沿来读取表(同步读取)和写入表。基于典型FPGA中的可用硬件资源,使用时钟边沿的这种同步读取更加有效,因为它们包含类似于intg1
表的大型同步RAM,因此实现将更小且更快。同步intg1
查找是通过简单地添加一个时钟进程来完成的,其中信号由基于所需索引值的intg1
输出直接驱动。必须进行所有必需的读取,然后后续过程可以确定实际使用的读取值中的哪一个。
具体的管道实施必须适应设计要求。