реклама на сайте
подробности

 
 
> Осваиваю Verilog, простейший модуль, Простой модуль, но правильный ли?
sergeeff
сообщение May 1 2010, 12:35
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Коллеги!

Пришлось осваивать азы Verilog'a. Простейший модуль. К ARM9 подсоединен FPGA Spartan3. Он должен вырабатывать два положительных импульса чтения/записи в контроллер дисплея. На fpga поступают cs3 от ARM (0x20000000), 16 младших разрядов адреса, системные wr и rd. Модуль сгенерировал, в fpga - записал. Запустил простенький тест: в цикле записываю информацию по адресу 0x20009001 байт данных). Смотрю осциллографом - в fpga проскакивают импульсы на выходе disp_rd, хотя никакого чтения по адресам 0х2000900х не производится. Что неправильно написано в veriloge?

Код
module decoder(adr, n_cs3, n_wr, n_rd, disp_wr, disp_rd);
   input adr[15:0];
   input n_wr;
   input n_rd;

   output disp_wr;
   output disp_rd;

   assign disp_wr = (adr[15:4] == 12b'1001_0000_0000) & ~n_cs3 & ~n_wr;
   assign disp_rd = (adr[15:4] == 12b'1001_0000_0000) & ~n_cs3 & ~n_rd;
endmodule
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
dxp
сообщение May 1 2010, 13:16
Сообщение #2


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(sergeeff @ May 1 2010, 19:35) *
Смотрю осциллографом - в fpga проскакивают импульсы на выходе disp_rd, хотя никакого чтения по адресам 0х2000900х не производится. Что неправильно написано в veriloge?

Код
module decoder(adr, n_cs3, n_wr, n_rd, disp_wr, disp_rd);
   <...>
   assign disp_wr = (adr[15:4] == 12b'1001_0000_0000) & ~n_cs3 & ~n_wr;
   assign disp_rd = (adr[15:4] == 12b'1001_0000_0000) & ~n_cs3 & ~n_rd;
endmodule

Ваш модуль описывает чисто комбинационную логику. По этой причине сигналы disp_wr и disp_rd содержат "иголки", возникающие из-за гонок при прохождении сигналов через логику. Основным способом борьбы с этим является использование регистров и синхронного дизайна. Ваш модуль должен быть похож на это:
Код
module decoder(clk, reset, adr, n_cs3, n_wr, n_rd, disp_wr, disp_rd);
   <...>
    reg disp_wr;
    reg disp_rd;

    always @(posedge clk) begin
        if(reset) begin
            disp_wr <= 0;
            disp_rd <= 0;
        end
        else begin
            disp_wr <= (adr[15:4] == 12b'1001_0000_0000) & ~n_cs3 & ~n_wr;
            disp_rd <= (adr[15:4] == 12b'1001_0000_0000) & ~n_cs3 & ~n_rd;
        end
    end
endmodule


Т.е. вам нужно еще завести два глобальных системных сигнала - клок и сброс.

В вышеописанном примере правые части выражения будут так же давать на выходе "иголки" при переключении логики, но важно, чтобы "иголок" не было в момент прихода фронта клока. Если по времянкам все укладывается в требования, то все процессы переключения в логике успеют завершиться при приходе клока.

Нужно помнить и учитывать, что такое решение дает задержку. Но еще важнее то, что это далеко не полное решение. Входящие сигналы от процессора (шина и сигналы управления) являются асинхронными по отношению к внутреннему клоку ПЛИС, поэтому прямо вот так это использовать нельзя - будут глюки из-за метастабильности. Все эти сигналы (сигналы управления в обязательном порядке) необходимо пропустить через синхронизаторы. Это еще даст задержку, что тоже нужно учитвать. smile.gif Простейшая реализация синхронизатора - цепочка из двух последовательно соединенных триггеров.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 22:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01391 секунд с 7
ELECTRONIX ©2004-2016