НА плате установлены последовательно 3 ЦАП последовательно подключенные по SPI интерфесу. ЦАПы AD5685.
Входящий сигнал adressN определяет в какой регистр будет записываться команда.
Входящий сигнал [7:0]adress четыре байта команд и четыре бита, определяющий в какой из каналов ЦАП запишется значение.
[13:0] Data — значение которое запишется непосредственно в ЦАП.
[1:0] Два последних бита, которые зарезервированы под 16 битные ЦАПы, но используются для некоторых команд.
18 строка. SR-триггер который взводиться при приходе сигнала data_ready_in_clk и обнуляется при приходе сигнала R. Пока триггер взведен происходит передача пакета по SPI.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
//SPI (.data(), .adress(), .data_ready(), .clk(), .SPI_clk(), .SPI_data(), .SPI_en()); module SPI ( input [13:0]data, input [7:0]adress, input [1:0]adress2, input [1:0]adressN, input data_ready, input clk, output SPI_clk, output SPI_data, output reg SPI_en ); reg [71:0]registr = 0 ; reg [8:0] count; reg R; SR_triger ( clk, data_ready_in_clk, R,out); input_signal( clk, data_ready, data_ready_in_clk ); assign SPI_data = registr[71]; assign SPI_clk = clk & ~SPI_en; always @ (posedge clk) begin if (data_ready_in_clk) case(adressN) 0: registr[71:0] <= { 48'b100000000000000000111111100000000000000000111111, adress, data, adress2}; 1: registr[71:0] <= {24'b100000000000000000111111, adress, data, adress2, 24'b100000000000000000111111}; 2: registr[71:0] <= { adress, data, adress2, 48'b100000000000000000111111100000000000000000111111}; //3: registr[71:0] <= { 48'b100000000000000000111111100000000000000000111111, adress, data, adress2}; endcase else registr[71:0] <= {registr[70:0], 1'b0}; SPI_en <= ~out; if (out) begin count <= count + 1; if (count == 71) R <= 1; else R <= 0; end else count <= 0; end endmodule |

