我希望有一个循环运行我的代码的所有行,并且还运行所有行的每个位置。 我的问题是在选择要运行循环的行,而我想以一种简单的方式来做到这一点,而不必使每一行都一一写入,导致最终代码将扫描66行。
希望你能帮助我。
此代码的实体将有66行,但是我现在正在测试这10行:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity lshift is
port( RED_Buffer1 : in std_logic_vector(6 downto 0);
RED_Buffer2 : in std_logic_vector(6 downto 0);
RED_Buffer3 : in std_logic_vector(6 downto 0);
RED_Buffer4 : in std_logic_vector(6 downto 0);
RED_Buffer5 : in std_logic_vector(6 downto 0);
IR_Buffer1 : in std_logic_vector(6 downto 0);
IR_Buffer2 : in std_logic_vector(6 downto 0);
IR_Buffer3 : in std_logic_vector(6 downto 0);
IR_Buffer4 : in std_logic_vector(6 downto 0);
IR_Buffer5 : in std_logic_vector(6 downto 0);
output : out bit_vector(1 downto 0));
end lshift;
到目前为止,我已经做过但没有成功的事情:
lshift IS的架构主要 SIGNAL条件1:布尔值; 信号勇气:std_ulogic;
开始
PROCESS(IR_Buffer5)
BEGIN
FOR I IN 1 TO 5 LOOP
FOR J IN 1 TO 5 LOOP
CONSTANT linha_cond : string(1 to 12) := string(("RED_Buffer") && I);
IF (linha_cond(J) = '1') THEN
output <= "01";
END IF;
END LOOP;
END LOOP;
END PROCESS;
END main;
答案 0 :(得分:0)
此答案的目的是演示索引RED_Buffer1
到RED_Buffer5
的子元素值。如果不透露代码的目的,这很容易证明是一个XY Problem问题。
虽然可以将RED_Buffer1
到RED_Buffer5
整理成一个可以按如下所示进行索引的值,但也存在其他问题。
library ieee;
use ieee.std_logic_1164.all;
entity lshift is
port (
red_buffer1: in std_logic_vector (6 downto 0);
red_buffer2: in std_logic_vector (6 downto 0);
red_buffer3: in std_logic_vector (6 downto 0);
red_buffer4: in std_logic_vector (6 downto 0);
red_buffer5: in std_logic_vector (6 downto 0);
ir_buffer1: in std_logic_vector (6 downto 0);
ir_buffer2: in std_logic_vector (6 downto 0);
ir_buffer3: in std_logic_vector (6 downto 0);
ir_buffer4: in std_logic_vector (6 downto 0);
ir_buffer5: in std_logic_vector (6 downto 0);
output: out bit_vector (1 downto 0)
);
end entity lshift;
architecture indexed_array of lshift is
signal condition1: boolean;
signal valor: std_ulogic;
type lbuffer is array (1 to 5) of std_logic_vector (6 downto 0);
signal red_buffer: lbuffer;
begin
red_buffer <= (red_buffer1, red_buffer2, red_buffer3, red_buffer4,
red_buffer5);
process (red_buffer)
begin
for i in 1 to 5 loop
for j in red_buffer'range loop
if red_buffer(i)(j) = '1' then
output <= "01";
end if;
end loop;
end loop;
end process;
end architecture indexed_array;
如何在此处实现索引
声明具有必需数量的元素和必需元素子类型的复合类型(lbuffer
)。这是可能的,因为端口RED_Buffer1
至RED_Buffer5
的声明共享一个公共子类型指示。分配给类型lbuffer
的对象的元素将是兼容的,并且在目标表达式和右手表达式之间具有匹配的元素。
声明带有类型标记red_buffer
的信号lbuffer
。
在体系结构语句部分中的并发信号分配语句中,从汇总中对信号进行了并发分配。集合中的关联是位置性的。它可以轻松使用命名关联:
-- red_buffer <= (red_buffer1, red_buffer2, red_buffer3, red_buffer4,
-- red_buffer5);
red_buffer <= (1 => red_buffer1, 2 => red_buffer2, 3 => red_buffer3,
4 => red_buffer4, 5 => red_buffer5);
集合的类型来自上下文,这里的赋值语句中red_buffer
的子类型为lbuffer
。
通过索引名称(red_buffer
)选择合成red_buffer(i)
的选定元素。 red_buffer(i)
的子元素是通过使用索引名称选择的,其中名称red_buffer(i)
其中“ i is a constant using 'j
来自内部循环-red_buffer(i)(j)
。
请注意,j
参数的范围与lbuffer
元素子类型的子类型的索引范围不匹配,此处与RED_Buffer1
到RED_Buffer5
的子类型相同。这表示原始代码还有一个潜在的语义问题,其目的在这里并不清楚。原始代码中出现的唯一提示来自linha_cond
,其中linha表示葡萄牙语或加泰罗尼亚语中的行,指示j
用于在“行”中建立索引。
原始代码失败有两个原因
首先,不能在VHDL中内联声明对象。 for循环参数是通过隐式声明动态构造的,该循环参数仅在loop语句的语句序列中可见。该语法不允许其他对象声明。
第二个对象声明的名称在一个标识符列表中传达,该标识符列表由一个或多个标识符组成,这些标识符是无法以编程方式操作的词法元素(词素)。
问题代码的其他语义问题
没有时间分配给output
的分配似乎没有用。
process语句是一个独立执行的并发语句,其中包含对同一信号output
的赋值的循环语句将覆盖output
元素的投影输出波形任何介入的时间流逝。
在任何特定的仿真时间内,预计的输出波形队列中只有一个条目。仿真周期包括信号更新,恢复和随后暂停任何对信号更新敏感的过程。目的是在使用顺序语句描述行为时在硬件中模拟并行性。
如果展开循环中的任何if语句条件的求值为TRUE,这将意味着output
将更新为值“ 01”。这可能不是预期的行为(原始海报没有提供更多信息)。
还请注意,没有output
分配给其他值,也没有默认值或分配了其他值。对于综合而言,这将表示output
的保持延迟,直到首次找到“ 1”。
在两种情况下,这都是指output
的隐式锁存器。
在不知道示例代码工作原理的情况下无法解决此问题,到目前为止,在Stackoverflow上显示的唯一提示是question deleted by the user,要求获得10K以上的信誉(其他将会看到Page not found
消息,请参阅revision 1)。
从编程或脚本语言传达的概念通常也不会移植到硬件描述语言,这些语言通常是自引用定义的形式化表示法(在此处为IEEE Std 1076,VHDL语言参考手册),需要灌输或不断学习。 HDL通常在行为和结构上都不是通过程序等效性来描述硬件。