|
项目紧急,特黏贴自己写的读数据时序,请有经验的牛人指教一二,谢谢!!
module single_conversion(
sclk,
cs_n,
conv_en,
adc_sdi,
adc_sdo,
adc_data,
conv_done_flag
);
input sclk;
input cs_n;
input conv_en;
output adc_sdi;
input adc_sdo;
output [23:0] adc_data;
reg adc_sdi;
wire [23:0] adc_data;
output conv_done_flag;
wire conv_done_flag;
//***********************************************************
integer ir = 0;
reg [7:0] cmd;
reg [7:0] cmd_flag;
wire [31:0] data_reg;
reg write_en;
reg read_en;
wire read_done_flag;
reg conv_done;
reg [5:0] cnt_sdo;
reg conversion_done;
initial
begin cmd <= 8'd0;
cmd_flag <= 8'd0;
conv_done <= 1'b0;
write_en <= 1'b0;
read_en <= 1'b0;
cnt_sdo <= 6'd0;
conversion_done <= 1'b0;
end
always @(negedge sclk)
begin
if(!cs_n)
begin
if((conv_en)&&(!conv_done))
ir <= ir + 1;
else
begin conv_done <= 1'b0;
ir <= 0;
end
if((ir>0)&&(ir<=10))//write_cmd
begin write_en <= 1'b1;
cmd <= 8'b10_000_000;//single conversion
end
if((ir>10)&&(ir<=7602))//7600sclk
begin write_en <= 1'b0;
cmd <= 8'd0;
read_en <= 1'b0;
end
if((ir>7600)&&(!adc_sdo)&&(!conv_done))
begin cnt_sdo <= cnt_sdo + 1'b1;
if((cnt_sdo>=6'd1)&&(cnt_sdo<=6'd41))
conversion_done <= 1'b1;
else
conversion_done <= 1'b0;
end
if((ir>7602)&&(conversion_done))//read
begin read_en <= 1'b1;
cmd_flag <= 8'b0000_0000;
end
if(read_done_flag)
begin read_en <= 1'b0;
conv_done <= 1'b1;
cmd_flag <= 8'd0;
conversion_done <= 1'b0;
cnt_sdo <= 6'b0;
end
end
else
begin
write_en <= 1'b0;
read_en <= 1'b0;
conv_done <= 1'b0;
cmd <= 8'd0;
cmd_flag <= 8'd0;
cnt_sdo <= 6'd0;
conversion_done <= 1'b0;
end
end
wire write_cmd_done_flag;
adc_write_init U_write(
.sclk (sclk),
.cs_n (cs_n),
.init_en (write_en),
.cmd (cmd),
.adc_sdi (adc_sdi1),
.write_cmd_done_flag (write_cmd_done_flag)
);
adc_read U_read(
.sclk (sclk),
.cs_n (cs_n),
.read_en (read_en),
.cmd (cmd_flag),
.rxd_data (data_reg),
.adc_sdi (adc_sdi2),
.adc_sdo (adc_sdo),
.read_done_flag (read_done_flag)
);
wire adc_sdi1;
wire adc_sdi2;
always @(negedge sclk)
begin
if((write_en)&&(!write_cmd_done_flag)) adc_sdi <= adc_sdi1;
else if((read_en)&&(!read_done_flag)) adc_sdi <= adc_sdi2;
else adc_sdi <= 1'b0;
end
assign adc_data = data_reg[31:8];
assign conv_done_flag = conv_done;
endmodule |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|