[理论]:VHDL-For循环可能还是只是一个简单的计数器?

[理论]:VHDL-For循环可能还是只是一个简单的计数器?,vhdl,fpga,Vhdl,Fpga,假设我有一个输入 inputData : in std_logic_vector(63 downto 0) 目前,我处理来自inputData的所有8个数据字节。 我有一个处理数据的fsm。 例如: State A, State B, State C for processing inputData(7 downto 0) again State A, State B, State C for processing inputData(15 downto 8) . . . State A

假设我有一个输入

inputData : in std_logic_vector(63 downto 0)
目前,我处理来自inputData的所有8个数据字节。 我有一个处理数据的fsm。 例如:

State A, State B, State C for processing inputData(7 downto 0) 
again 
State A, State B, State C for processing inputData(15 downto 8) 
.
.
.
State A, State B, State C for processing inputData(63 downto 56) 
At the end I go throw State D, E and F...
现在我想让它更灵活。 为了实现这一点,我现在有两个输入:

inputData : in std_logic_vector(63 downto 0)
dataLength: in std_logic_vector(3 downto 0)
现在我可能只有3个字节的输入数据需要处理

例如:

State A, State B, State C for processing inputData(7 downto 0)
wait a little bit and then again
State A, State B, State C for processing inputData(15 downto 8)
wait a little bit and then again
State A, State B, State C for processing inputData(23 downto 16)
wait a little bit and then again
At the end I go throw State D, E and F...
我应该或者可以使用For语句,还是应该使用一个简单的计数器

当我想使用For语句时,执行以下操作是否正确? 伪代码:

process (clk)
begin
    for I in 0 ... dataLength loop
        if(I not dataLength) then
Go though State A,B,C with dataByte I
else
Go though State A,B,C with dataByte I
and then through State D, E, F and then break ... 
end if
    end loop;
end process;

是,您可以通过两种方式使用for循环:

如果数据长度在编译时已知(例如,通用常量),则可以使用构造:
for I in 0 to datalength-1 GENERATE

如果数据长度在运行期间可以更改,则需要使用:
for I in 0 to datalength-1循环

请注意,因为我使用了“datalength-1”,您不需要检查if(我不是datalength),因为您永远不会使用实际的datalength


我希望这能回答你的问题。

答案取决于你想要实现什么。我不是指一般的计算,而是更多的是希望什么样的周期计时

解决方案1:
每次计算需要1个时钟周期,等于一个FSM状态。那么你要么需要尽可能多的FSM州。这不是一种非常通用的方法,因为更改输入宽度需要更多固定的编码状态

更好的解决方案是一个计数器,它给出:
A.处理输入数据的索引 B处理所有输入字节后离开当前FSM状态的条件

解决方案2:

如果所有数据都可以在一个时钟周期内处理(注意由此产生的最大延迟),那么您可以使用
来处理。。循环
语句,并在一个时钟周期/FSM状态下展开所有计算。

我不明白“
状态A、状态B、状态C用于处理
”和“
结束时,我抛出状态D、E和F”是什么意思。因此,我发现很难理解您的问题。据我所知,您不能使用
for
循环来进行顺序处理。所以我想说你必须使用计数器。是的,很抱歉问这个问题。我是VHDL新手,并且教我for语句的工作原理类似于c或java中的for循环。@A.Kieffer然后你就忘记了(组合)语句,正如Renato在回答中提到的那样。@Mansour正在寻找的是一种在他的状态
A、B和c
之间循环任意次数的方法。我看不出用
generate
创建FSM的任何方法,实际上,一个循环需要为合成定义静态边界。不能有基于信号值的界限。