Присвоение значений сигналам в выражениях for-generate - PullRequest
0 голосов
/ 25 апреля 2019

Я не могу понять, почему назначение сигнала для "sig2" в следующем примере не будет успешным, в то время как для "sig1" это произойдет. С нарастающим фронтом тактовой частоты «sig2» становится «X»!

В чем причина?

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
use IEEE.STD_LOGIC_UNSIGNED.all;

entity Test_tb is
end entity Test_tb;

architecture Structural of Test_tb is

    signal sig1 : std_logic_vector (3 downto 0) := (others => '0');
    signal sig2 : std_logic_vector (7 downto 0) := (others => '0');
    signal clk : std_logic := '0';

begin
    clk_generate: process is
    begin
        wait for 5 ns;
        clk <= not clk;        
    end process clk_generate;

    gen_label : for gen_indx in 0 to 3 generate
    begin
        process (clk) is 
        begin
            if clk = '1' and clk'event then
                sig1 (gen_indx) <= '1';
                for loop_indx in 0 to 1 loop
                    sig2 (gen_indx * 2 + loop_indx) <= '1';
                end loop;
            end if; 
        end process;
    end generate gen_label;

end architecture Structural;

1 Ответ

2 голосов
/ 25 апреля 2019

Это потому, что когда сигнал назначается внутри цикла for, предполагается, что драйвер влияет на ВСЕ элементы массива (или записи). Это потому, что он не может определить границы цикла for во время разработки, так как это концепция времени выполнения. Это отличается от цикла генерации, где границы могут быть определены во время разработки.

Таким образом, вам нужно удалить цикл for внутри процесса или создать сигнал, локальный для цикла генерации, который назначен внешнему sig2. например:

gen_label : for gen_indx in 0 to 3 generate
  signal local_sig  : std_logic_vector(1 downto 0);
begin
    process (clk) is 
    begin
        if clk = '1' and clk'event then
            sig1 (gen_indx) <= '1';
            for loop_indx in 0 to 1 loop
                local_sig(loop_indx) <= '1';
            end loop;
        end if; 
    end process;

    sig2(gen_indx*2+1 downto gen_indx*2)  <= local_sig;
end generate gen_label; 
...