VHDL - получение неверных данных из массива записей - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь получить данные из константы массива записей. Вот что я имею в своей текущей реализации:

CONSTANT Total_Feeds : INTEGER := 12;

TYPE Feed IS RECORD
        s_Divisor       : INTEGER RANGE 0 TO 255;
        Display_Text    : STRING(1 TO 8);
    END RECORD Feed;

TYPE Feed_Array IS ARRAY (0 TO Total_Feeds -1) OF Feed;

CONSTANT FEED_INFO : Feed_Array := (
        (225,"""0.02mm"""),
        (112,"""0.04mm"""),
        (75,"""0.06mm"""),
        (56,"""0.08mm"""),
        (45,"""0.10mm"""),
        (38,"""0.12mm"""),
        (32,"""0.14mm"""),
        (28,"""0.16mm"""),
        (25,"""0.18mm"""),
        (23,"""0.20mm"""),
        (20,"""0.22mm"""),
        (19,"""0.24mm""")
    );

------lower section of menu fsm----------
    process(clk, reset)
    begin
        if (reset = '1') then
            menu_pr <= start;
            feed_index_pr <= 2;
            ks_divisor_pr <= 0;
        elsif (rising_edge(clk)) then
            menu_pr <= menu_nx;
            feed_index_pr <= feed_index_nx;
            ks_divisor_pr <= ks_divisor_nx;
        end if;     
    end process;

------upper section of menu fsm----------
    process (menu_pr, menu_on_flag, delayed_select, delayed_up, 
                delayed_down, delayed_left, feed_index_pr, thread_index_pr, 
                delayed_right, menu_left_flag, menu_right_flag, menu_up_flag, menu_down_flag)
    variable feedindex : integer range 0 to total_feeds;
    begin       
        case menu_pr is
            when start =>
                feedindex := feed_index_pr;

                feed_index_nx <= feedindex;
                ks_divisor_nx <= FEED_INFO(feedindex).s_Divisor;
                menu_nx <= feed_left;
            when feed_left =>       
                feedindex := feed_index_pr;

                feed_index_nx <= feedindex;
                ks_divisor_nx <= FEED_INFO(feedindex).s_Divisor;


                if (menu_on_flag = '1' and delayed_right = '1' and menu_right_flag = '1') then
                    menu_nx <= feed_left_right;
                else
                    menu_nx <= feed_left;
                end if; 
             when feed_left_right =>
                feedindex := feed_index_pr + 1;
                if (feedindex > (Total_Feeds - 1)) then
                    feedindex := 0;
                    feed_index_nx <= feedindex;
                    ks_divisor_nx <= FEED_INFO(feedindex).s_Divisor;
                    menu_nx <= feed_left;
                else
                    feed_index_nx <= feedindex;
                    ks_divisor_nx <= FEED_INFO(feedindex).s_Divisor;
                    menu_nx <= feed_left;
                end if; 
             end case;
    end process;
rate_out <=ks_divisor_pr;

Состояния добавляются после успешной проверки с помощью симуляции.

Я пытаюсь получить s_divisor для каждой записи из процесса, используя следующая команда:

ks_divisor_nx <= FEED_INFO(feedindex).s_Divisor; Где feedindex меняется с 0 to Total_Feeds -1, а ks_divisor равно integer range 0 to 255.

Результаты моделирования показывают корректный вывод для всех назначений, кроме записей с индексом 0 , 1 и 2. Результаты симуляции показывают значения: 11, 48 и 33 соответственно.

результаты моделирования

Любая помощь очень ценится. Благодаря.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...