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