Я пишу код для взаимодействия с this ЦАП для создания синусоидальной волны. У меня есть синус LUT, который генерирует значения просто отлично, а также контроллер ЦАП. Контроллер выводит CS на низкий уровень, подает 16-битное целое число за раз, и импульсы CS до максимума после 16 отсчетов. Так как он выполняет импульсы, он также посылает импульс включения в sin LUT для подсчета еще одного номера. Этот код, похоже, работает не очень хорошо, так как я получаю всплески вывода. Это связано с тем, что часы считывают CS как низкий, когда он должен быть высоким (рисунок 1), заставляя ЦАП считывать 17 бит (другими словами, читать MSB текущего номера как младший бит LSB), что вызывает неудобство шипы (рисунок 2).Как я могу улучшить свой код, чтобы не получить ошибки времени?
Как я могу лучше организовать этот код, чтобы свести к минимуму риск столкнуться с этой проблемой синхронизации?
module DAC_Control(
input [15:0]data_in,
input counter_enable,
input clk,
input rst,
output data_out,
output reg cs,
output reg enable
);
//bit counter
reg [3:0] bit_counter;
//to help with shifting
reg [15:0] shifter;
//shifter
always @(posedge (clk)) begin
if (rst) begin
bit_counter <= 4'b0;
shifter <= 0;
end
else if (counter_enable == 1) begin
shifter <= data_in;
bit_counter <= 4'b0;
end
else begin
shifter <= shifter << 1; // shifting
bit_counter <= bit_counter + 1'b1; // counter
end
end
reg cs_hold;
always @(posedge (clk)) begin
if (rst) begin
enable <= 1'b0;
cs <= 1'b1;
end
else if (bit_counter == 4'b1110) begin
enable <= 1'b1;
cs <= 1'b0;
end
else if (bit_counter == 4'b1111) begin
enable <= 1'b0;
cs <= 1'b1;
end
else if (cs_hold == 1) begin
enable <= 1'b0;
cs <= 1'b1;
end
else begin
enable <= 1'b0; // generate enable signals
cs <= 1'b0;
end
end
assign data_out = shifter[15];
endmodule
Рисунок 1. Желтый DIN, Синий CS, зеленый часы
Рисунок 2. Выходной сигнал ЦАП
Спасибо, это то, что я пытался понять на некоторое время. У меня есть четыре оставшихся вопроса, основанных на этом: 1- Я получаю эти максимальные и минимальные значения из ограничений времени DAC, правильно? 2. Можете ли вы рассказать о том, что вы имеете в виду, когда говорите «вывод данных перемещен относительно данных». 3. Моя доска от Xilinx. Я просмотрел руководство по ограничениям времени и не видел, чтобы код выполнялся эти ограничения, любая идея, где я могу их найти/что делать в Google? 4- у вас есть предложения по дальнейшему чтению о часах, которые ориентированы на новичка? – qasddd
1.Да, вы получаете их прямо из спецификации. Вы можете сделать их более жесткими, если хотите, но не слишком тугими, поскольку вы добавляете дополнительную маршрутизацию задержки и потребляете ресурсы в чипе, чтобы заставить его работать. –
2. Я неправильно напечатал это. Я хотел сказать данные относительно часов. Я только что исправил это в ответе. 3. Если вы используете Vivando, вот ссылка ... см. Главу 4. Это не то же самое, что Altera, но я думаю, вы ее получите. Вы говорите, я хочу, чтобы мои данные меняли это много нс после или перед часами. [vivando using constraints] (http://www.xilinx.com/support/documentation/sw_manuals/xilinx2015_1/ug903-vivado-using-constraints.pdf) 4 - Временные ограничения Google Xilinx, и вы должны получить несколько презентаций и уроков в университете там. –