Перейти к содержанию

    

Особенности ModelSim

1 hour ago, Vengin said:

На тот момент был "несвой". Теперь уже обновился.

И решили все свои задачи Active-HDL-ом?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 15.10.2018 в 18:02, AnatolySh сказал:

И решили все свои задачи Active-HDL-ом?

Не совсем. Во-первых до того как не мог пользоваться новым (10.4) Active-HDL уже "перевёл" симуляционную часть проекта в ModelSim и, в принципе, пока им и пользуюсь. Когда получил доступ к Active-HDL 10.4 обновил проект, проверил симуляцию, но там не всё так гладко. К примеру, мне не удалось скомпилить все симуляционные библиотеки IP cores Vivado 2017.4 - автоматом они не копмилятся (вроде подразумевается, что их нужно качать с сайта Aldec готовым инсталляционным пакетом, но  как будто это доступно только с официальным софтом). Попытался компилить вручную (на основе скрипта компиляции корок для ModelSim) - в основном скомпилилось, но пару корок (штук 7) были с ошибками. Пока ещё не знаю, понадобятся ли они для симуляции в Active-HDL, т.к. процесс миграции с Quartus в Vivado ещё идёт.

В общем пока для данного проекта в основном пользуюсь ModelSim, иногда проверяю в Active-HDL.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
On 10/17/2018 at 7:24 AM, Vengin said:

что их нужно качать с сайта Aldec готовым инсталляционным пакетом.

Пробуйте

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Доброго времени суток! Никак не могу с помощью ModelSim протестировать проект :(

Нашёл на форуме следующий код (делитель входной частоты 50 МГц до 2 Мгц):

`timescale 1ns/1ns

module divider 
(
    input wire clk50,
    output reg clk2
);

    reg [4:0] counter;
    reg a,b;
    
    always @ (posedge clk50)
    begin
        counter <= (counter == 24) ? 0 : (counter + 1);
        if (counter == 0) a <= ~b;
    end

    always @ (negedge clk50)
    begin
        if (counter == 13) b <= a;
    end

    always @* clk2 = a^b;
endmodule 

Использую следующий testbanch:

`timescale 1ns / 1ns
module divider_tb(); 
 
  wire clk2; 
  reg clk50; 
  
  divider  
   DUT  ( 
       .clk2 (clk2 ) ,
      .clk50 (clk50 ) ); 



// "Clock Pattern" : dutyCycle = 50
// Start Time = 0 ns, End Time = 10 us, Period = 100 ns
  initial
  begin
   repeat(100)
   begin
	   clk50  = 1'b1;
	  #50  clk50  = 1'b0;
	  #50;
// 10 us, repeat pattern in loop.
   end
  end

  initial
	#20000 $stop;
endmodule

После запуска RTL simulation наблюдаю следующее (нет изменения clk2):

image.thumb.png.0b0340ff11939d8e2a712e4dca3d708b.png

Но если протестировать проект с помощью WFE, то можно наблюдать clk2:

image.thumb.png.fe96dd3e53fa6a8d4901c24a1dae535a.png

Пожалуйста, подскажите как правильно в ModelSim тестировать...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, огромное! С таким кодом работает:

`timescale 1ns/1ns

module divider 
(
    input wire clk50,
    output reg clk2
);

    reg [4:0] counter = 5'b00000;
    reg a,b = 1'b0;
    
    always @ (posedge clk50)
    begin
        counter <= (counter == 24) ? 0 : (counter + 1);
        if (counter == 0) a <= ~b;
    end

    always @ (negedge clk50)
    begin
        if (counter == 13) b <= a;
    end

    always @* clk2 = a^b;
endmodule 

Диаграмма получилась:

image.png.b2a4f60f4530ed5981bb2e83319709f3.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
8 минут назад, laknik сказал:

Спасибо, огромное! С таким кодом работает

По форме - правильно. Но по технической сути за такое вычисление clk2 в проекте разработчика необходимо приговорить к расстрелу на месте....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти