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

Verilog : Привязать файл с данными к сигналу

Подскажите, пожалуйста, каким образом можно задать сигнал на основании отдельного файла, данные в котором, допустим, такого вида:

 

0

1

1

0

0

0

1

1

0 и т.д.

 

Вобщем, чтобы в итоге при моделировании сигнал был следующего вида - п_п_п____п___п____п_п

 

Если можно, очень был бы благодарен примеру кода, выполняющего подобную задачу.

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


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

Подскажите, пожалуйста, каким образом можно задать сигнал на основании отдельного файла, данные в котором, допустим, такого вида:

....

Найдите у меня на сайте в статьях "Краткий Курс HDL"...

Удачи!

 

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


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

минут 15 пытаюсь найти и ничего...

единственное, что могло бы подходить - http://iosifk.narod.ru/hdl_coding/verilog.htm

но там только о диске и его заказе и говорится

 

Спасибо, вроде бы нашел то, что нужно.

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


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

Спасибо, вроде бы нашел то, что нужно.

 

Там 13 статей. И они же на сайте kit-e.ru

 

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


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

Подскажите, пожалуйста, каким образом можно задать сигнал на основании отдельного файла, данные в котором, допустим, такого вида:

первое, что приходит в голову - это описать память и загрузить в неё данные из файла функцией $readmemb() или $readmemh(). По сигналу CLK читать данные из этой памяти.

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


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

первое, что приходит в голову - это описать память и загрузить в неё данные из файла функцией $readmemb() или $readmemh(). По сигналу CLK читать данные из этой памяти.

Этот подход не правильный! Он работает только для очень простых проектов.

А на самом деле надо читать данные из файла и результат моделирования тоже писать в файл. Тогда после моделирования можно будет только обработать файл результата, а не смотреть "зубчики" на временной диаграмме. Попробуйте например отладить 32-х канальный HDLC-контроллер, и прогнать через него хотя бы сотню байт. Если для одного канала (тайм-слота) надо сделать ну пусть 10 тактов автоматом, то всего будет 10*8бит*32канала*100байт(даже без учета бит-стаффинга)... Ну и как Вам такой расклад?

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

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


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

Ничего не понял в итоге (

не могу разобраться

 

Допустим, имеется сигнал, который я задаю следующим образом

 

initial

 

begin

 

clk = 1;

 

forever #80 clk = !clk;

 

end

 

т.е. он у меня меняется с учетом задержки.

так вот каким образом мне задать этот сигнал, но через данные из файла, в котором будут 0 и 1 ?

и можно ли при таком способе задачи сигнала учесть задержки и, допустим, сделать этот сигнал произвольной формы:

что-то вроде п_п_п_________п_п____________п_п_п_п_п

 

И если есть пример подобного кода - поделитесь?

я начинающий и только-только со всем этим столкнулся.

Читаю литературу по Верилогу, по моделированию и тэстбэнчам, сложновато приходится.

не успеваю все переварить (

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


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

Этот подход не правильный! Он работает только для очень простых проектов.

эм... терминологию я оспаривать не буду... но мне идеологически непонятно чем отличается моё "описать память и загрузить в неё данные из файла функцией $readmemb() или $readmemh()" от Вашего "самом деле надо читать данные из файла"

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


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

Ничего не понял в итоге (

не могу разобраться

 

Еще раз. Найдите пример кода, в котором показано, как читать данные из файла. Там задается время и значение сигнала в это время.

 

 

эм... терминологию я оспаривать не буду... но мне идеологически непонятно чем отличается моё "описать память и загрузить в неё данные из файла функцией $readmemb() или $readmemh()" от Вашего "самом деле надо читать данные из файла"

Ну, допустим, Вы сделали память и оттуда читаете данные. ОК. А куда кладете результат? В другую память? И как потом этот результат из "памяти" выдирать?

Что у меня приведено в примерах?

Разница в том, что в процессе отладки данные пишутся не в какую-то память, а в обычный текстовый файл. Например, если в процессе отладки, что-то пошло не так, то можно добавив пару строк кода заставить симулятор скинуть в файл текстовое сообщение: "время-ХХ, Сигнал А - УУ не норма!!". Или вообще сливать в файл весь результат или хоть каждый шаг отладки. Это уже по желанию автора. А если модуль, который Вы отлаживаете полежит пару месяцев или будет использоваться Вашим коллегой, то забытые осциллограммы не так легко вспомнить или неизвестные изучить...

 

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


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

Коды, необходимые

для чтения состояний сигналов из файла

 

 

 

real number;

// Define integers for file handling

integer number_file;

integer i=1;

initial begin

// Open file numbers.txt for reading

number_file = $fopen(«numbers.txt», «r»);

// Produce error and exit if file could not be opened

if (number_file == 0) begin

$display(«Error: Failed to open file, numbers.txt\nExiting

Simulation.»);

$finish;

end

// Loop while data is being read from file

// (i will be -1 when end of file or 0 for blank line)

while (i>0) begin

$display(«i = %d», i);

i=$fscanf(number_file, «%f», number);

$display(«Number read from file is %f», number);

@(posedge CLK);

end

// Close out file when finished reading

$fclose(number_file);

#100;

$display(«Simulation ended normally»);

$stop;

end

 

 

не понимаю (

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


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

Ну, допустим, Вы сделали память и оттуда читаете данные. ОК. А куда кладете результат? В другую память? И как потом этот результат из "памяти" выдирать?

эм... разве я что-то говорил про отладку или про интерпретацию результатов моделирования? вопрос был как присвоить сигналу заначения, хранящиеся в отдельном файле... или нет? =)

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


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

Или вот пример нашел...

 

module stim_gen (

// Outputs

clk, data

);

output clk;

output [7:0] data;

reg clk;

reg [7:0] data;

integer fd;

integer code, dummy;

reg [8*10:1] str;

 

initial begin

fd = $fopen("_input.dat","r");

clk = 0;

data = 0;

code = 1;

$monitor("data = %x", data);

while (code) begin

code = $fgets(str, fd);

dummy = $sscanf(str, "%x", data);

@(posedge clk);

end

$finish;

end // initial begin

always #5 clk = ~clk;

endmodule // stim_gen

 

 

Contents of _input.dat file

Code:

 

0

1

2

3

4

5

6

7

0

1

2

3

4

5

6

7

 

Объясните, пожалуйста, оба примера (

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


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

Объясните, пожалуйста, оба примера (

А найдите раздел про то, как работать с МоделСимом. Установите его, запустите оба примера по очереди и смотрите.

Я же привел примеры чтения/записи из файла. Там же и комментарии есть.

Что не понятно конкретно?

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


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

Объясните, пожалуйста, оба примера (

Есть несколько подходов для задания значений сигналов "извне".

1. Если много памяти и важна скорость моделирования

объявляют память для хранения всего набора входных вектов и заполняют её из файла функцией $readmemb() или $readmemh(). Заполнять можно частями - начиная с определённого адреса. Далее присваивают сигналам значения из памяти и инкрементируют адрес в памяти. "Минус" подхода в том, что требуется значительный объём ОЗУ (но можно заполнять память частями).

2. Если мало памяти и скорость моделирования не критична

Как показано в приведённых примерах - читается не весь файл целиком, а только текущее значение (таким образом экономим память, но увеличиваем время моделирования большим число системных вызовов в условном цикле)

3. Если важна скорость моделирования и размер входных векторов очень большой

Тут не обойтись без программного интерфейса с Си. В текущий момент моделирования (или по какому-то условию) подгружаем текущие входные воздействия из Си-программы. Также Си программой можно интерпритировать текущие результаты моделирования.

 

Или вот пример нашел...

Объясните, пожалуйста, оба примера (

module stim_gen (
  // Outputs
  clk, data
  );
  output clk;
  output [7:0] data;
  reg    clk; // тактовый сигнал
  reg [7:0] data; // шина данных с входными воздействиями
  integer   fd;
  integer   code, dummy;
  reg [8*10:1] str;

  initial begin
     fd = $fopen("_input.dat","r");  // открываем файл
     clk = 0;
     data = 0;
     code = 1;
     $monitor("data = %x", data);             // выводим текущее значение на шине данных
     while (code) begin                              // пока не конец файла
        code = $fgets(str, fd);                      // читаем текущую строку в файле
        dummy = $sscanf(str, "%x", data); //  выставляем на шину значения из текущей строки в файле
        @(posedge clk);                              // ждём переднего фронта сигнала clk
     end
     $finish;                                                 // если все строки в файле прочитаны - конец моделирования
  end // initial begin
  always #5 clk = ~clk;                              // каждые 5 интервалов времени моделирования инвертируем сигнал clk
endmodule // stim_gen


Contents of _input.dat file
Code:

0
1
2
3
4
5
6
7
0
1
2
3
4
5
6
7

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...