我的生成语句有问题。我正在生成一个管道架构,基本问题是除了索引之外我还需要另一个计数器或变量:
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;
. . .
在第一个结构的生成中,我需要使用不同的索引来进行signVector,我创建了一个用作计数器的信号(端口映射(signVector(signCounter),lx(((i + 2)* dataSize- 1)downto)但它不能用作索引,错误是:“形式”sub“的实际(索引名称)不是静态信号名称。”
任何帮助将不胜感激:),ty
答案 0 :(得分:1)
抱歉,你不能使用这样的中间信号。
您可以编写一个函数,给定值i
将返回正确的signCounter
,而无需存储中间值。
你可以尝试在生成中声明信号,但我认为它不会让你得到你想要的东西(信号最终会有total
个驱动程序,而不是几个不同的循环期间的值。)生成用于“制作静态事物”,而不是动态事物。
答案 1 :(得分:0)
虽然我的代码存在一些问题,但似乎signCounter
可以从i
派生。如果将生成从0运行到total-1,则所涉及的数学将更容易理解。
或者尝试将其拆分为两个生成语句,第一个from 0 to stepNumber - 1
用于标记cordicSteps
,第二个from 0 to total - 1
用于生成registerModules
。
此外,您可以合并stepGen1
和stepGen2