我希望有一个循环来运行我的代码的所有行,并且还运行所有行的每个位置。我的问题是选择循环将运行的行,并且我希望有一个简单的方法来做到这一点,而不是逐个编写每一行,因为最终的代码将有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;
到目前为止我做了什么,但没有成功:
ARCHITECTURE main OF lshift IS SIGNAL condition1:boolean;信号勇气: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;
结束主;
这个答案的目的是证明通过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)
,其中'iis a constant using 'j
来自内循环 - red_buffer(i)(j)
。
请注意,j
参数的范围与lbuffer
元素子类型的子类型的索引范围不匹配,这里与RED_Buffer1
到RED_Buffer5
的子类型相同。这意味着原始代码的潜在语义问题,其目的在此不明确。原始代码中唯一的提示来自linha_cond
,其中linha表示葡萄牙语或加泰罗尼亚语中的行,表示j
用于在“行”内索引。
原始代码失败有两个原因
首先,不能在VHDL中内联声明对象。 for循环参数是从隐式声明中动态阐述的,循环参数仅在循环语句的语句序列中可见。语法不允许其他对象声明。
其次,对象声明的名称在标识符列表中传达,该标识符列表由一个或多个标识符组成,这些标识符是不能以编程方式操作的词汇元素(词汇)。
问题代码的其他语义问题
不经过时间的output
任务似乎没有用。
进程语句是一个独立执行的并发语句,其中包含对同一信号output
的赋值的循环语句将覆盖output
元素的投影输出波形,而不会有任何间隔时间。
对于任何特定的模拟时间,投影输出波形队列中只有一个条目。模拟周期包括信号更新,然后是对信号更新敏感的任何过程的恢复和后续暂停。目的是在使用顺序语句描述行为时模拟硬件中的并行性。
这意味着如果展开的循环中的任何if语句条件评估为TRUE,output
将更新为值“01”。这可能不是预期的行为(没有来自原始海报的更多信息)。
另请注意,没有output
赋值给不同的值,也没有默认值或其他赋值。对于合成,这将代表output
的延迟,直到首次发现'1'。
在这两种情况下,这都指的是output
的隐式锁存器。
如果不知道它应该如何工作就无法解决示例代码的这个问题,迄今为止在Stackoverflow上显示的唯一提示是需要10K +信誉才能访问的question deleted by the user(其他人将看到aPage not found
消息,请参阅revision 1 )。
从编程语言或脚本语言传达的概念通常也不会移植到硬件描述语言,这些语言通常是自我引用的正式符号(在IEEE Std 1076,VHDL语言参考手册中),需要灌输或持续学习。 HDL通常在行为上和结构上描述硬件,而不是程序等效。