⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adc.v.bak

📁 对AD0809进行操作
💻 BAK
字号:
//这是一个ADC的程序,ADC芯片用的是ADC0809;输出直接将从ADC读出的8位二进制值
//赋给8个发光二极管;
//程序编写者:高培
//编写时间:   2009年5月21日
//主要遇到问题
//1:编写状态机的程序,在ST2中对START置1,然后没有对其置0
//(即没有下降沿)就开始对EOC进行判断。但是ADC的转换,需要上升沿复位内部的逐次
//逼近寄存器,还需要一个下降沿(MCU对其置0)才能开始AD转换;解决办法是添加了
//一个状态,对START置0后才开始对EOC进行判断;
//2:对于状态的转换条件编写有错,在状态转换的ALWAYS敏感表中加
//入了clk 时钟,但是下面的几个状态转换和CLK无关,而与CLK1有关系,所以把敏感变
//量表中的CLK改成了CLK1            
module ADC(
                  //input
                  clk,
                  data,
 	              eoc,
	              rst_n,
                  //output
				  oe,
				  ale,
				  clk1,
				  start,
				  out);
//INPUT
input clk;      //clk 是时钟信号输入端,为50MHz
input [7:0]data;   //data 是ADC转换结果输入端
input eoc;     //eoc是ADC转换结束的信号
input rst_n;   // rst_n是复位信号
//OUTPUT 
output reg oe;          //oe是控制ADC允许输出转换结果的控制位
output reg ale;         //ale是ADC地址信号的锁存控制
output clk1;       //clk1是ADC的时钟信号
output  start;      //start是ADC的开始转换控制位   
output wire [7:0]out;

//ADC驱动时钟
reg[4:0]num;      //num 是计数变量
reg clk1_r;         //clk1_r 是clk1的寄存器
wire clk1;

always@(posedge clk or negedge rst_n)  
if(!rst_n)
 num<=5'b0;
else
 num<=num+1'b1;     //来一个时钟计数变量加一

always@(posedge clk or negedge rst_n )
if(!rst_n)
 clk1_r<=0;
else if(num==5'd25)  //当记数值等于25的时候CLK1反转一次,50分频
 clk1_r<=~clk1_r;

assign clk1=clk1_r;

//ADC状态机
reg [5:0]state;
reg [7:0]data_r;
parameter st0=6'b000001,
          st1=6'b000010,
          st2=6'b000100,
          st3=6'b001000,
          st4=6'b010000,
          st5=6'b100000;

always@(posedge clk1 or negedge rst_n)
if(!rst_n)
    begin
        state<=st0;
        oe<=0;
        ale<=0; 
        start<=0;
    end
else
	case(state)
	st0:	 begin
				 state<=st1;
				 oe<=0;
				 ale<=0; 
				 start<=0;
			 end
			


	st1:	 begin
				 state<=st2;
				 oe<=0;
				 ale<=1; 
				 start<=0;    
			 end
	

			 
	st2:
			begin				 
			     state<=st3;
				 oe<=0;
				 ale<=0; 
				 start<=1;
			end


	st3:
			begin				
			     state<=st4;
				 oe<=0;
				 ale<=0; 
				 start<=0;
			end

   
	st4:if(eoc)
	        begin
			    state<=st5;
				oe<=1;
				ale<=0; 
				start<=0;	
		    end
		else
		    state<=st4;		    
	
	st5:	begin
				state<=st0;
				oe<=1;
				ale<=0;
				start<=0;
				data_r<=data;
			end

   

	 default:state=6'bx;
	endcase


assign out=data_r;

endmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -