VHDL LOOP循环问题

各位高手,下面是我编的程序的一部分,我在进程中用了三个loop,为什么会报这样一个错误Error (10536): VHDL Loop Statement error at G.vhd(45): loop must terminate within 10,000 iterations

下面是我程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity G is
port(clk : in std_logic;
data_out : out std_logic);
end G;

architecture one of G is
signal count:integer range 0 to 90 :=0;
signal cnt:integer range 0 to 1500 :=0;
signal data_r:std_logic_vector(7 downto 0);
signal data_g:std_logic_vector(7 downto 0);
signal data_b:std_logic_vector(7 downto 0);
signal num_r:integer range 0 to 8 :=0;
signal num_g:integer range 0 to 8 :=0;
signal num_b:integer range 0 to 8 :=0;

begin
p1:process(clk)
begin
if clk'event and clk='1' then
if count<90 then
count<=count+1;
else
count<=0;
end if;

if cnt<1500 then
cnt<=cnt+1;
else
cnt<=0;
end if;
end if;
end process p1;

p2:process(count,cnt,data_r,data_g,data_b,num_r,num_g,num_b)
begin
data_r<="11111111";
data_g<="00000000";
data_b<="00000000";

L1:loop
if data_r(num_r)='1' then
case count is
when 0 to 60 => data_out<='1';
when 61 to 90 => data_out<='0';
end case;
else
case count is
when 0 to 30 => data_out<='1';
when 31 to 90 => data_out<='0';
end case;
end if;
num_r<=num_r+1;
exit L1 when num_r=8;
end loop;

L2:loop
if data_g(num_g)='1' then
case count is
when 0 to 60 => data_out<='1';
when 61 to 90 => data_out<='0';
end case;
else
case count is
when 0 to 30 => data_out<='1';
when 31 to 90 => data_out<='0';
end case;
end if;
num_g<=num_g+1;
exit L2 when num_g=8;
end loop;

L3:loop
if data_b(num_b)='1' then
case count is
when 0 to 60 => data_out<='1';
when 61 to 90 => data_out<='0';
end case;
else
case count is
when 0 to 30 => data_out<='1';
when 31 to 90 => data_out<='0';
end case;
end if;
num_b<=num_b+1;
exit L3 when num_b=8;
end loop;

if num_b=8 then
case cnt is
when 0 to 1500 => data_out<='0';
end case;
end if;

end process p2;
end one;

第1个回答  推荐于2018-05-06
因为loop中计数值的数据类型必须是“变量”。应该把num_r,num_g,num_b的数据类型改为变量。虽然可能楼主看不到。
第2个回答  2011-05-14
建议你在把VHDL的语法看看再自己改吧,不仅仅是一个LOOP 的问题,还有其他的的语句都是VHDL不支持的

例如:
case count is
when 0 to 60 => data_out<='1';
when 61 to 90 => data_out<='0';
end case;

这个 WHEN 0 TO 60追问

WHEN 0 to 60为何不行?,我是延时用的,除去loop那些编译完全通过的。我的板子频率50MHZ,也就是1clk为0.02纳秒,when 0 to 60刚好是记了61个数,也就是0.02*61纳秒,这是给另外一个芯片的时序输入,下板验证完全可以,芯片接收时序完全正确,可以正常工作

追答

你说能用那就用吧,我孤陋寡闻了

本回答被提问者和网友采纳
第3个回答  2011-05-14
你这问题大的去了....乱七八糟,从哪你复制来的啊?
LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.ALL ;
USE IEEE.STD_LOGIC_UNSIGNED.ALL ;
。。。
。。。
后面也是一片错,输入输出端口一个都没定义,完全乱的.....
追问

这个程序是我自己写,请不要怀疑我是抄的,只是我一直用惯了C,现在编VHDL难免有点C的倾向,为什么说我输入输出端口一个都没定义?那我在实体里不是定义了输入是个时钟信号,输出也是std_logic了吗?

VHDL LOOP循环问题
因为loop中计数值的数据类型必须是“变量”。应该把num_r,num_g,num_b的数据类型改为变量。虽然可能楼主看不到。

【vhdl】while loop循环语句的问题
VHDL综合器不支持无法事先确定循环次数的LOOP语句。因此,while loop循环语句不可综合。如果你用的开发环境是编译与综合集成在一起的话,则不要用while loop循环语句。改成FOR num IN ? DOWNTO 0 LOOP的形式。

vhdl中for loop的问题
在每个clk的上升沿,如果ena='1'的话,for循环体都会被仿真4次,Q(3)~Q(0)都会被赋值为'1'。

vhdl loop 循环 如果起始值大于终止值
在VHDL中,如果LOOP语句中起始值大于终止值,应当采用"起始值 DOAWNTO 终止值"的表示形式,否则不会仿真循环体中的语句。

VHDL运行错误:loops other than 'for loops' are not supported._百度知...
报错含义:不支持非“for loops”。因此改成for loops循环。for n in 0 to 7 loop temp := temp xor a(n);end loop;y<= temp;

关于VHDL元件例化语句port map语法报错的问题
VHDL里面的循环只能用在process里面吧,因为loop循环是顺序语句,顺序语句是用在进程里面的 你可以在toubi中设一个使能端口,然后在进程里面循环,通过控制使能端口来控制toubi的使用,,,

vhdl中while-loop语句实现奇偶校验时其中有条语句如何解释tmp:=tmp...
假设当i=1的时候,a(1)=1,则有temp:=temp xor a(1):=1 xor 1:=0;此时temp=0;当i=2的时候,a(2)=1,则有temp:=temp xor a(2):=0 xor 1:=1;此时temp=1;……依次类推。

关于VHDL元件例化语句port map语法报错的问题
十进制计数、器蜂鸣报警模块、译码器模块、数据选择模块、六进制计数器。。。我是想说,这些计数器和模块FPGA元件库中是没有的,这些计数器和模块你必须先设计,即设计文件或实体,再将这些预先设计好的设计实体定义为一个元件,然后才例化

VHDL中loop语句的问题,急求!!!1
你这个程序怎么看都像是C写法,硬件描述语言完全不是这么用的。。。如果是希望count增加到10就产生一个信号的话可以直接写成 if( d1='0')then if(count=10)then count<=(others=>'0');temp<='1';else count<=count+1;temp<='0';end if;end if;

vhdl中loop语句
你这不对,感觉逻辑很混乱,要不你说说你想要实现啥功能,我再帮你看看 比如说在进程里面你一开始就让 LL<="0000";结果就是每执行一次它就会被置0,那们后面的操作就没法进行了,还有对Q1的赋值也一样

相似回答