Комментарии 12
- использование блокирующих присваиваний (=) в последовательностном блоке (always @(posedge clk)) является некорректным;
- у производителей ПЛИС есть рекомендации на тему использования синхронного/асинхронного ресета и его уровня, следовать им — хороший тон;
- почитайте про inferred ram, inferred rom и функции readmemh, readmemb — с помощью этого можно избежать "зашивания" данных (lut[0] = ...) в код
Для использования inferred ram/rom не нужно явно инстанцировать какую-то IP или мегафункцию. Средства симуляции и синтеза успешно распознают написанную определенным образом Verilog-конструкцию и сами добавляют "вместо нее" блочную память (к слову, это же справедливо для умножителей, DSP-блоков, буферов и т.д.). Для Vivado см. UG901, раздел "RAM HDL Coding Guidelines", для Quartus: Quartus Handbook, раздел "Inferring Memory Functions from HDL Code".
Примеры можно посмотреть вот здесь: интерфейс Quartus — Create New File, Verilog; меню Edit -> Insert Template.
Там есть небольшие различия: какой-то код может синтезится в блокрам для квартуса, но при этом собираться на лутах под вивадой, либо наоборот. Но чаще всего можно прийти к общему знаменателю.
Еще примеры: раз, два.
См. Харрис&Харрис, раздел 4.5.4 "Блокирующие и неблокирующие присваивания". Приведены примеры, почему не стоит использовать блокирующие присваивания в последовательностной логике, и неблокирующие в комбинационной. В одном случае это может привести к некорректному синтезу, а в другом — к замедлению симуляции
Пример — поиск старшей «1» в векторе:
always @(posedge clk) begin n<=-1; for(int i=0; i<N; i++) if(a[i]) n<=i; end
Другой пример — локальные переменные, объявленные внутри последовательного блока, и которые принимают результаты промежуточных вычислений:
alvays@(posedge clk) begin
var [7:0] a;
…
a = …;
…
end
Правильно ли я понял, что разрешающая способность по фазе — всего 64 точки за четверть периода?
Не удалось ли оценить, не даст ли это больше шума квантования, чем разрешение ЦАП (8 бит)?
Параметры шума квантования определяются только разрядностью ЦАП, дисперсия = q^2/12, мат. ожидание = q/2, где q — шаг квантования (q=A/2^N), A — максимум напряжения, N — разрядность ЦАП.
reg [LUT_SIZE-1:0][6:0] lut = {7'h7F, 7'h7E,… 7'h03, 7'h00};
DDS Синтезатор на Verilog