基于FPGA的AD转换_模数转换_数字电压表

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

begin i<=i+1'b1; if(i<5'd19) begin // AD_CS<=1'b1; state<=CONVERT; end else begin i<=5'd0; state<=CS_0; end end CS_0: begin state<=READ; i<=i+1'b1; r_data[7-i]<=AD_DATA; 的最高位读出。见元件说明书; end READ: begin //AD_CS<=1'b0; if(i<5'd8) begin i<=i+1'b1; r_data[7-i]<=AD_DATA; state<=READ; end else begin i<=5'd0; r_data[7-i]<=AD_DATA; state<=LOAD; AD_CS<=1'b1;//是否在此处拉高 CS, 待验证! //目的是,在 AD_CLK 还没产生的时候,先将数据
module AD_1(clk,AD_DATA,AD_CLK,AD_CS,VOLT); input clk;//输入 50MHZ 的时钟; input AD_DATA;// 串行 AD 的数据端口。 output AD_CLK,AD_CS; output [7:0]VOLT; reg AD_CLK_R=0;//1MHz 的时钟; reg [4:0]cnt_1MHz=0; reg [3:0]state=0;//状态标志 reg [4:0]i=0;//对 1MHz 的时钟进行计数,以控制每个状态的时间; reg [7:0]r_data;//从高位到低位,逐位接收串口的数据; reg [7:0]VOLT; //产生 1MHz 的 AD_DATA;注意,可能过快! ! always @(posedge clk) begin if(cnt_1MHz==5'd24)//低于 1MHz begin cnt_1MHz<=5'd0; AD_CLK_R<=~AD_CLK_R; end else cnt_1MHz<=cnt_1MHz+1'b1; end //对 TLC549 的控制和读取; //定义状态机 parameter IDLE=4'b000,//闲置状态,用来转至 CONVERT,除非有意外,不再返回 IDLE; CONVERT=4'b0001,//开始转换,保持 AD_CS 高电平 20us; CS_0=4'b0010, READ=4'b0100,//开始读数,由于 AD 芯片在下降沿产生数据,且在 AD_CS 拉低的同时,数据的最高位已经出现,故在上升沿读数据 //READ 状态持续 8 个时钟,读取 8 位数据,读完数据 后,在第 8 个时钟结束后,将 AD_CS 拉高; LOAD=4'b1000;//将 READ 中读取的 8 位数据赋给 8 位寄存器变量 VOLT, 并返 回至 CONVERT 状态; assign AD_CS=(state==READ||state==CS_0)?1'b0:1'b1; assign AD_CLK=(state==READ)?AD_CLK_R:1'b0;//注意,CS 拉低后,要至少间隔 1.4us 才能出 现 AD_CLK 的上升沿; always @(posedge AD_CLK_R)//notice!!!!!!!!!!!! begin case(state) IDLE: begin state<=CONVERT; i<=5'd0; end LOAD: begin
VOLT<=r_data;//得到 8 位数据,以便进行对其运算和显示; state<=CONVERT; end default: state<=IDLE; endcase end endmodule
相关文档
最新文档