Vhdl 生成语句中的信号或变量计数器

Vhdl 生成语句中的信号或变量计数器,vhdl,hdl,Vhdl,Hdl,我对生成语句有问题。我正在生成一个管道体系结构,基本问题是除了for索引之外,我还需要另一个计数器或变量: architecture behav of blockPipelineCordic is constant total: integer := stepNumber + stepNumber/pipeStep; signal signVector: std_logic_vector( (stepNumber - 1) downto 0); signal lx: st

我对生成语句有问题。我正在生成一个管道体系结构,基本问题是除了for索引之外,我还需要另一个计数器或变量:

architecture behav of blockPipelineCordic is
    constant total: integer := stepNumber + stepNumber/pipeStep;
    signal signVector: std_logic_vector( (stepNumber - 1) downto 0);
    signal lx: std_logic_vector( ((total + 1)*dataSize - 1) downto 0);
    signal ly: std_logic_vector( ((total + 1)*dataSize - 1) downto 0);
    signal signCounter: integer := stepNumber - 1;
begin

stepGen:
for i in (total - 1) downto 0 generate
    begin

      signCounter <= signCounter - 1 when ((total - i) mod (pipeStep + 1) /= 0) else signCounter;

        stepGen0: if( (total - i) mod (pipeStep + 1) /= 0 ) generate
        begin U1: entity work.cordicStep(behav)
        generic map ((totalStepNumber - 1) - i,dataSize)
        port map(signVector(signCounter),lx(((i+2)*dataSize-1) downto (i+1)*dataSize),ly(((i+2)*dataSize-1) downto (i+1)*dataSize),lx(((i+1)*dataSize-1) downto i*dataSize),ly(((i+1)*dataSize-1) downto i*dataSize));
        end generate stepGen0;

        stepGen1: if( (total - i) mod (pipeStep + 1) = 0 ) generate
        begin U2: entity work.registerModule(behav)
        generic map (dataSize)
        port map(clk,lx(((i+2)*dataSize-1) downto (i+1)*dataSize),lx(((i+1)*dataSize-1) downto i*dataSize));
        end generate stepGen1;

        stepGen2: if( (total - i) mod (pipeStep + 1) = 0 ) generate
        begin U3: entity work.registerModule(behav)
        generic map (dataSize)
        port map(clk,ly(((i+2)*dataSize-1) downto (i+1)*dataSize),ly(((i+1)*dataSize-1) downto i*dataSize));
        end generate stepGen2;

end generate stepGen;
. . .
blockPipelineCordic的架构行为是 常量合计:整数:=步数+步数/管道步数; 信号符号向量:标准逻辑向量((步数-1)降到0); 信号lx:std_逻辑_向量((总计+1)*数据大小-1)降到0); 信号ly:std_逻辑_向量(((总计+1)*数据大小-1)降到0); 信号信号计数器:整数:=步数-1; 开始 继父: 对于i(总计-1)下至0生成 开始
signCounter对不起,你不能使用那样的中间信号

您可以编写一个函数,给定值
i
将返回正确的
signCounter
,而无需存储中间值


您可以尝试在generate中声明信号,但我认为它不会得到您想要的(信号最终会有
总数
个驱动程序,而不是在循环过程中有几个不同的值。)generate用于“生成静态内容”,不是动态的东西。

虽然我在遵循您的代码时遇到了一些问题,但似乎
signCounter
可以从
I
派生出来。如果运行从0生成到total-1,那么所涉及的数学将更容易理解

或者尝试将其拆分为两个generate语句,第一个
从0到stepNumber-1
,用于生成
cordcsteps
,第二个
从0到total-1
生成
注册表模块


此外,您还可以将
stepGen1
stepGen2

组合到右侧。在您的代码中,
signCounter
被分配
total
次!加上初始化@马丁:是的,在generate的声明部分有一个信号是可以的。@wap26:是的,我不清楚-这是允许的,但它是否提供函数…太棒了,我没有考虑使用函数,非常感谢,非常有用的答案。问候您的
signCounter
已分配
total
次!请记住,所有
对于仍然在VHDL中开始的混乱代码感到抱歉;谢谢,我将尝试从中派生它,我没有尝试,因为它应该是对架构的一个小修复,不想对代码进行大的更改,而且我很容易迷失在总线大小上。问候语