VHDL、if语句和进程名称

VHDL、if语句和进程名称,vhdl,Vhdl,在FPGA设计中,我有两个进程来处理单个LVDS接收器的输入和输出。现在我需要这两个相同的过程同时重复8次(对于8个单独的LVDS接收器),信号名称略有不同(即sigout1与sigout0)。有什么方法可以通过for循环来实现这一点吗?以下是我的两个过程: IBUFDS_inst : IBUFDS generic map (DIFF_TERM => FALSE, IBUF_LOW_PWR => FALSE,

在FPGA设计中,我有两个进程来处理单个LVDS接收器的输入和输出。现在我需要这两个相同的过程同时重复8次(对于8个单独的LVDS接收器),信号名称略有不同(即sigout1与sigout0)。有什么方法可以通过for循环来实现这一点吗?以下是我的两个过程:

IBUFDS_inst : IBUFDS
    generic map (DIFF_TERM => FALSE,
                     IBUF_LOW_PWR => FALSE,
                     IOSTANDARD => "DEFAULT")
    port map (O => lvds_internal,
                 I => sigin0_p,
                 IB => sigin0_n);

    lvdsFlop:PROCESS(clk)
    BEGIN
        IF (clk = '1' AND clk'EVENT) THEN
            IF (reset_l = '0') THEN
                sigout0 <= '0';
            ELSE
                sigout0 <= lvds_internal;
            END IF;
        END IF;
    END PROCESS;
如果可能的话,我希望每个进程的名称也依赖于I(出于模拟目的),因此我希望使用IBUFDS_inst0、IBUFDS_inst1等。但是,上面的实现没有通过语法检查

编辑:感谢大家的帮助,这是我更新的VHDL:

    --Instantiate LVDS receivers and LVCMOS output for each channel
GEN_LVDS: FOR i IN sigout'RANGE GENERATE
BEGIN
    --Input LVDS buffer
    IBUFDS_inst : IBUFDS
    generic map (DIFF_TERM => FALSE,
                     IBUF_LOW_PWR => FALSE,
                     IOSTANDARD => "DEFAULT")
    port map (O => lvds_internal(i),
                 I => sigin_p(i),
                 IB => sigin_n(i));

END GENERATE GEN_LVDS;

--LVCMOS output flip-flop
    lvds_Flop:PROCESS(clk_fast)
    BEGIN
        IF (clk_fast = '1' AND clk_fast'EVENT) THEN
            IF (reset_l = '0') THEN
                sigout <= (others => '0');
            ELSE
                sigout <= lvds_internal;
            END IF;
        END IF;
    END PROCESS lvds_Flop;
——为每个通道实例化LVDS接收器和LVCMOS输出
GEN_LVDS:为信号输出范围内的i生成
开始
--输入LVDS缓冲区
IBUFDS_inst:IBUFDS
通用映射(DIFF_TERM=>FALSE,
IBUF_LOW_PWR=>错误,
IOSTANDARD=>“默认值”)
端口映射(O=>lvds_内部(i),
I=>sigin_p(I),
IB=>sigin_n(i));
最终生成GEN_LVDS;
--LVCMOS输出触发器
lvds_触发器:进程(clk_fast)
开始
如果(clk_fast='1'和clk_fast'事件),则
如果(reset_l='0'),则
标志“0”);
其他的

sigout您需要使用generate语句:

gen :  for i in 0 to 7 generate
  [Optional: local signals]
begin
  [...]
  my : process(...)
  begin
    [...]
  end process;
end generate;
进程的全名现在是
gen[i].my
。此外,您应该为信号使用向量,以便通过索引对其进行寻址。

IBUFDS_inst是一个标签,而不是进程名称。你不可能有它的名字取决于我,但你可以实现你想要的,你将能够区分它们

为此,sigout、sigin\u p、sigin\u n和lvds\u internal必须是std\u logic\u vector而不是std\u logic。下面是一个示例代码:

entity lvds_test is
    port map (
        clk     : in  std_logic;
        reset_l : in  std_logic;
        sigin_p : in  std_logic_vector(7 downto 0);
        sigin_n : in  std_logic_vector(7 downto 0);
        sigout  : out std_logic_vector(7 downto 0)
    );
end entity lvds_test;

architecture rtl of lvds_test is
    signal lvds_internal : std_logic_vector(sigin_p'range);
begin

LVDS_GEN: for i in lvds_internal'range generate
    IBUFDS_inst: IBUFDS
    generic map (
        DIFF_TERM    => FALSE,
        IBUF_LOW_PWR => FALSE,
        IOSTANDARD   => "DEFAULT"
    ) port map (
         O  => lvds_internal(i),
         I  => sigin_p(i),
         IB => sigin_n(i)
    );
end generate LVDS_GEN;

    lvdsFlop: process(clk)
    begin
        if rising_edge(clk) then
            if reset_l = '0' then
                sigout <= (others => '0');
            else
                sigout <= lvds_internal;
            end if;
        end if;
    end process lvdsFlop;
end architecture rtl;
实体lvds\u测试是
港口地图(
clk:标准逻辑中;
重置逻辑:在标准逻辑中;
sigin_p:in-std_逻辑_向量(7到0);
sigin_n:标准逻辑向量(7到0);
信号输出:输出标准逻辑向量(7到0)
);
终端实体lvds_测试;
lvds_测试的体系结构rtl是
信号lvds_内部:标准逻辑向量(sigin_p'范围);
开始
LVDS_GEN:对于LVDS_内部范围内的i生成
IBUFDS_inst:IBUFDS
通用地图(
DIFF_TERM=>FALSE,
IBUF_LOW_PWR=>错误,
IOSTANDARD=>“默认值”
)港口地图(
O=>lvds_内部(i),
I=>sigin_p(I),
IB=>sigin_n(i)
);
最终生成LVDS_GEN;
lvdsFlop:进程(clk)
开始
如果上升沿(clk),则
如果reset_l='0',则
标志“0”);
其他的

sigout-Yup忘记了generate关键字,谢谢你的模板。不过有一件事,尽管我的组件实例化现在被标记为gen[i].my(或者实际上是gen_LVDS[i].IBUFDS_inst,如果您阅读了我更新的代码),但我的lvdsFlop进程似乎没有连接到模拟器中的gen_LVDS。相反,它们只是与所有其他进程一起浮动在架构块中。是否依赖于模拟器?另一个提示:如果您使用ibufds和generate循环内的进程,则可以在generate循环中的generate和begin之间本地声明lvds_internal作为std_逻辑。这可以清除一些代码片段。谢谢你的建议,这正是我想要的。尽管有一个小的修正,lvdsFlop进程也应该在生成块中(因为lvds_internal现在是一个std_逻辑_向量,其赋值依赖于i)。此外,Paebbels在他的回答中建议使用“generate”关键字,但您似乎使用了“loop”,这两种语法都可以接受吗?是的,应该是“generate”,我做了更正。lvdsFlop进程并不意味着在generate语句中。由于IBUFDS不支持向量,因此需要对单个位进行生成操作。我使用的lvdsFlop在向量上运行,不需要在generate语句中。哦,还有一件事,在模拟中,我确实能够区分我的IBUFDS实例(例如LVDS_GEN(I)。IBUFDS_inst指的是第I个LVDS缓冲区),但是lvdsFlop进程都有相同的名称,它们与架构块中的所有其他进程一起浮动。有没有办法将这些进程附加到生成块?只有一个lvdsFlop进程。你仍然可以访问向量的双位。啊,现在我明白你的意思了,不需要有多个进程,因为我可以简单地在一行中分配向量。重置只需要一个sigout“0”)。
entity lvds_test is
    port map (
        clk     : in  std_logic;
        reset_l : in  std_logic;
        sigin_p : in  std_logic_vector(7 downto 0);
        sigin_n : in  std_logic_vector(7 downto 0);
        sigout  : out std_logic_vector(7 downto 0)
    );
end entity lvds_test;

architecture rtl of lvds_test is
    signal lvds_internal : std_logic_vector(sigin_p'range);
begin

LVDS_GEN: for i in lvds_internal'range generate
    IBUFDS_inst: IBUFDS
    generic map (
        DIFF_TERM    => FALSE,
        IBUF_LOW_PWR => FALSE,
        IOSTANDARD   => "DEFAULT"
    ) port map (
         O  => lvds_internal(i),
         I  => sigin_p(i),
         IB => sigin_n(i)
    );
end generate LVDS_GEN;

    lvdsFlop: process(clk)
    begin
        if rising_edge(clk) then
            if reset_l = '0' then
                sigout <= (others => '0');
            else
                sigout <= lvds_internal;
            end if;
        end if;
    end process lvdsFlop;
end architecture rtl;