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

Программирование ПЛИС для маленьких спутников

Скачал ModelSim. Написал на Верилоге простой проект "Исключающее-ИЛИ" с тремя входами. Попробовал симулировать работу элемента.

 

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


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

On 5/6/2024 at 1:18 PM, quest said:

Если уровень плис подготовки ненулевой, способны в коде разбираться, то ищите LEON SPARC.

LEON с троированием и обнаружением/коррекцией ошибок в свободном доступе мне не попадался.

Да, в коде и доках есть какие-то огрызки или общие куски, типа, странного crt0 с tmr-щиной, но не думаю, что это поможет понять.

Для освоения "процессоростроения" LEON/NOEL слишком непросто написан, лучше брать какойнибудь простой RiscV, например открытое ядро от синтакора

И небольшой совет автору топика - обратите внимание на бесплатные средства проектирования icarus verilog, verilator - если (что может быть и маловероятно) понадобится статью буржуям написать или какое-то  сотрудничество, то они спросят, откуда моделсим взялся. Verilator вообще монструозная вещь, но чтоб заработал надо постараться

 

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


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

1 hour ago, yes said:

И небольшой совет автору топика - обратите внимание на бесплатные средства проектирования icarus verilog, verilator - если (что может быть и маловероятно) понадобится статью буржуям написать или какое-то  сотрудничество, то они спросят, откуда моделсим взялся. Verilator вообще монструозная вещь, но чтоб заработал надо постараться

Хорошо, посмотрю что за проги и буду иметь ввиду.

 

Подскажите ещё по одному моменту. В Simulink собрал модель, которая просто инвертирует входной сигнал (элемент НЕ), конвертировал её в Verilog и файл тестбенча (с помощью HDL Coder). Загружаю в ModelSim оба файла, но ни один их них не эмулируется. Как я понял, тестбенч включает в себя всевозможные режимы логической схемы, и по идее, симулятор должен их сам переключать. Но ничего не происходит. То ли я неверно понимаю принцип работы тестбенча, то ли файлы составлены неверно...

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


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

В 07.05.2024 в 15:18, Booleek789 сказал:

Скачал ModelSim. Написал на Верилоге простой проект "Исключающее-ИЛИ" с тремя входами. Попробовал симулировать работу элемента.

 

И как?

 

4 часа назад, Booleek789 сказал:

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

Симулятор исполняет тестбенч, что в тестбенче написано так и будут переключатся сигналы входных воздействий. Сам симулятор ничего не переключает.

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


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

1 hour ago, Jackov said:

И как?

modelsim-xor.thumb.PNG.4cf7bd8f1336439f5e24a7a4a2433d76.PNG

 

1 hour ago, Jackov said:

Симулятор исполняет тестбенч, что в тестбенче написано так и будут переключатся сигналы входных воздействий. Сам симулятор ничего не переключает.

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

vlib work
vlog  symmetric_fir.v
vlog  symmetric_fir_tb.v

В классическом варианте эти файлы выполняются с помощью команды QuestaSim>do через рабочее окно Матлаба. Но похоже моя версия МодельСим не дружит с версией Матлаба R2024а, т.к. QuestaSim>do попросту не работает. Надежда есть на то, что получится проделать все инструкции вручную. Ведь если посмотреть на содержимое .do файлов, можно понять, что именно они делают. Так вот, коды Верилога в формате .v в МодельСим я загрузил и скомпилировал. Всё в порядке. Но как быть со вторым набором инструкций, которые как раз и назначают входам модели нужные сигналы? Выглядит этот файл так:
 

onbreak resume
onerror resume
vsim -voptargs=+acc work.symmetric_fir_tb

add wave sim:/symmetric_fir_tb/u_symmetric_fir/clk
add wave sim:/symmetric_fir_tb/u_symmetric_fir/reset
add wave sim:/symmetric_fir_tb/u_symmetric_fir/clk_enable
add wave sim:/symmetric_fir_tb/u_symmetric_fir/x_in
add wave sim:/symmetric_fir_tb/u_symmetric_fir/h_in1
add wave sim:/symmetric_fir_tb/u_symmetric_fir/h_in2
add wave sim:/symmetric_fir_tb/u_symmetric_fir/h_in3
add wave sim:/symmetric_fir_tb/u_symmetric_fir/h_in4
add wave sim:/symmetric_fir_tb/u_symmetric_fir/ce_out
add wave sim:/symmetric_fir_tb/u_symmetric_fir/y_out
add wave sim:/symmetric_fir_tb/y_out_ref
add wave sim:/symmetric_fir_tb/u_symmetric_fir/delayed_xout
add wave sim:/symmetric_fir_tb/delayed_xout_ref
run -all

Я брал за основу вот этот пример: Verify Generated Code Using HDL Test Bench from Configuration Parameters

Изменено пользователем Booleek789

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


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

6 часов назад, Booleek789 сказал:

В Simulink собрал модель, которая просто инвертирует входной сигнал (элемент НЕ), конвертировал её в Verilog и файл тестбенча (с помощью HDL Coder). Загружаю в ModelSim оба файла

Есть приличные книги:

1.Цифровая схемотехника и архитектура компьтера: RISC-V  Сара Л. Харрис, Девид Харрис
2. Цифровой синтез. Практический курс. А.Ю. Романова, Ю.В. Панчула
3.Логическое проектирование встраиваемых систем на FPGA   Валерий Соловьев.

Для практики Соловьев Вам в помощь. Прямо в моделсиме создавайте свои  проекты и моделируйте. 

Имеет смысл создавать свои проекты в ВИВАДО. Ибо китайские плис xilinx подобные. У Китая есть плис радиационно стойкие.

А вообще наверно полетят любые. Вот только неизвестно, сколько прослужат.

ct.zip

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


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

7 часов назад, Booleek789 сказал:

Но как быть со вторым набором инструкций, которые как раз и назначают входам модели нужные сигналы? Выглядит этот файл так:

Это тоже скрипт МоделСима, назначает вывод нужных сигналов на временную диаграмму и указывает в каком виде они будут показаны.

Посмотрите серии 11 и 12 из этого плейлиста, поможет разобраться что есть что

https://www.youtube.com/playlist?list=PL4UMfOeGYsvblwrP3VYKHq11xgkxVqoUj

 

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


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

9 hours ago, sazh said:

Есть приличные книги:

1.Цифровая схемотехника и архитектура компьтера: RISC-V  Сара Л. Харрис, Девид Харрис
2. Цифровой синтез. Практический курс. А.Ю. Романова, Ю.В. Панчула
3.Логическое проектирование встраиваемых систем на FPGA   Валерий Соловьев.

Для практики Соловьев Вам в помощь. Прямо в моделсиме создавайте свои  проекты и моделируйте. 

Имеет смысл создавать свои проекты в ВИВАДО. Ибо китайские плис xilinx подобные. У Китая есть плис радиационно стойкие.

А вообще наверно полетят любые. Вот только неизвестно, сколько прослужат.

ct.zip 829 B · 8 downloads

Большое спасибо за рекомендации. Начну с Соловьёва.

2 hours ago, Jackov said:

Это тоже скрипт МоделСима, назначает вывод нужных сигналов на временную диаграмму и указывает в каком виде они будут показаны.

Посмотрите серии 11 и 12 из этого плейлиста, поможет разобраться что есть что

https://www.youtube.com/playlist?list=PL4UMfOeGYsvblwrP3VYKHq11xgkxVqoUj

 

Спасибо! Вы правы. По сути это практически те же команды, которые прописываются в МодельСиме при ручном назначении входных сигналов.

Изменено пользователем Booleek789

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


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

Получилось запустить макросы .do с помощью внутренних средств ModelSim (File->Load->Macro File...). Что-то автоматически смоделировалось, правда, в какой-то момент расчёты прекратились (ошибку пока не анализировал, поэтому не знаю, в чём дело).

 

res.PNG

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


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

On 6/14/2024 at 7:49 AM, keats sun said:

Здравствуйте,Какую FPGA вы используете?

Здравствуйте, пока никакую конкретную не использую, просто разбираюсь с HDL.

Хочу разобраться с тем, как на ПЛИС реализовываются различные вычисления (сложение, умножение и т.д.). Если с арифметикой всё более-менее понятно (двоичная арифметика, сдвиги, знак в старшем бите и т.д.), то с логарифмами, экспонентами и прочим всё сложнее. Слышал про CORDIC. Захотелось посмотреть, как математику в HDL переводит Матлаб. Посмотрите пожалуйста что получилось. Что скажете, насколько полученный код хорош/плох? Вот схема, которую Матлаб преобразовал в HDL.

// Generated by MATLAB 24.1, HDL Coder 24.1, and Simulink 24.1
//
//
// -- -------------------------------------------------------------
// -- Rate and Clocking Details
// -- -------------------------------------------------------------
// Model base rate: 0.2
// Target subsystem base rate: 0.2
//
//
// Clock Enable  Sample Time
// -- -------------------------------------------------------------
// ce_out        0.2
// -- -------------------------------------------------------------
//
//
// Output Signal                 Clock Enable  Sample Time
// -- -------------------------------------------------------------
// out                           ce_out        0.2
// -- -------------------------------------------------------------
//
// -------------------------------------------------------------


// -------------------------------------------------------------
//
// Module: untitled
// Source Path: untitled
// Hierarchy Level: 0
// Model version: 1.0
//
// -------------------------------------------------------------

`timescale 1 ns / 1 ns

module untitled
          (clk,
           reset_x,
           clk_enable,
           a,
           b,
           ce_out,
           out);


  input   clk;
  input   reset_x;
  input   clk_enable;
  input   [63:0] a;  // double
  input   [63:0] b;  // double
  output  ce_out;
  output  [63:0] out;  // double


  wire enb;
  real a_double;  // double
  real b_double;  // double
  real Product_out1;  // double
  real Delay_reg [0:8];  // double [9]
  real Delay_reg_next [0:8];  // double [9]
  real Delay_out1;  // double
  reg signed [31:0] Delay_t_0_0;  // int32
  reg signed [31:0] Delay_t_0_1;  // int32
  reg signed [31:0] Delay_t_1;  // int32


  always @* a_double = $bitstoreal(a);

  always @* b_double = $bitstoreal(b);

  always @* Product_out1 = a_double * b_double;


  assign enb = clk_enable;

  always @(posedge clk or posedge reset_x)
    begin : Delay_process
      if (reset_x == 1'b1) begin
        for(Delay_t_1 = 32'sd0; Delay_t_1 <= 32'sd8; Delay_t_1 = Delay_t_1 + 32'sd1) begin
          Delay_reg[Delay_t_1] <= 0.0;
        end
      end
      else begin
        if (enb) begin
          for(Delay_t_0_1 = 32'sd0; Delay_t_0_1 <= 32'sd8; Delay_t_0_1 = Delay_t_0_1 + 32'sd1) begin
            Delay_reg[Delay_t_0_1] <= Delay_reg_next[Delay_t_0_1];
          end
        end
      end
    end

  always @* begin
    Delay_out1 = Delay_reg[8];
    Delay_reg_next[0] = Product_out1;

    for(Delay_t_0_0 = 32'sd0; Delay_t_0_0 <= 32'sd7; Delay_t_0_0 = Delay_t_0_0 + 32'sd1) begin
      Delay_reg_next[Delay_t_0_0 + 32'sd1] = Delay_reg[Delay_t_0_0];
    end

  end


  assign out = $realtobits(Delay_out1);

  assign ce_out = clk_enable;

endmodule  // untitled

 
simpleschemewithproduct.thumb.PNG.02228994e574fa7e0a5053e98bfea3dc.PNG

 

Изменено пользователем Booleek789

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


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

Booleek789

Код никуда не годится, в симулинке в синтезируемой части у вас не должно быть типа double, только с фиксированной точкой ufix, sfix, изучайте преобразование типов в симулинке, матлабе, fixdt(), fi(). Генерировать лучше в VHDL как более стрктурированный, читаемый.

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


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

Думаю эта книга вам будет интересна: ПЛИС для аэрокосмической области. Матлаб делает работоспособный код для ПЛИС, много лет его используем, всё ОК. Также посмотрите библиотеку System Generator и Stateflow для ПЛИС в Матлабе, также получается рабочий код HDL, причём можно сделать как IP ядро всей системы, так и HDL(VHDL, Verilog). Генерировать код всё-таки лучше в Verilog из Матлаб, т.к. с VHDL бывают косяки - может в проекте модуль выше по коду использовать, когда описание самого модуля ниже, приходится вручную вырезать код и редактировать его. Так что в последнее время генерим на Verilog, меньше ошибок при генерации и нет проблем с подключением библиотек. 

Книга для начинающих:Фрэнк Бруно

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


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

On 7/1/2024 at 12:22 AM, Skryppy said:

Думаю эта книга вам будет интересна: ПЛИС для аэрокосмической области. Матлаб делает работоспособный код для ПЛИС, много лет его используем, всё ОК. Также посмотрите библиотеку System Generator и Stateflow для ПЛИС в Матлабе, также получается рабочий код HDL, причём можно сделать как IP ядро всей системы, так и HDL(VHDL, Verilog). Генерировать код всё-таки лучше в Verilog из Матлаб, т.к. с VHDL бывают косяки - может в проекте модуль выше по коду использовать, когда описание самого модуля ниже, приходится вручную вырезать код и редактировать его. Так что в последнее время генерим на Verilog, меньше ошибок при генерации и нет проблем с подключением библиотек. 

Книга для начинающих:Фрэнк Бруно

Спасибо за очень полезную информацию и ссылки!

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


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

Я тут вот такую штуку сделал. Это имитация дребезга контактов и его устранение.

module randnum (signal, clock, r, c_out, pos_neg_edge, signal_for_rattling, mask_for_signal, signal_with_rattling, signal_after_filtering_from_bouncing);
input signal;
input clock;
reg [3:0] n;
reg c;
reg [$clog2(DEBOUNCE_LIMIT)-1:0] r_Count = 0;
reg r_State = 1'b0;

output [3:0] r;
output c_out;
output pos_neg_edge;
output signal_for_rattling;
output mask_for_signal;
output signal_with_rattling;
output signal_after_filtering_from_bouncing;
//Parameters
parameter DELAY = 10;
parameter DEBOUNCE_LIMIT = 20;
reg [DELAY-1:0] signal_delay;
//
always @(posedge clock) begin
    n <= $random%15;
    signal_delay <= {signal_delay[DELAY-2:0], signal};
    if (signal_with_rattling !== r_State && r_Count < DEBOUNCE_LIMIT-1) begin
    r_Count <= r_Count + 1;
    end
    else if (r_Count == DEBOUNCE_LIMIT-1) 
    begin
    r_State <= signal_with_rattling;
    r_Count <= 0;
    end
    else 
    begin
    r_Count <= 0;
    end
end
assign r = n;
assign c_out = ($signed(n) < $signed(4'b0000)) ? 1'b1 : 1'b0;
assign pos_neg_edge = (signal != signal_delay[DELAY-1]) ? 1'b1 : 1'b0;
assign signal_for_rattling = signal || pos_neg_edge; 
assign mask_for_signal = !(c_out && pos_neg_edge);
assign signal_with_rattling = signal_for_rattling && mask_for_signal;
assign signal_after_filtering_from_bouncing = r_State;
endmodule

И тестбенч:

`timescale 1ns / 1ps
module randnum_tb; 
// Inputs
reg clock;
reg signal;
// Outputs
wire [3:0] r;
wire c_out;
wire pos_neg_edge;
wire signal_for_rattling;
wire mask_for_signal;
wire signal_with_rattling;
wire signal_after_filtering_from_bouncing;
// Instantiate the Unit Under Test (UUT)
randnum uut (.signal(signal),.clock(clock),.r(r),.c_out(c_out),.pos_neg_edge(pos_neg_edge),.signal_for_rattling(signal_for_rattling),.mask_for_signal(mask_for_signal),.signal_with_rattling(signal_with_rattling),.signal_after_filtering_from_bouncing(signal_after_filtering_from_bouncing));
initial begin
// Initialize Inputs
clock  = 1'b1;
#10;
signal = 1'b0; #100;
signal = 1'b1; #100;
signal = 1'b0; #100;
end
always #0.5 clock = ~clock;  
endmodule

Проект учебный. Модель дребезга я придумал сам, а блок Debouncing сделал на основе примера из книги Getting Started with FPGAs.Digital Circuit Design, Verilog, and VHDL for Beginners by Russell Merrick на странице 106.

Это первое более-менее крупное устройство на ПЛИС для меня. Если будут вопросы, предложения и замечания по коду - пожалуйста пишите.

filter-from-debouncing.PNG

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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