Почему моя пользовательская инструкция nios выполняется дважды? - PullRequest
0 голосов
/ 11 июля 2019

У меня есть пользовательская инструкция NIOS2, написанная на VHDL, для связи с моими самодельными компонентами ПЛИС.Он берет данные и данные из пользовательской инструкции и превращает ее в своего рода коммуникационную шину с адресом и строкой данных.Оба имеют высокий уровень ровно для 1 тактового цикла, а результат считывается из чтения через 2 такта позже.До сих пор это работало очень хорошо, чтение и запись данных с этой шиной работали нормально.Тем не менее, теперь у меня есть сущность, которую нужно записать точное количество раз.(для этого нужно определенное количество байтов данных) Здесь все идет совсем не так.Так или иначе, каждое действие записи обрабатывается дважды, поэтому все получаемые данные перепутаны.

При моделировании пользовательской инструкции с помощью testbench в modelsim она выполняет именно то, что я ожидаю.То же самое, когда я использую пользовательскую инструкцию как часть большей тестовой системы.Я написал тестовый стенд таким образом, чтобы форма сигнала данных в пользовательской инструкции точно совпадала с формой сигнала в инструкции по пользовательской инструкции NIOS2.

Однако в тестах в системе я подтвердил, что каждое действие записи являетсякак-то активен в течение 2 тактов.Я сделал это, создав сумматор, который добавляет 1 в регистр каждый такт, который соответствует его адресу.Это связано со светодиодами.Это показывает, что при каждом действии записи регистр увеличивается на 2.

Я не могу найти объяснение.

elsif rising_edge(clk) then
            COM_Address <= (others => '0'); --default
            COM_CPU_WRITE_DATA <= (others => '0'); --default
            if clk_en = '1' then                
                case state is
                    when s_idle =>

                        if start = '1' then -- if the cpu says to start, immediately send address and data, else keep idle.
                            result <= (others => '0');
                            done <= '0';
                            COM_Address <= dataa(15 downto 0); -- send out the address and data provided by the cpu
                            COM_CPU_WRITE_DATA <= datab;
                            state <= s_wait_one;
                        else
                            state <= s_idle;
                            result <= (others => '0');
                            done <= '0';
                            COM_Address <= (others => '0');
                            COM_CPU_WRITE_DATA <= (others => '0');
                        end if;
                    when s_wait_one => -- wait one tick, to allow the slave to put data on the read lines.
                        result <= (others => '0');
                        done <= '0';
                        COM_Address <= (others => '0'); --Address and data can be put back to zeros. Only wait for reading, writing is done by now.
                        COM_CPU_WRITE_DATA <= (others => '0');
                        state <= s_reading_done;

Это часть кода VHDL из пользовательской инструкции nios.Как видите, строки COM_Address и COM_CPU_WRITE_DATA имеют высокий уровень только для одного такта.Я даже вытянул их на 0 в качестве значения по умолчанию для каждого тактового цикла.

unsigned com_bus_simple(unsigned dataa, unsigned datab)
{
    unsigned readdata;
    readdata = (unsigned)ALT_CI_NIOS_FPGA_COM_0(dataa, datab);
    return readdata;
}

Это функция, используемая для выполнения действий записи (или чтения).Он заключен в несколько уровней функций для каждого драйвера объекта, но в основном это то, что записывает в коммуникационную шину в FPGA

Нет сообщений об ошибках, он просто отлично компилируется и имитирует, за исключением того, чтохотя я ожидаю (и имитирую), что адресная строка будет высокой для одного такта, она как-то высока для двух.

РЕДАКТИРОВАТЬ: Из-за разочарования я полностью переписал пользовательскую инструкцию, теперь как расширенную инструкциюс конкретной целью убедиться, что он не может поддерживать высокий адрес и строки данных более одного цикла на инструкцию.Теперь этот работает отлично.Я до сих пор не знаю, что заставило старый потерпеть неудачу, но новый работает.Так .. ууу?Если кому-то интересно, могу выложить всю новую инструкцию.

...