循环进行直线和直线位置

时间:2019-04-27 15:48:30

标签: vhdl

我希望有一个循环运行我的代码的所有行,并且还运行所有行的每个位置。 我的问题是在选择要运行循环的行,而我想以一种简单的方式来做到这一点,而不必使每一行都一一写入,导致最终代码将扫描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;

1 个答案:

答案 0 :(得分:0)

此答案的目的是演示索引RED_Buffer1RED_Buffer5的子元素值。如果不透露代码的目的,这很容易证明是一个XY Problem问题。

虽然可以将RED_Buffer1RED_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_Buffer1RED_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_Buffer1RED_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通常在行为和结构上都不是通过程序等效性来描述硬件。