📄 adc.v.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 + -