Jump to content

    

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

1 hour ago, Vengin said:

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

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

Share this post


Link to post
Share on other sites
В 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.

Share this post


Link to post
Share on other sites
On 10/17/2018 at 7:24 AM, Vengin said:

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

Пробуйте

Share this post


Link to post
Share on other sites

Доброго времени суток! Никак не могу с помощью 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 тестировать...

 

Share this post


Link to post
Share on other sites

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

`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

Share this post


Link to post
Share on other sites
8 минут назад, laknik сказал:

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now