22seu_08 发表于 2010-1-11 16:18:03

求助:关于FPGA控制CS5532

项目紧急,特黏贴自己写的读数据时序,请有经验的牛人指教一二,谢谢!!
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 adc_data;
reg adc_sdi;
wire adc_data;
output conv_done_flag;
wire conv_done_flag;
//***********************************************************
integer ir = 0;
reg cmd;
reg cmd_flag;
wire data_reg;
reg write_en;
reg read_en;
wire read_done_flag;
reg conv_done;
reg 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_initU_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;
assign conv_done_flag = conv_done;
endmodule

22seu_08 发表于 2010-1-11 19:11:15

求教~~~~

22seu_08 发表于 2010-1-13 17:14:35

求教~~~
页: [1]
查看完整版本: 求助:关于FPGA控制CS5532