新人求助!傻傻的ad转换控制程序
时间:10-02
整理:3721RD
点击:
人生的第一个实验:数字电压表,下面是我写的控制ad0809的程序,仿真是正确的,可是下载到版子上后ad0809输出一直是11111111,是程序的问题吗?
其中cs∩wr=START=ALE,cs∩rd=ENABLE
跪谢前辈们!
module ad0809(clk,reset,eoc,data,cs,wr,rd,dout_h,dout_l);
input clk,reset,eoc;
input[7:0] data;
output cs,wr,rd;
output[3:0] dout_h,dout_l;
reg cs,wr,rd;
reg[3:0] state;
reg[3:0] dout_h,dout_l;
parameter IDLE = 4'b0001,
CLEAR = 4'b0010,
CONVERT = 4'b0100,
READ = 4'b1000;
//----------------change states---------------------
always @ (posedge clk or negedge reset)
begin
if(!reset)
state <= IDLE;
else
case (state)
IDLE:
state <= CLEAR;
CLEAR:
state <= CONVERT;
CONVERT:
if(eoc)
state <= READ;
else
state <= CONVERT;
READ:
state <= IDLE;
default: state <= IDLE;
endcase
end
//---------------output----------------------------
always @ (state)
begin
case (state)
IDLE:
begin
cs <= 0;
wr <= 0;
rd <= 0;
end
CLEAR:
begin
cs <= 1;
wr <= 1;
rd <= 0;
end
CONVERT:
begin
cs <= 0;
wr <= 0;
rd <= 0;
end
READ:
begin
cs <= 1;
wr <= 0;
rd <= 1;
{dout_h,dout_l} <= data;
end
endcase
end
endmodule
其中cs∩wr=START=ALE,cs∩rd=ENABLE
跪谢前辈们!
module ad0809(clk,reset,eoc,data,cs,wr,rd,dout_h,dout_l);
input clk,reset,eoc;
input[7:0] data;
output cs,wr,rd;
output[3:0] dout_h,dout_l;
reg cs,wr,rd;
reg[3:0] state;
reg[3:0] dout_h,dout_l;
parameter IDLE = 4'b0001,
CLEAR = 4'b0010,
CONVERT = 4'b0100,
READ = 4'b1000;
//----------------change states---------------------
always @ (posedge clk or negedge reset)
begin
if(!reset)
state <= IDLE;
else
case (state)
IDLE:
state <= CLEAR;
CLEAR:
state <= CONVERT;
CONVERT:
if(eoc)
state <= READ;
else
state <= CONVERT;
READ:
state <= IDLE;
default: state <= IDLE;
endcase
end
//---------------output----------------------------
always @ (state)
begin
case (state)
IDLE:
begin
cs <= 0;
wr <= 0;
rd <= 0;
end
CLEAR:
begin
cs <= 1;
wr <= 1;
rd <= 0;
end
CONVERT:
begin
cs <= 0;
wr <= 0;
rd <= 0;
end
READ:
begin
cs <= 1;
wr <= 0;
rd <= 1;
{dout_h,dout_l} <= data;
end
endcase
end
endmodule
你有检测到EOC信号吗?否则一直都没有read,当然没有输出data了。
另外,看到你rd和read data的采样在同一个cycle,AD的时序是这样的吗?是不是先rd,然后下一个周期再采样输入data的?
READ:
begin
cs <= 1;
wr <= 0;
rd <= 1;
{dout_h,dout_l} <= data;
end
我觉得是你的 {dout_h,dout_l} <= data;有问题,你只在最后一个状态赋值了,但是其他的状态却没有,这就相当于一个锁存器,将输如锁存起来,输入是什么输出就是什么,不变。
解决办法:在其他状态中加入{dout_h,dout_l} <=‘zzzzzz’;
是{dout_h,dout_l} <=6'bzzzzzz;好久不用都忘了。
谢谢谢谢,现在输出已经有了~唉,高手就是高手,虽然我现在还没太搞明白为什么…可是现在输出不稳定,一直在闪,闪得都看不大清楚~
