挂在Avalon总线上的AD7656芯片驱动verilog程序实现

        AD7656是一款16位同步采样双极ADC转换器,本文中用状态机方式实现了AD7656芯片的Verilog驱动,并且将驱动直接挂在了altera芯片的Avalon总线上,使其altera芯片能够通过总线直接控制ADC芯片,其代码如下:

module AD7656_drive(clk,rst_n,slave_rd_n,slave_cs_n,slave_address,slave_rddata,ad_cs_n,sclking,sclk,CONVST,DOUTA,DOUTB); 
//-------------------------------------------- 
    input clk;
    input rst_n;
     input sclking; 
     wire  sclk;    
//-----------------------------------------
//Avalon--MM interface
    input  slave_rd_n;
    input  slave_cs_n;  
    output[31:0] slave_rddata;
    input [1:0]slave_address;
    
    reg  [31:0] slave_rddata;
//------------------------------------------
//AD7656 interface
    reg[31:0]data_in_A/* synthesis noprune */;
    reg[31:0]data_in_B/* synthesis noprune */;
    
    output reg   CONVST;///
    output       sclk; ///
    output reg   ad_cs_n;
    input        DOUTA;//
    input        DOUTB;
//------------------------------------------------    
    
     reg [5:0] bitnum; ///
     
     reg [3:0]  delay_200ns; //
     reg [8:0]  delay_4_us;

     reg [2:0] cstate;//
     reg [2:0] nstate;//
     parameter empty=0,start=1,delay_4us=2,data_transfer=3,stop=4,transfer_interval=5;
//----------------------------------------------------------------------------------------------------
assign  sclk=sclking;    ///the deg is 0 compared with the primitive input clk
//-----------------------------------------------------------------------------------------------------
//reset  module-----we apply the asynchronous reset and release the reset  signal synchronously
reg rst_nr1,rst_nr2;
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)   rst_nr1<=0;
    else              rst_nr1<=1;
end

always @(posedge clk  or negedge rst_n)begin
    if(!rst_n)       rst_nr2<=0;
    else                  rst_nr2<=rst_nr1;
end
//-------------------------------------------------------------------------------------------------------
//pulse-generation technique---refer to Recommend Design Practices (9-7) in Quartus II Help for details 
reg pulse1,pulse2;
wire sclk_neg;  //check the  negedge edge of sclk
always @(posedge clk or  negedge  rst_nr2)begin
    if(!rst_nr2)begin
        pulse1<=1;
        pulse2<=1;    
    end
    else  begin
        pulse1<=sclk;
        pulse2<=pulse1;                
    end
end

assign  sclk_neg=(~pulse1)&&pulse2;
//------------------------------------------------------------------------------------------------------------
reg pulse3,pulse4;
wire sclk_pos;  //check the  posedge edge of sclk
always @(posedge clk or  negedge  rst_nr2)begin
    if(!rst_nr2)begin
        pulse3<=0;
        pulse4<=0;    
    end
    else  begin
        pulse3<=sclk;
        pulse4<=pulse3;                
    end
end
assign  sclk_pos=pulse3&&(~pulse4);
//---------------------------------------------------------------------------------------------------------
//assign ad_cs_n=~(nstate==data_transfer|nstate==start);
//----------------------------------------------------------------------------------------------------
always @(posedge clk or negedge rst_nr2)
begin
    if(!rst_nr2)                 bitnum<=6'd0; 
    else if(nstate==start)    bitnum<=6'd31;
    else if((nstate==data_transfer)&& sclk_neg)   bitnum<=bitnum-1;
    else if(nstate==stop)    bitnum<=0;
end
//-----------------------------------------------------------------------------------------------------
//delay  module-----------delay  4us to save conversion's time
always@(posedge clk or negedge rst_nr2)//develop  latch??
    if(!rst_nr2)                                      delay_4_us<=0;
    else if((nstate==delay_4us)&&sclk_pos)  delay_4_us<= delay_4_us+1'd1;//why nstate??
    else if(nstate==empty)                        delay_4_us<=0;    
   wire flag_4us=(delay_4_us==4);//the mark of counter's arrival 
//---------------------------------------------------------------------------------------------------
//delay  module-----------delay  200ns to indicate transfer interval
always@(posedge clk or negedge rst_nr2)//develop  latch
    if(!rst_nr2)                                      delay_200ns<=0;
    else if((nstate==transfer_interval)&&sclk_neg)    delay_200ns<= delay_200ns+1'd1;
    else if(nstate==empty)                        delay_200ns<=0;    
   wire flag_200ns=(delay_200ns==1); //the mark of counter's arrival     
//----------------------------------------------------------------------------------------------------
always @(posedge clk or negedge rst_nr2)    
begin
     if(!rst_nr2) cstate<=empty;
     else begin
            cstate <= nstate;
         end
end
//----------------------------------------------------------------------------------------------------
always @(cstate or sclk_neg or bitnum or flag_4us or flag_200ns)  //this is a combinational logic
        begin
                case (cstate)
                empty:  nstate <= delay_4us;                                 
                delay_4us: begin   ///
                    if (flag_4us&&sclk_neg)
                        nstate = start;                                                 
                    else
                        nstate = delay_4us;
                end
                start: begin
                    if (sclk_neg)
                    begin
                        nstate = data_transfer;
                    end
                    else
                        nstate = start;
                end
                data_transfer: begin
                    if (sclk_neg&&(bitnum==6'd0))
                        nstate = stop;
                    else
                        nstate = data_transfer;
                end
                stop: begin   //question 
                    if (sclk_neg)
                        nstate = transfer_interval;
                    else
                        nstate = stop;
                end
                transfer_interval: begin //cun zai wen  ti 
                    if (flag_200ns&&sclk_neg)
                        nstate = empty;
                    else
                        nstate = transfer_interval;
                end
               default:  begin 
                          nstate  = 'hx; 
                     end        
            endcase
            end
//---------------------------------------------------------------------------------------------------
//3rd always block,the sequential FSM output
always @(posedge clk or negedge rst_nr2)    
     if(!rst_nr2) begin
             CONVST<=0;
                ad_cs_n<=1; 
                end
     else begin
                begin
                CONVST<=0;
                ad_cs_n<=1; 
                end
            case(cstate)
            empty:          begin 
                        CONVST<=0;
                        ad_cs_n<=1; 
                            end
            delay_4us:  begin 
                        CONVST<=1;
                            ad_cs_n<=1; 
                            end
            start:          begin 
                            CONVST<=1; 
                            ad_cs_n<=0; 
                            end
            data_transfer:begin 
                            if(bitnum==16&&(sclk ==1))
                              begin
                                CONVST<=1;
                                ad_cs_n<=1; 
                              end
                            else
                              begin
                               CONVST<=1;
                                ad_cs_n<=0; 
                              end
                            end
            stop:            begin 
                            CONVST<=1;
                            ad_cs_n<=1; 
                            end
            transfer_interval:begin
                        CONVST<=0;
                            ad_cs_n<=1; 
                            end
         endcase
         end
//-------------------------------------------------------------------------------------------------------
//Avalon--MM interface
wire slave_rdcs_n=slave_rd_n|slave_cs_n;

always@(posedge clk or negedge rst_nr2)
begin 
        if(!rst_nr2)     slave_rddata[31:0]<=0;
        else if(slave_rdcs_n && slave_address==2'h0)  
        slave_rddata[31:0]<=data_in_A;
        else if(slave_rdcs_n && slave_address==2'h1)  
        slave_rddata[31:0]<=data_in_B;
        else
        slave_rddata[31:0]<=slave_rddata[31:0];        
end
//----------------------------------------------------------------------------------------------------
always @(posedge clk or negedge rst_nr2)
    if(!rst_nr2)begin            
        data_in_A[31:0]<=0;
        data_in_B[31:0]<=0;
        end
    else if((nstate==data_transfer)&&sclk_neg)begin   
       data_in_A[bitnum]<=DOUTA; 
        data_in_B[bitnum]<=DOUTB;
        end
        
//------------------------------------------------------------------------------------------------------
endmodule 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/568000.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Nginx】centos和Ubuntu操作系统下载Nginx配置文件并启动Nginx服务详解

目录 &#x1f337; 安装Nginx环境 &#x1f340; centos操作系统 &#x1f340; ubuntu操作系统 &#x1f337; 安装Nginx环境 以下是在linux系统中安装Nginx的步骤&#xff1a; 查看服务器属于哪个操作系统 cat /etc/os-release安装 yum&#xff1a; 如果你确定你的系统…

Linux驱动开发——(四)内核定时器

一、内核的时间管理 1.1 节拍率 Linux内核中有大量的函数需要时间管理&#xff0c;比如周期性的调度程序、延时程序等等&#xff0c;对于驱动编写者来说最常用的是定时器。 硬件定时器提供时钟源&#xff0c;时钟源的频率可以设置&#xff0c;设置好以后就周期性的产生定时中…

linux负载均衡 和 系统负载分析笔记

1 负载均衡 1.1 计算负载 1.1.1 PELT算法简介 从Linux3.8内核以后进程的负载计算不仅考虑权重&#xff0c;⽽且跟踪每个调度实体的历史负载情况&#xff0c;该算法称为PELT(Per-entity Load Tracking) 《奔跑吧Linux内核》卷1&#xff1a;基础架构&#xff1b;P505 相关资料…

stack、queue(priority_queue)的模拟实现和deque的简单介绍

stack和queue(priority_queue) 1. 容器适配器 适配器(Adapter)&#xff1a;一种用来修饰容器(Containers)或仿函数(Functors)或迭代器(Iterator)接口的东西。 适配器是一种设计模式&#xff0c;该模式将一个类的接口转换成客户希望的另外一个接口。 现实中拿插座来说&#xf…

serverLess

第一步 安装依赖 npm install serverless-devs/s g 第二步 配置秘钥&#xff1a; 第三步 执行终端 执行命令 s config add 选择 alibaba cloud &#xff08;alibaba&#xff09; 把对应的ID secret填写&#xff0c;第三个别名可以随便写&#xff1a; serverLess 查看是…

ClickHouse 高可用之副本

文章目录 ClickHouse 副本支持副本的引擎配置高可用副本副本应用1.副本表概述2.创建副本表3.写入模拟数据4.副本验证 扩展 —— 在 Zookeeper 中查看副本表信息 ClickHouse 副本 ClickHouse 通过副本机制&#xff0c;可以将数据拷贝存储在不同的节点上。这样&#xff0c;如果一…

Redis底层数据结构之Dict

目录 一、概述二、Dict结构三、Dictht结构四、DictEntry结构五、核心特性 上一篇文章 reids底层数据结构之quicklist 一、概述 Redis 的 Dict 是一个高效的键值对映射数据结构&#xff0c;采用双哈希表实现以支持无锁的渐进式 Rehash&#xff0c;确保扩容或缩容时的高效性能。…

linux autogroup

一&#xff1a;概述 对于linux autogroup的作用&#xff0c;很多同学可能是听说过&#xff0c;但&#xff0c;并未验证过。 考虑下面场景&#xff0c;开两个terminal&#xff0c;T1和T2&#xff0c;在T1中运行进程P1&#xff0c;P1开启9个线程编译代码&#xff0c;在T2中运行…

Datawhale ChatGPT基础科普

根据课程GitHub - datawhalechina/hugging-llm: HuggingLLM, Hugging Future. 摘写自己不懂得一些地方&#xff0c;具体可以再到以上项目地址 LM&#xff1a;这是ChatGPT的基石的基石。 Transformer&#xff1a;这是ChatGPT的基石&#xff0c;准确来说它的一部分是基石。 G…

销售经理与员工:如何展开有效的绩效面谈

在当今竞争激烈的商业环境中&#xff0c;销售经理与员工之间的绩效面谈显得尤为重要。有效的绩效面谈不仅能够提升员工的工作积极性&#xff0c;促进团队的整体绩效&#xff0c;还能够加强销售经理与员工之间的沟通与理解&#xff0c;为企业的发展奠定坚实的基础。本文将探讨销…

7.2K star!一个完全免费,可以本地部署的 AI 搜索聚合器。新手可尝试

原文链接&#xff1a;7.2K star&#xff01;一个完全免费&#xff0c;可以本地部署的 AI 搜索聚合器。新手可尝试 ChatGPT 刚上线的时候我用的很少&#xff0c;还是习惯用 Google。主要还是因为不信任&#xff0c;怕它对我胡说八道。 慢慢的&#xff0c;也没有一个明确的时间…

Linux的学习之路:19、进程信号(1)

摘要 今天这张说一下信号的一部分知识 目录 摘要 一、信号 1、生活角度的信号 2、技术应用角度的信号 3、注意 4、用kill -l命令可以察看系统定义的信号列表 5、信号处理常见方式概览 二、产生信号 1、通过终端按键产生信号 2、调用系统函数向进程发信号 3、由软件…

<前端>Electron-builder为公证后的app打更新信息latest.yml

MacOS下&#xff0c;Electron-builder可以很方便的为测试包app打更新信息&#xff08;latest-mac.yml&#xff09;。 但是&#xff0c;正式发布的时候&#xff0c;不可能用测试包app&#xff0c;因为还没有进行公证。如何为公证的app打latest-mac.yml呢。 其实观察latest-mac.y…

FPGA秋招-笔记整理(1)

一、关键路径 关键路径通常是指同步逻辑电路中&#xff0c;组合逻辑时延最大的路径&#xff08;这里我认为还需要加上布线的延迟&#xff09;&#xff0c;也就是说关键路径是对设计性能起决定性影响的时序路径。也就是静态时序报告中WNS&#xff08;Worst Nagative Slack&…

Git 核心概念与实操

这里写目录标题 1 版本回退2 工作区、暂存区、本地仓库、远程仓库 1 版本回退 原文链接&#xff1a;https://www.liaoxuefeng.com/wiki/896043488029600/897013573512192 首先 git log 查看提交记录 在Git中&#xff0c;用 HEAD 表示当前版本 上一个版本就是 HEAD^ &#xff…

Linux-进程间通信:System V消息队列

目录 System V IPC概述标识符与IPC Key System V消息队列创建或打开一个消息队列发送消息接收消息控制消息队列1、IPC_STAT2、IPC_SET3、IPC_RMID 查看系统当前的消息队列代码示例 System V IPC&#xff08;Inter-Process Communication&#xff09;是一组用于在 Unix-like 操作…

【C语言】手撕二叉树

标题&#xff1a;【C语言】手撕二叉树 水墨不写bug 正文开始&#xff1a; 二叉树是一种基本的树形数据结构&#xff0c;对于初学者学习树形结构而言较容易接受。二叉树作为一种数据结构&#xff0c;在单纯存储数据方面没有 顺序表&#xff0c;链表&#xff0c;队列等线性结构…

sklearn 笔记 metrics

1 分类 1.1 accuracy_score 分类准确率得分 在多标签分类中&#xff0c;此函数计算子集准确率&#xff1a;y_pred的标签集必须与 y_true 中的相应标签集完全匹配。 1.1.1 参数 y_true真实&#xff08;正确&#xff09;标签y_pred由分类器返回的预测标签normalize 默认为 Tr…

Linux:Win10平台上,用VMware安装Centos7.x及系统初始化关键的相关配置(分步骤操作,详细,一篇足以)

VMware安装Centos7.x镜像的详细步骤&#xff1a;VMWare安装Centos系统&#xff08;无桌面模式&#xff09; 我这里是为了安装Hadoop集群&#xff0c;所以&#xff0c;以下这些步骤是必须进行的 如果你是学习Linux&#xff0c;可以跳过非必须的那些配置项 我安装的版本是&…

前端实现将二进制文件流,并下载为excel文件

目录 一、关于二进制流二、项目实践三、常见问题及解决 一、关于二进制流 含义&#xff1a;二进制流是一种计算机文件格式&#xff0c;它的数据以二进制形式存储&#xff0c;与文本文件不同。 二进制文件可以包含任意类型的数据&#xff0c;例如&#xff1a;图像、音频、视频…
最新文章