打印

看见有人要fpga控制0809,正好俺也刚学,写一个,请砖头伺候

[复制链接]
2176|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
snakeemail|  楼主 | 2007-1-24 22:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/功能:采集10个数据,找出最大的和最小的数据

//McuStart    单片机输入信号,要求FPGA开始工作
//McuReset    复位AD0809
    
//Write 开始AD0809转换
//Read    读取AD0809转换结果
//EOC    AD0809是否转换完成标志
//Data    0809数据口

//我省略了0809de的ALE 和时钟输入 引脚  
//只要不断有McuStart脉冲,就可以不断进行AD转换  ,不过脉冲周期长度要考虑
module    AD0809(Start, Reset, Write, Read, EOC, Data);

input[7:0]  Data;
input    McuStart,    McuReset, ;

output    Write, Read, EOC;

reg TempA[7:0], TempB[7:0];  

always @(negedge McuReset) //复位
begin
    if(McuReset == 1'b0)
        begin
            Write = 0;
            Read  = 0;
        //    ALE      = 0;
            TempA = 8b'00000000;
            TempB = 8b'00000000;
        end 
//    else  这里不加else,不知是否有问题?       
        
        
end

always @(negedge Start)
begin
     if((Start == 1'b0) && (McuReset == 1'b0))//
         begin
              Write = 1;  
         //    Read = 0; 
             Write = 0;  //产生一个写脉冲,0809开始转换 
             // 但是我想不出如何延时,以加宽脉冲  !!
         end
end

always @(posedge EOC)
begin
    if(EOC == 1'b1)
    begin 
        Read = 1;
        Write = 0;
        Read = 0;// 产生一个读脉冲
        TempA = Data;
        if(TempA > TempB)
        begin
            TempB = TempA;
        end
        
    end
end

endmodule

相关帖子

沙发
weibin82| | 2007-1-25 10:46 | 只看该作者

???

eoc不是输出嘛?
always @(posedge EOC)
这样也可以?

使用特权

评论回复
板凳
snakeemail|  楼主 | 2007-1-25 11:17 | 只看该作者

搞错了,谢谢楼上,EOC应该为输入

使用特权

评论回复
地板
eastbest| | 2007-1-25 17:37 | 只看该作者

拍一个砖头

楼主,在几个always 里对同一个寄存器赋值是不行的!

使用特权

评论回复
5
snakeemail|  楼主 | 2007-1-27 18:52 | 只看该作者

回楼上,那就去掉以下的语句.

TempA = 8b'00000000;
 TempB = 8b'00000000;

使用特权

评论回复
6
snakeemail|  楼主 | 2007-1-28 00:09 | 只看该作者

重新整理后的程序

//功能:采集数据,找出最大的数据

//McuStart    单片机输入信号,要求FPGA开始工作
//McuReset    复位AD0809
    
//Write 开始AD0809转换
//Read    读取AD0809转换结果
//EOC    AD0809是否转换完成标志
//Data    0809数据口

//我省略了0809de的ALE 和时钟输入 引脚  
//只要不断有McuStart脉冲,就可以不断进行AD转换  ,不过脉冲周期长度要考虑
module    AD0809(McuStart, McuReset, Write, Read, EOC, Data);

input[7:0]  Data;
input    McuStart,    McuReset, EOC;

output    Write, Read;

reg TempA[7:0], TempB[7:0];  

always @(negedge McuReset) //复位
begin
    if(McuReset == 1'b0)
        begin
            Write = 0;
            Read  = 0;
        //    ALE      = 0;
        //    TempA = 8b'00000000;
        //    TempB = 8b'00000000;
        end 
//    else  这里不加else,不知是否有问题?       
        
        
end

always @(negedge McuStart)//
begin
     if((McuStart == 1'b0) && (McuReset == 1'b0) && (EOC ==1) )//
         begin
              Write = 1;  //
              Read  = 0; 
              Write = 0;  //产生一个写脉冲,0809开始转换 
             // 但是我想不出如何延时,以加宽脉冲  ?
         end
end

always @(posedge EOC)
begin
    if(EOC == 1'b1)
    begin 
        Read = 1;
        Write = 0;
        Read = 0;// 产生一个读脉冲,这里也要加延时,不知如何加
        TempA = Data;
        if(TempA > TempB)
        begin
            TempB = TempA;
        end
        
    end
end

endmodule

使用特权

评论回复
7
eastbest| | 2007-1-28 10:33 | 只看该作者

这种程序连编译都通不过

楼主可以自己上机验证一下,多实践吧!

使用特权

评论回复
8
snakeemail|  楼主 | 2007-1-28 19:25 | 只看该作者

我想换个思路,利用时钟触发,不去考虑EOC信号

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

547

主题

1910

帖子

8

粉丝