挂在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.mzph.cn/web/2353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT中使用QTableView控件

1.与数据库连接&#xff0c;读取数据库内容到UI界面显示 // 连接SQLite数据库db QSqlDatabase::addDatabase("QSQLITE","second");db.setDatabaseName("./testitem.db"); // 替换为你的数据库文件路径if (!db.open()) {qDebug() << &quo…

工作中常用到的一些sql脚本

– 存储过程查询&#xff08;存储过程/函数 关键词查询&#xff09; select * from pg_proc where lower(prosrc) like ‘%关键字%’; – 复制表数据 insert into 表(字段) select 字段 from 表 where 条件; – 查询重复数据 select COUNT(0),字段名 from 表名 where state …

黑马Minio(对象存储服务MinIO)

3.1 MinIO简介 MinIO基于Apache License v2.0开源协议的对象存储服务&#xff0c;可以做为云存储的解决方案用来保存海量的图片&#xff0c;视频&#xff0c;文档。由于采用Golang实现&#xff0c;服务端可以工作在Windows,Linux, OS X和FreeBSD上。配置简单&#xff0c;基本是…

Spectre-v2 以及 Linux Retpoline技术简介

文章目录 前言一、Executive Summary1.1 Spectre-v2: Branch Predictor Poisoning1.2 Mitigating Spectre-v2 with Retpolines1.3 Retpoline Concept 二、BackgroundExploit Composition 三、(Un-)Directing Speculative Execution四、Construction (x86)4.1 Speculation Barri…

线性代数基础2矩阵

矩阵是什么 矩阵就是二维数组&#xff0c;下面是一个 m 乘 n 的矩阵&#xff0c;它有 m 行&#xff0c;n 列&#xff0c;每行每列上面都有元素&#xff0c;每个元素都有行标i 和列标 j&#xff0c; a ij 。简称m n矩阵&#xff0c;记作&#xff1a; 注意a11的索引是 A[0,0]。…

路由引入,路由过滤,路由策略实验

1&#xff0c;配置IP地址 R1&#xff1a; [R1]dis ip interface brief Interface IP Address/Mask Physical Protocol GigabitEthernet0/0/0 100.1.1.1/24 up up LoopBack0 …

C语言实现扫雷游戏完整实现(上)

文章目录 前言一、新建好头文件和源文件二、实现游戏菜单选择功能三、定义游戏函数四、初始化棋盘五、 打印棋盘函数六、布置雷函数七、玩家排雷菜单八、标记功能的菜单九、标记功能菜单的实现总结 前言 C语言从新建文件到游戏菜单&#xff0c;游戏函数&#xff0c;初始化棋盘…

【免费题库】华为OD机试 - 堆内存申请(Java JS Python C C++)

须知 哈喽,本题库完全免费,收费是为了防止被爬,大家订阅专栏后可以私信联系退款。感谢支持 文章目录 须知题目描述输入描述输出描述解题思路:Java代码:JS代码:Python代码:C++代码:题目描述 有一个总空间为100字节的堆,现要从中新申请一块内存,内存分配原则为:优先…

C语言(static和extern)

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

【六十四】【算法分析与设计】699. 掉落的方块,离散化操作,线段树优化,区间查询sum+区间更新update

699. 掉落的方块 在二维平面上的 x 轴上&#xff0c;放置着一些方块。 给你一个二维整数数组 positions &#xff0c;其中 positions[i] [left(i), sideLength(i)] 表示&#xff1a;第 i 个方块边长为 sideLength(i) &#xff0c;其左侧边与 x 轴上坐标点 left(i) 对齐。 每个…

vuex数据永久存续

第一步下载 vuex 并创建store下js文件 第二步 npm install vuex-persistedstate 第三步 引用 vuex-persistedstate 配置 plugins 项 import createPersistedState from vuex-persistedstateplugins:[createPersistedState({//存储方式&#xff1a;localStorage\sessionStor…

【Linux】开关机命令和服务管理类命令

一般Linux是不会经常进行关机的,关机的正确流程是: sync->shutdown->reboot->poweroff sync: 将内存中的数据同步到硬盘中poweroff: 关闭系统,等同于shutdown -h nowreboot: 重启系统,等同于 shutdown -r nowshutdown[选项] [时间] shutdown命令常见用法: shutdown:…

Vue CLl中的 ref props mixin plugin scoped

ref 属性 ref 被用来给元素或子组件注册引用信息(id的替代者) 应用在 html 标签上获取的是真实 DOM元素 &#xff0c;应用在组件标签上获取的是组件实例对象 vc。 1、如果给普通的dom元素使用&#xff0c;引用指向的是dom元素。 2、如果是给子组件使用&#xff0c;引用指向的…

Gbase数据库的强大审计日志功能-可以无缝记录所有sql脚本

Gbase数据库的强大审计日志功能 Gbase数据库是一个功能强大的数据库系统&#xff0c;其中的审计日志功能能够记录所有操作的SQL语句。通过开启审计日志&#xff0c;你可以详细跟踪数据库中发生的各种操作。下面我将介绍如何开启、关闭审计日志&#xff0c;并导出日志到文本文件…

Vue 3 中 Props 传值的完整指南

一、定义 Props 类型 首先&#xff0c;我们需要定义一个接口来描述我们的props类型。这通常在一个专门的类型声明文件中完成&#xff0c;例如types/index.ts&#xff1a; // types/index.ts export interface Parent {id: number;title: string; } export type ParentArray …

锂电池3.7V-4.2V降3.3V2.8V同步降压WT6015

锂电池3.7V-4.2V降3.3V2.8V同步降压WT6015 WT6015 是一款高效单片同步步降稳压器&#xff0c;采用恒定频率和电流模式架构。该设备提供可调节版本&#xff0c;适应不同的应用需求。在无负载条件下&#xff0c;其电源电流仅为40微安&#xff0c;而在关断状态下&#xff0c;电流…

类之间的关系

文章目录 一、横向关系复合&#xff08;组合&#xff09;委托&#xff08;聚合&#xff09;依赖关联 二、纵向关系&#xff08;继承&#xff09;继承下构造析构执行的顺序继承方法继承中的作用域多重继承 总结 一、横向关系 复合&#xff08;组合&#xff09; 包含与被包含黑色…

《AI聊天类工具之十一——​ MChat》

一.简介 官网:孟子生成式大模型(孟子 GPT) | 澜舟科技-业界领先的认知智能公司 MChat是一款简约的社交聊天软件,具有端到端安全加密的特性,确保用户信息的安全。它支持多种平台,包括Android、iPhone、iPad、iPod touch等,适用于个人和团队协作。在MChat上,用户可以单…

目标检测——YOLOv6算法解读

论文&#xff1a;YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications (2022.9.7) 作者&#xff1a;Chuyi Li, Lulu Li, Hongliang Jiang, Kaiheng Weng, Yifei Geng, Liang Li, Zaidan Ke, Qingyuan Li, Meng Cheng, Weiqiang Nie, Yiduo Li, Bo …

1212332

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…