ADN8810驱动

  • 可以直接使用,启动信号大于一个时钟周期即可,启动信号可与写入数据同步输入,也可稍晚输入
//adn8810 椹卞姩
`define data_in_width 12
`define data_width 16
`define state_width 5
`define move_width 5
module adn8810(input clk_100,input rst_n,input start_sig,input [`data_in_width-1:0] data_in,output reg SCLK,output reg CS_adn8810,output reg SDI,output reg RESER_adn
);parameter IDLE = `state_width'd1,RESET_adn = `state_width'd2,Start = `state_width'd4,Work = `state_width'd8,Stop = `state_width'd16;
reg [`state_width-1:0] current_state, next_state;
wire adn_addr = 3'b000;
wire [`data_width-1:0] data;
reg [`data_width-1:0] data_r;
reg [2:0] count_SCLK;
reg [`move_width-1:0] count_move;
assign data = {{1'b0},{adn_addr},{data_in}};always @ (posedge clk_100 or negedge rst_n) if(!rst_n)current_state <= RESET_adn;elsecurrent_state <= next_state; always @ (current_state or start_sig or SCLK or count_SCLK or count_move) //鐢靛钩瑙﹀彂
//    always@(posedge clk_100 or posedge start_sig)case(current_state)RESET_adn:if(count_SCLK ==3'd3)next_state = IDLE;elsenext_state = RESET_adn;IDLE: if(start_sig)next_state = Start; //闃诲璧嬪??elsenext_state = IDLE;Start:if(SCLK == 1'b1)next_state = Work; //闃诲璧嬪??elsenext_state = Start;Work:if( count_move == `move_width'd16 && SCLK == 1'b1 && count_SCLK == 3'd1)next_state = Stop;else    next_state = Work;Stop:if(count_SCLK == 3'd3)next_state = IDLE;elsenext_state = Stop;default:next_state = IDLE;endcase//绗笁涓繘绋嬶紝鍚屾鏃跺簭always妯″潡锛屾牸寮忓寲鎻忚堪娆℃?佸瘎瀛樺櫒杈撳嚭always @ (posedge clk_100 or negedge rst_n)if(!rst_n)beginCS_adn8810 <=1'b1;SDI <=1'b0;RESER_adn <= 1'b1;endelsecase(current_state)IDLE:beginSDI <=1'b0;count_move <= `move_width'd0;endRESET_adn:beginRESER_adn <= 1'b0;if(count_SCLK ==3'd3)RESER_adn <= 1'b1;endWork:beginif(count_SCLK == 3'd3 && SCLK == 1'b1)beginCS_adn8810 <= 1'b0;SDI <= data_r[15];count_move <= count_move + 1'b1;endendStop:beginCS_adn8810 <=1'b1;enddefault:beginCS_adn8810 <=CS_adn8810;SDI <=SDI;count_move <= count_move;RESER_adn <= RESER_adn;end//default鐨勪綔鐢ㄦ槸鍏嶉櫎缁煎悎宸ュ叿缁煎悎鍑洪攣瀛樺櫒endcasealways@(posedge clk_100)beginif(!rst_n)beginSCLK <=1'b0;count_SCLK <= 3'd0;endelse if(current_state == RESET_adn)beginif(count_SCLK == 3'd3)begincount_SCLK  <= count_SCLK;count_SCLK <= 3'd0;endelsecount_SCLK <= count_SCLK +'b1;   end
//          else if(current_state == Start || current_state == Work)beginelse if(current_state == Start  || current_state == Work || current_state == Stop )beginif(count_SCLK == 3'd3)beginSCLK <= ~SCLK;count_SCLK <= 3'd0;endelse count_SCLK <= count_SCLK +'b1;endelse if(current_state == Stop)beginif(count_SCLK == 3'd3)begincount_SCLK <= 3'd0;SCLK  <= 1'b0;endelsecount_SCLK <= count_SCLK + 1'b1;endendalways@(posedge clk_100)beginif(current_state == Start)data_r <= data;else if(current_state == Work && count_SCLK == 3'd0 && SCLK == 1'b0)data_r <= data_r << 1;endendmodule
  • testBench
module adn8810_tb();reg clk_50,rst_n;reg start_sig;reg [11:0] data_in;initialbeginclk_50 = 1'b0;start_sig = 1'b0;rst_n = 1'b1;#3 rst_n = 1'b0;#3 rst_n = 1'b1;#10start_sig = 1'b1;data_in = 12'b1111_0000_1111;#2 start_sig = 1'b0;#1000  start_sig = 1'b0;#10start_sig = 1'b1;data_in = 12'b1010_1010_1010;#2 start_sig = 1'b0;end always #1 clk_50 = ~clk_50;wire CS_adn8810,SCLK, SDI,RESER_adn;adn8810 adn8810(.clk_100(clk_50),                     //input clk_50,.rst_n(rst_n),                    //input rst_n,.start_sig(start_sig) ,                    //input start_sig,.data_in(data_in) ,                    //input [`data_in_width-1:0] data_in,. SCLK(SCLK) ,                   //output reg SCLK,. CS_adn8810(CS_adn8810) ,                   //output reg CS_adn8810,.  SDI(SDI),                   //output reg SDI,.  RESER_adn(RESER_adn)                   //output reg RESER_adn);
endmodule
  • 仿真图

ADN8810 驱动相关推荐

  1. ADN8810电流源的STM32驱动(HAL库)

    文章目录 ADN8810数据手册 ADN8810的硬件电路 CUBEMX配置 Keil编程 调试过程(需要结果可以跳过) 模块化驱动代码 ADN8810.c ADN8810.h main.c 日志输出 ...

  2. 接上篇ADN8810的STM32硬件SPI驱动时钟极性问题

    遇到的问题beij 背景:时钟极性(Clock Polarity)CPOL,默认为LOW. 遇到的问题,首先我是直接给了一个CODE让AND8810能够输出电流,然后按照数据手册给的公式把电流转为CO ...

  3. 嵌入式Linux设备驱动程序:在运行时读取驱动程序状态

    嵌入式Linux设备驱动程序:在运行时读取驱动程序状态 Embedded Linux device drivers: Reading driver state at runtime 在运行时了解驱动程 ...

  4. 0、Spring 注解驱动开发

    0.Spring注解驱动开发 0.1 简介 <Spring注解驱动开发>是一套帮助我们深入了解Spring原理机制的教程: 现今SpringBoot.SpringCloud技术非常火热,作 ...

  5. 安装 Python MySQL 驱动(mysql-connector-python、MySQL-python)

    1. 安装 由于 MySQL 服务器以独立的进程运行,并通过网络对外服务,所以,需要支持 Python 的MySQL 驱动来连接到 MySQL 服务器. 目前,有两个MySQL驱动: mysql-co ...

  6. Linux驱动框架之framebuffer驱动框架

    1.什么是framebuffer? (1)framebuffer帧缓冲(一屏幕数据)(简称fb)是linux内核中虚拟出的一个设备,framebuffer向应用层提供一个统一标准接口的显示设备.帧缓冲 ...

  7. [Ubuntu] 安装/卸载 声卡驱动

    卸载 sudo apt-get --purge remove linux-sound-base alsa-base alsa-utils 安装 sudo apt-get install linux-s ...

  8. pci串口驱动安装失败_TSC TTP-243E Pluse装LTP并口驱动无法安装

    一.前言描述 接到客户报修说,电脑无法开机,即到哥上门维修立即安排人员到现场查看原因,到现场后,查看的确是电脑系统问题,重新安装系统,安装完成系统后,发现打印机无法使用.这个打印机型号是TSC TTP ...

  9. linux mipi驱动分析_寒武纪社招内推数字IC设计、DSI驱动、软件架构、产品经理、芯片架构、工具链开发、深度学习、FAE工程师...

    点击上方蓝字关注我吧! 为什么内推更靠谱?内推是基于人脉关系链的推荐,其背后有一定的信用背书,靠谱的人推荐的人相对也会比较靠谱,所以企业一般职位都是从内部开始分享的,相较于自己海投简历,内推的效率和成 ...

最新文章

  1. [c#]_ELVE_Message多功能用法
  2. 谷歌前CEO对“元宇宙”大泼冷水:AI技术是伪神
  3. SAP License:你适合做SAP顾问吗?
  4. 黑马博客——详细步骤(七)项目功能的实现之文章管理
  5. [转]WF事件驱动(1)
  6. 金融危机下的企业经营战略
  7. paip.设置鼠标灵敏度API
  8. 获取synchronized锁中的阻塞队列中的线程是非公平的
  9. java socket中文编码_Java Socket 中的编码问题
  10. Java API II
  11. JAVA过滤机制——过滤器的概念、工作原理、生命周期
  12. LaTeX数学公式大全
  13. HHKB连不上Ubuntu
  14. 华为3COMSOX法案IT内控实践
  15. 一、回首向来萧瑟处,也无风雨也无晴
  16. css中自适应样式(自媒体)
  17. has been blocked by CORS policy: Response to preflight request doesn‘t pass access control check
  18. 直接插入排序——监视哨的作用
  19. docekerfile文件详解
  20. HCE:提升资源利用率的MapReduce框架

热门文章

  1. jquery-js 美化页面
  2. “AI+教育”想做好有多难?网易有道CEO、学霸君CEO等4位大佬“掏心窝”...
  3. 算法:js 数组 array 去重,并显示所有重复的元素
  4. SEO人员,怎么先发制人做好SEO?
  5. 微博接入TopHolder 数字藏品FAQ
  6. Clone Graph问题及解法
  7. 黑得漂亮!SyScan360黑客大会展示17秒攻陷IE
  8. iproute2;高级路由;ip_route,ip_rule;
  9. php 获取手机屏幕宽度,Swift-使用UIScreen类获取屏幕尺寸
  10. Google I/O 2012 主题演讲直播(第一天)Android 4.1 Jelly Bean们来了