МАРСОХОД

Open Source Hardware Project

Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
  • Страница:
  • 1

ТЕМА: Функция синуса на Verilog

Функция синуса на Verilog 3 нед. 1 день назад #7660

  • vadim1
  • vadim1 аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 7
  • Спасибо получено: 1
Понадобилась функция синуса на Verilog. Осмотревшись в интернете решил делать прямой цифровой генератор синусоиды (Direct Digital Synthesizer)

Таблица четверти периода синуса генерируется на Perl, а за одно сразу и код на Verilog. Perl использовался идущий в составе Quartus II 9.1sp1 Web Edition. Он там есть. Ищите perl.exe. К нему надо только путь прописать в переменную path для удобства.

Кстати было интересно сравнить что выгоднее case или if.


sin.pl [ Нажмите, чтобы развернуть ]


dds_sin.v [ Нажмите, чтобы развернуть ]




В железе пока не проверял.
Вложения:

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Функция синуса на Verilog 3 нед. 1 день назад #7661

Делаю примерно то же, что и Вы. Только для синуса использую таблицу, записанную в память. Не получается в Icarus это дело промоделировать. Можете помочь? Код такой:

module sin_DDS(
input clk_50MHz,
output reg [13:0] dac1_d,
output reg [13:0] dac2_d
);
(* ram_style = "block" *) reg [13:0] rom_1[0:31];
initial
begin
$readmemh("sin_samples_32.mif", rom_1);
end
reg [7:0] phase_acc_1 = 8'd1;
always @(posedge clk_50MHz)
begin
phase_acc_1 <= phase_acc_1 + 1;
end
always @(posedge clk_50MHz)
begin
dac1_d <= phase_acc_1;
dac2_d <= rom_1[phase_acc_1];
end
endmodule


Компилируется нормально, но при попытке моделирования говорит, что не может открыть файл sin_samples_32.mif (формат пробовал как в Quartus и просто каждая цифра на новой строке)

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от jeka_rj.

Функция синуса на Verilog 3 нед. 1 день назад #7663

  • vadim1
  • vadim1 аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 7
  • Спасибо получено: 1
скорее всего, просто не находит sin_samples_32.mif в текущем каталоге.
а до формата и количества значений в файле дело не доходит.

кстати,
если таблица 32 значения, и это весь период функции то счётчик должен быть такой разрядности чтобы тоже принимать 32 значения.
Спасибо сказали: jeka_rj

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от vadim1.

Функция синуса на Verilog 3 нед. 7 ч. назад #7664

Спасибо. В итоге в Quartuse все заработало. Но тоже как то странно. Чтобы скомпилировать пришлось mif файл сначала в формате Quartus в проект добавить, а чтобы скомпилировать заменить файл где каждая цифра на новой строке.
И со счетчиком тоже немножко повозиться пришлось.
Положил mif файл рядом с iverilog.exe и пошло.
Еще один момент подскажите. Почему проекты на 32 точки и на 512 точек занимают сильно разное количество логических ячеек (при этом меняется только счетчик с 5 битного до 8 битного). Причем сильно разное 37 против 309.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от jeka_rj.

Функция синуса на Verilog 2 нед. 3 дн. назад #7671

  • vadim1
  • vadim1 аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 7
  • Спасибо получено: 1
Пару ошибок обнаружил в начальном посте. Сейчас уже исправить возможности нет.

1) в комментарии к verlilog зачем-то пишу PI/4 там где должно быть PI/2 и соответственно PI*3/4 должно быть PI*3/2.

2) хотя таблица генерируется правильно, вся синусоида - с ошибкой: нижний полупериод сдвинут в низ, так что минимальное значение функции - 0, а должно быть - 1.

вот условно как должно быть:
__11______11
10__10__10__10
______01______01
а у меня вместо этого нижний полупериод оказывается сдвинут вниз до нуля. При числе бит больше двух это конечно не так заметно. Так что я ещё подумаю исправлять ли.

Дело в том что функция должна быть определена (к примеру для N=4) от 0000 до 1111.
Но тогда, sin(0)==sin(PI)== где то между 1000 и 0111. А последнее не так важно. Так что может это будет компромисс такой - то что она в районе sin(PI) криво слегка себя ведёт.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от vadim1.
  • Страница:
  • 1
Время создания страницы: 0.433 секунд

ВКонтакте  facebook  GitHub  YouTube  Twitter
Вы здесь: Начало Forum Наш форум Языки программирования Функция синуса на Verilog