このDAC とインターフェイスして正弦波を生成するコードを書いています。DAC コントローラーと一緒に、問題なく値を生成するサイン LUT があります。コントローラは CS を Low にし、16 ビット整数をビットごとに供給し、16 カウント後に CS を High にパルスします。パルスと同様に、sin LUT にイネーブル パルスを送信して、もう 1 つの数値をカウントアップします。出力にスパイクが発生しているため、このコードはうまく機能していないようです。これは、CS が高いはずのクロックが CS を低い値として読み取るため (図 1)、DAC が 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. DAC の出力