我正在编写代码来与这个DAC 接口以产生正弦波。我有一个可以很好地生成值的正弦 LUT,以及一个 DAC 控制器。控制器将 CS 拉低,逐位输入 16 位整数,并在 16 次计数后将 CS 拉高。当它发出脉冲时,它还会向 sin LUT 发送一个使能脉冲,以增加一个数字。这段代码似乎不能很好地工作,因为我的输出出现了峰值。这是因为时钟在本应为高时读取 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 的输出