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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Не работает модуль на verilog
Marat Zuev
сообщение May 10 2018, 12:21
Сообщение #16


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 8-05-18
Пользователь №: 103 834



Цитата(Sprite @ May 10 2018, 10:19) *
Проект Во вложении. entity - test3.qpf Собирал в Quartus II 9.1, использовал для теста встроенный симулятор (файл test3.vwf)
Ну, функциональное моделирование у Вас проходит безошибочно?
Если так, то ломающееся временное свидетельствует об асинхронщине (а она есть у Вас в модуле spi_slave), либо..
Не хотите для начала именно с асинхронщиной побороться, чтобы на примере этого проекта навсегда забыть о ней?

На всякий случай рекомендую и на метастабильность обратить внимание...


--------------------
--
С наилучшими пожеланиями, Marat.
Go to the top of the page
 
+Quote Post
Jackov
сообщение May 10 2018, 17:01
Сообщение #17


Местный
***

Группа: Участник
Сообщений: 293
Регистрация: 25-09-13
Из: Н.Новгород
Пользователь №: 78 485



Цитата(bogaev_roman @ May 10 2018, 10:49) *
to Sprite Посмотрел я на времянку и мозг отказал минут на 5 - как машина может находиться одновременно в нескольких состояниях? Там вообще мусор должен быть на моделировании - начальное состояние не определено - либо сброс добавьте, либо начальное условие при инициализации. Или это картинка не моделирования, а сигнал тап?

Квартусовский симулятор сам инициализирует все триггеры нулями, ибо разработчики ПЛИС гарантируют, что по концу конфигурирования все триггеры в ПЛИС будут сброшены. Я всё ищу такую опцию для ModelSim-а, а то запарился каждый раз сброс прописывать.

Сообщение отредактировал Jackov - May 10 2018, 17:01
Go to the top of the page
 
+Quote Post
Marat Zuev
сообщение May 10 2018, 18:57
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 8-05-18
Пользователь №: 103 834



Цитата(Jackov @ May 10 2018, 17:01) *
Квартусовский симулятор сам инициализирует все триггеры нулями, ибо разработчики ПЛИС гарантируют, что по концу конфигурирования все триггеры в ПЛИС будут сброшены.
Привязка в таких вопросах к одному производителю и его ПО не есть достойное решение.
Цитата(Jackov @ May 10 2018, 17:01) *
Я всё ищу такую опцию для ModelSim-а, а то запарился каждый раз сброс прописывать.
Может, signal_force вас спасёт? Но, по-хорошему, все триггеры, включая FSM в проекте рекомендуется заводить со сбросами
(вот какой лучше: синхронизированный асинхронный или синхронный - каждый выбирает по себе )))

Сообщение отредактировал Marat Zuev - May 10 2018, 19:00


--------------------
--
С наилучшими пожеланиями, Marat.
Go to the top of the page
 
+Quote Post
Jackov
сообщение May 10 2018, 19:40
Сообщение #19


Местный
***

Группа: Участник
Сообщений: 293
Регистрация: 25-09-13
Из: Н.Новгород
Пользователь №: 78 485



Цитата(Marat Zuev @ May 10 2018, 21:57) *
Может, signal_force вас спасёт?

Примерно так и делаю. Но всё равно ведь ручками приходится. Хотелось бы чтобы он сам по умолчанке делал.
Go to the top of the page
 
+Quote Post
Marat Zuev
сообщение May 10 2018, 20:57
Сообщение #20


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 8-05-18
Пользователь №: 103 834



Цитата(Jackov @ May 10 2018, 19:40) *
Примерно так и делаю. Но всё равно ведь ручками приходится. Хотелось бы чтобы он сам по умолчанке делал.
Вот вы снова привязываетесь к инструменту. Комильфо проект (включая testbench) - инструментонезависимый.
Пишите так, чтобы и реализация и моделирование проходили бы одинаково и в Modelsime и в Active-HDL-е и где бы то ни было....


--------------------
--
С наилучшими пожеланиями, Marat.
Go to the top of the page
 
+Quote Post
Sprite
сообщение May 11 2018, 04:32
Сообщение #21


Частый гость
**

Группа: Участник
Сообщений: 171
Регистрация: 11-05-08
Пользователь №: 37 414



Цитата(Marat Zuev @ May 10 2018, 19:21) *
Ну, функциональное моделирование у Вас проходит безошибочно?
Если так, то ломающееся временное свидетельствует об асинхронщине (а она есть у Вас в модуле spi_slave), либо..
Не хотите для начала именно с асинхронщиной побороться, чтобы на примере этого проекта навсегда забыть о ней?

На всякий случай рекомендую и на метастабильность обратить внимание...


Спасибо за дельный совет! Действительно, данные (регистр data_in[15:0]) поступавшие в модуль были несинхронизированы, поправил. По совету iosifk поставил ветку default в state-машину. Но ошибка в модуле по прежнему имеется, в железе data_out после 10-15 раза выдает неверные данные, разбираюсь дальше.
Go to the top of the page
 
+Quote Post
Marat Zuev
сообщение May 11 2018, 04:40
Сообщение #22


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 8-05-18
Пользователь №: 103 834



Цитата(Sprite @ May 11 2018, 04:32) *
Но ошибка в модуле по прежнему имеется, в железе data_out после 10-15 раза выдает неверные данные, разбираюсь дальше.
Пришлите "синхронизированный" модуль посмотреть.
Ошибка на временном моделировании так и осталась?
Кстати, а Вы умеете SignalTap-ом пользоваться?


--------------------
--
С наилучшими пожеланиями, Marat.
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение May 11 2018, 05:51
Сообщение #23


В поисках себя...
****

Группа: Свой
Сообщений: 693
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140



Зачем вообще проводить временную симуляцию ?
Это потраченное впустую уйма времени !
Проводите в Modelsim функциональное моделирование. Когда HDL описание работает как задумано, то описываете временные ограничения. И практически наверняка проект заработает сразу.
Go to the top of the page
 
+Quote Post
Sprite
сообщение May 11 2018, 06:32
Сообщение #24


Частый гость
**

Группа: Участник
Сообщений: 171
Регистрация: 11-05-08
Пользователь №: 37 414



Цитата(Marat Zuev @ May 11 2018, 11:40) *
Пришлите "синхронизированный" модуль посмотреть.
Ошибка на временном моделировании так и осталась?
Кстати, а Вы умеете SignalTap-ом пользоваться?
Моделировал в стандартном квартусовском симуляторе - ошибок нет, но при работе с железом ошибка присутствует: для этого специально поставил 2 компаратора на вход data_in и 2 компаратора на выход data_out, а сигналы с компараторов вывел на светодиоды платы. На входе данные всегда правильные, а выход после N передач выдает либо фиксированные данные, либо 0. SignalTap-ом пользоваться не умею.

Код
module spi_slave
(
    input CLK,
    input CS,
    input MOSI,
    input SCK,
    input [15:0] DATA_IN,
    
    output reg MISO,
    output reg [15:0] DATA_OUT
);

    reg [15:0]     data_receive_reg;
    reg [15:0]     data_send_reg;
    reg [3:0]     bit_counter;
    reg             miso_reg;

    //============================
    // По спаду CS заносим данные в
    // data_send_reg
    //============================
    always @(negedge CS)
    begin
        data_send_reg <= DATA_IN;
   end
    
    //============================
    // Если CS=1 - обнуляем bitcounter
    // По фронту SCK заносим данные
    // в регистр data_receive_reg
    //============================
    always @(negedge SCK, posedge CS)
        if (CS)
            bit_counter <= 4'b0000;
        else
        begin
            data_receive_reg[15-bit_counter] <= MOSI;
            bit_counter <= bit_counter + 4'b0001;    
        end
    //============================        
    // Если CS=1 - обнуляем MISO
    // По фронту SCK выводим данные
    //============================
    always @(posedge SCK, posedge CS)
        if (CS)
            miso_reg <= 1'b0;
        else
            miso_reg <= data_send_reg[15-bit_counter];
    
    //============================
    // Синхронизация данных
    //============================
    always @(posedge CLK)
    begin
        DATA_OUT = data_receive_reg;
        MISO = miso_reg;
    end
    //============================
endmodule


Сообщение отредактировал Sprite - May 11 2018, 06:36
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение May 11 2018, 06:44
Сообщение #25


В поисках себя...
****

Группа: Свой
Сообщений: 693
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140



Цитата(Sprite @ May 11 2018, 09:32) *

Жуть !
1. Фильтруйте входные внешние асинхронные сигналы от пологих фронтов, и возможного дребезга около фронтов.
2. Работайте только про одному фронту синхросигнала. Хотите выделить фронт сигнала - применяйте схемы детектора фронтов(гуглится легко). Так как сделано у Вас - в FPGA не делается.
3.
Код
    always @(negedge SCK, posedge CS)
        if (CS)
            bit_counter <= 4'b0000;
        else
        begin
            data_receive_reg[15-bit_counter] <= MOSI;
            bit_counter <= bit_counter + 4'b0001;    
        end

Так конечно можно. Но правильнее и красивее в сдвиговый регистр данные записывать. Записали и сдвинули. Приняли все биты - отдали данные в модуль, обрабатывающий слова.
Go to the top of the page
 
+Quote Post
Marat Zuev
сообщение May 11 2018, 17:48
Сообщение #26


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 8-05-18
Пользователь №: 103 834



Цитата(Sprite @ May 11 2018, 07:32) *
Моделировал в стандартном квартусовском симуляторе - ошибок нет, но при работе с железом ошибка присутствует: для этого специально поставил 2 компаратора на вход data_in и 2 компаратора на выход data_out, а сигналы с компараторов вывел на светодиоды платы. На входе данные всегда правильные, а выход после N передач выдает либо фиксированные данные, либо 0.
Значит, модель Ваша не совпадает с действительностью.
И уж если взялись, то возьмите осциллограф. Раз интерфейс отлаживаете - смотрите его на экране осциллоскопа, а не на мигании светодиодов.
Цитата(Sprite @ May 11 2018, 07:32) *
SignalTap-ом пользоваться не умею.
А вот это освойте: и сейчас пригодится, и в будущем. Начинать, например, можно отсюда.

И скрипт Вы, конечно, "синхронизировали" сильно. Сделайте так, как сказал Flip-fl0p.


--------------------
--
С наилучшими пожеланиями, Marat.
Go to the top of the page
 
+Quote Post
Sprite
сообщение May 12 2018, 13:40
Сообщение #27


Частый гость
**

Группа: Участник
Сообщений: 171
Регистрация: 11-05-08
Пользователь №: 37 414



Цитата(Flip-fl0p @ May 11 2018, 13:44) *
Жуть !
1. Фильтруйте входные внешние асинхронные сигналы от пологих фронтов, и возможного дребезга около фронтов.
2. Работайте только про одному фронту синхросигнала. Хотите выделить фронт сигнала - применяйте схемы детектора фронтов(гуглится легко). Так как сделано у Вас - в FPGA не делается.
3. Но правильнее и красивее в сдвиговый регистр данные записывать. Записали и сдвинули. Приняли все биты - отдали данные в модуль, обрабатывающий слова.


Ошибку исправил, засинхронизировал сигнал CS, переписал модуль SPI как советовал Flip-fl0p. В железе все работает, но при компиляции куча варнингов, типа:
Код
Warning: Presettable and clearable registers converted to equivalent circuits with latches. Registers power-up to an undefined state, and DEVCLRn places the registers in an undefined state.
    Warning (13310): Register "SPIslave:inst16|data_in_reg[15]" is converted into an equivalent circuit using register "SPIslave:inst16|data_in_reg[15]~_emulated" and latch "SPIslave:inst16|data_in_reg[15]~latch"
    Warning (13310): Register "SPIslave:inst16|data_in_reg[14]" is converted into an equivalent circuit using register "SPIslave:inst16|data_in_reg[14]~_emulated" and latch "SPIslave:inst16|data_in_reg[14]~latch"
    Warning (13310): Register "SPIslave:inst16|data_in_reg[13]" is converted into an equivalent circuit using register "SPIslave:inst16|data_in_reg[13]~_emulated" and latch "SPIslave:inst16|data_in_reg[13]~latch"
    Warning (13310): Register "SPIslave:inst16|data_in_reg[12]" is converted into an equivalent circuit using register "SPIslave:inst16|data_in_reg[12]~_emulated" and latch "SPIslave:inst16|data_in_reg[12]~latch"
    Warning (13310): Register "SPIslave:inst16|data_in_reg[11]" is converted into an equivalent circuit using register "SPIslave:inst16|data_in_reg[11]~_emulated" and latch "SPIslave:inst16|data_in_reg[11]~latch"
    Warning (13310): Register "SPIslave:inst16|data_in_reg[10]" is converted into an equivalent circuit using register "SPIslave:inst16|data_in_reg[10]~_emulated" and latch "SPIslave:inst16|data_in_reg[10]~latch"
    Warning (13310): Register "SPIslave:inst16|data_in_reg[9]" is converted into an equivalent circuit using register "SPIslave:inst16|data_in_reg[9]~_emulated" and latch "SPIslave:inst16|data_in_reg[9]~latch"
    Warning (13310): Register "SPIslave:inst16|data_in_reg[8]" is converted into an equivalent circuit using register "SPIslave:inst16|data_in_reg[8]~_emulated" and latch "SPIslave:inst16|data_in_reg[8]~latch"
    Warning (13310): Register "SPIslave:inst16|data_in_reg[7]" is converted into an equivalent circuit using register "SPIslave:inst16|data_in_reg[7]~_emulated" and latch "SPIslave:inst16|data_in_reg[7]~latch"
    Warning (13310): Register "SPIslave:inst16|data_in_reg[6]" is converted into an equivalent circuit using register "SPIslave:inst16|data_in_reg[6]~_emulated" and latch "SPIslave:inst16|data_in_reg[6]~latch"
    Warning (13310): Register "SPIslave:inst16|data_in_reg[5]" is converted into an equivalent circuit using register "SPIslave:inst16|data_in_reg[5]~_emulated" and latch "SPIslave:inst16|data_in_reg[5]~latch"
    Warning (13310): Register "SPIslave:inst16|data_in_reg[4]" is converted into an equivalent circuit using register "SPIslave:inst16|data_in_reg[4]~_emulated" and latch "SPIslave:inst16|data_in_reg[4]~latch"
    Warning (13310): Register "SPIslave:inst16|data_in_reg[3]" is converted into an equivalent circuit using register "SPIslave:inst16|data_in_reg[3]~_emulated" and latch "SPIslave:inst16|data_in_reg[3]~latch"
    Warning (13310): Register "SPIslave:inst16|data_in_reg[2]" is converted into an equivalent circuit using register "SPIslave:inst16|data_in_reg[2]~_emulated" and latch "SPIslave:inst16|data_in_reg[2]~latch"
    Warning (13310): Register "SPIslave:inst16|data_in_reg[1]" is converted into an equivalent circuit using register "SPIslave:inst16|data_in_reg[1]~_emulated" and latch "SPIslave:inst16|data_in_reg[1]~latch"
    Warning (13310): Register "SPIslave:inst16|data_in_reg[0]" is converted into an equivalent circuit using register "SPIslave:inst16|data_in_reg[0]~_emulated" and latch "SPIslave:inst16|data_in_reg[0]~latch"
Warning: Timing Analysis is analyzing one or more combinational loops as latches
    Warning: Node "inst16|data_in_reg[15]~latch|combout" is a latch
    Warning: Node "inst16|data_in_reg[14]~latch|combout" is a latch
    Warning: Node "inst16|data_in_reg[13]~latch|combout" is a latch
    Warning: Node "inst16|data_in_reg[12]~latch|combout" is a latch
    Warning: Node "inst16|data_in_reg[11]~latch|combout" is a latch
    Warning: Node "inst16|data_in_reg[10]~latch|combout" is a latch
    Warning: Node "inst16|data_in_reg[9]~latch|combout" is a latch
    Warning: Node "inst16|data_in_reg[8]~latch|combout" is a latch
    Warning: Node "inst16|data_in_reg[7]~latch|combout" is a latch
    Warning: Node "inst16|data_in_reg[6]~latch|combout" is a latch
    Warning: Node "inst16|data_in_reg[5]~latch|combout" is a latch
    Warning: Node "inst16|data_in_reg[4]~latch|combout" is a latch
    Warning: Node "inst16|data_in_reg[3]~latch|combout" is a latch
    Warning: Node "inst16|data_in_reg[2]~latch|combout" is a latch
    Warning: Node "inst16|data_in_reg[1]~latch|combout" is a latch
    Warning: Node "inst16|data_in_reg[0]~latch|combout" is a latch


Новый код ниже, не судите строго - только учусь)
Код
module SPIslave(
    input clk,
    input CS,
    input MOSI,
    input SCK,
    input [15:0] data_in,
    output reg MISO,
    output reg [15:0] data_out,
    output reg data_ready
    );

reg [15:0] data_receive;
reg [15:0] data_in_reg;
reg [4:0]  bit_counter;
reg fall_CS_reg;
wire fall_CS;

    //----------------------------------------
    // По спаду SCK принимаем данные
    //----------------------------------------
    always @ (negedge SCK, posedge CS)
        if (CS)
            bit_counter <= 5'b00000;
        else
        begin
            data_receive <= { data_receive[14:0], MOSI };
            bit_counter <= bit_counter + 5'b00001;
        end
    //----------------------------------------
    // Выделяем спад CS
    //----------------------------------------
    always @(posedge clk)
        fall_CS_reg <= CS;
    assign fall_CS = fall_CS_reg & ~CS;


    //----------------------------------------
    // По фронту CS заносим данные в data_in_reg
    // По фронту SCK сдвигаем данные
    //----------------------------------------
    always @ (posedge SCK, posedge fall_CS)
    begin
        if (fall_CS)
            data_in_reg <= data_in;
        else
        begin
            MISO <= data_in_reg[15];
            data_in_reg <= (data_in_reg << 1);
        end
    end    

    //----------------------------------------
    // По переполнению счетчика выводим данные и сигнал готовности
    //----------------------------------------
    always @ (posedge clk)
    begin
        if (bit_counter[4])
            begin    
                data_out <= data_receive;
                data_ready <= 1'b1;
            end
        else
            begin
                data_out <= data_out;
                data_ready <= 1'b0;
            end
    end
endmodule


Кстати, RTL-схема получилась довольно интересная:


Go to the top of the page
 
+Quote Post
andrew_b
сообщение May 12 2018, 13:55
Сообщение #28


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

Группа: Свой
Сообщений: 1 959
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



У вас тут большие проблемы с CDC (clock domain crossing). Точнее, его просто нет.
Вы формируете fall_CS_reg по clk, а используете для SCK. Так делать нельзя.

Что там с латчами, сказать не берусь. Вроде криминала не вижу, но я Верилог воспринимаю плохо.
Go to the top of the page
 
+Quote Post
AnatolySh
сообщение May 12 2018, 14:02
Сообщение #29


Частый гость
**

Группа: Свой
Сообщений: 92
Регистрация: 20-01-06
Из: Зеленоград
Пользователь №: 13 407



Цитата(Sprite @ May 12 2018, 16:40) *
переписал модуль SPI как советовал Flip-fl0p.
Flip-fl0p советовал работать только от одного клока: у Вас это, как понимаю, clk.
И в списке чувствительности, помимо него, имеет право быть (для проекта комильфо) только, если, конечно, он Вам нужен, ещё асинхронный глобальный сброс.
А у Вас в этих списках зоопарк.
Кстати, боюсь предложить Вам ещё включить (если я правильно помню называние) Design Assistant )))
И пока перестаньте нас радовать Вашим RTL: давайте сначала код вылизывать.
Лучше выкладывайте экран функционального моделирования для этого модуля.


--------------------
WMBR
Go to the top of the page
 
+Quote Post
iosifk
сообщение May 12 2018, 14:48
Сообщение #30


Гуру
******

Группа: Модераторы
Сообщений: 3 982
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Sprite @ May 12 2018, 16:40) *
Ошибку исправил, засинхронизировал сигнал CS, переписал модуль SPI как советовал Flip-fl0p. В железе все работает, но при компиляции куча варнингов, типа:

Кстати, RTL-схема получилась довольно интересная:

Давайте с конца начнем...
Какой может быть интерес к "RTL-схема", если она потом оптимизируется и от нее мало что останется?
Ваш стиль кодирования "все в одном" приведет к мало-отлаженному проекту. Который будет трудно сопровождать...
На самом деле, все это гораздо проще ложится в набор автоматов:
нижний, который умеет только работать с битом,
средний, который умеет только передать-принять кадр, управляя при этом нижним,
верхний, который работает с сигналами типа CS и запускает средний на выполнение.

При этом, нижний может еще и фильтровать клоки и данные, если они приходят из SPI, а верхний может синхронизировать и фильтровать сигналы типа CS...
И когда к этому придете, то станет понятно, что "есть только один клок в проекте и сигнал разрешения - пророк его"... А попутно сделаете привязку асинхронных сигналов..
Потом сделайте еще параметры, в которых бы задавалось число клоков на один бит SPI отдельно для симуляции и отдельно для железа...Скажем, если для железа надо 100 клоков на бит, то дляя симуляции и 4-х хватит... Тогда симуляция будет делаться быстро..


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 16th August 2018 - 06:16
Рейтинг@Mail.ru


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