Verilog实现AD574驱动(有限状态机)
Verilog实现AD574驱动
AD574简介
AD574是12位A/D转换器,引脚图如下图1所示:
pin3-CS(in): 片选 低有效
pin5-RC(in): 状态控制 0-转换,1-读数
pin6-CE(in): 使能
pin16~27-DB(out): AD574转换的12位数据输出
pin28-STS(out): 状态指示:1-转换,0-转换结束
关于pin2(12/8)和pin4(A0)的用法请看下面的真值表
官方也有给出典型的参考电路
我们在了解一款数字芯片时,除了真值表最关心的就是时序图了
在编写程序之前,必须把时序图看明白,官方给出的时序图有两个,图3是转换过程时序图,图4是取数过程时序图
对AD574A 有了充分的了解后,我们来开始编写Verilog程序。
源程序
module ADC574A(clk,DB,clr,STS,CS,CE,RC,q);input clk;
input clr; //复位
input STS; //状态:1-转换,0-转换结束
input [11:0] DB; //AD574转换好的12位数据
output CS; //片选 低有效
output reg CE; //ADC使能
output reg RC; //0-转换,1-读数
output [11:0] q; //12位数据输出parameter S0='d0,S1='d1,S2='d2,S3='d3,S4='d4;
reg [2:0] current_state,next_state;
reg lock; //转换后数据输出锁存信号
reg [11:0] rel; //12位数据寄存器assign CS=0; //片选
assign q=rel;always @(posedge clk or posedge clr)
begin if(clr) current_state<=S0;else current_state<=next_state;
endalways @(posedge lock) //lock上升沿锁存数据
beginrel<=DB;
endalways @(current_state,STS)
begin case(current_state)S0:begin //AD574初始化CE<=1'b0;RC<=1'b1;lock<=1'b0;next_state<=S1; endS1:begin //启动采样CE<=1'b1;RC<=1'b0;lock<=1'b0;next_state<=S2; endS2:begin CE<=1'b1;RC<=1'b0;lock<=1'b0;if(~STS) next_state<=S3; //STS变为0,转换结束else next_state<=S2; //转换未结束,等待 endS3:begin //AD574输出转换好的数据CE<=1'b1;lock<=1'b0;RC<=1'b1;next_state<=S4; endS4:beginCE<=1'b1;RC<=1'b1;lock<=1'b1; //FPGA读取AD输出的数据 next_state<=S0;enddefault: next_state<=S0;endcase;
end
刚开始综合时因为状态编码不当,即写成:
parameter S0=5’b0000,S1=5’b00010,S2=5’b00100,
S3=5’b01000,S4=5’b10000;
一直不能萃取到状态机。
其实官方提供的帮助文档中也给出了状态机的萃取条件,编写状态机时应严格按照要求。下面是文档中的5条要求:
1.表现状态机的信号或变量必须为枚举类型。
2.状态转移必须由clk触发,并且是用if语句检测的上升沿进行转移。
3.状态转移到下一个状态由CASE语句判断
4.所有信号,变量赋值都要放在状态机进程里进行。
5.状态机的状态必须多于两个状态。
RTL图
状态转移图
testbench编写
initial
begin
clk=0;
DB=12'bzzzzzzzzzzzz;
clr=1;
STS=0;
#80 clr=0;STS=1;#160 DB=12'b101111000010;
#160 STS=0;#240 DB=12'bzzzzzzzzzzzz;#80 STS=1;
#160 DB=12'b111111111111;
#160 STS=0;#240 DB=12'bzzzzzzzzzzzz;#80 STS=1;
#160 DB=12'b000000000000;
#160 STS=0;#320 $stop;
$display("Running testbench");
end always
begin
#40 clk=~clk;
end
仿真结果
Verilog实现AD574驱动(有限状态机)相关推荐
- 【Verilog】FPGA驱动Ov7670/Ov7725搭建视频通路(RGB565、灰度图)
一.课题功能指标要求 (一)课程目的 • 加深对数字电路时序的理解: • 掌握 OV 系列摄像头输出时序: • 掌握 I2C 总线时序,以及使用 verilog 驱动三态门的方法: • 掌握数字系统设 ...
- linux 薄膜键盘驱动,有限状态机的嵌入式Linux按键驱动设计
0 引言 一般的按键驱动程序通常非常简单.在程序中一旦检测到按键输入口为低电平时,就采用软件延时10 ms后再次检测按键输入口.如果仍然是低电平则表示有按键按下,便转入执行按键处理程序:否则,当按键 ...
- 用verilog实现L293D 驱动板接口
课程实验做了一个蓝牙智能小车,nexys4开发板,MIPSfpga(一个在 FPGA 上实现的商业 MIPS 处理器软核,Imagination Technologies公司提供给高校免费使用),再加 ...
- Verilog语法_3(同步有限状态机)
September 21, 2016 作者:dengshuai_super 出处:http://blog.csdn.net/dengshuai_super/article/details/525713 ...
- FOC:【3】精品必看!利用Python实现System Verilog多字节UART串口有限状态机自动生成脚本
碎碎念: 向关注的朋友们道个歉,不好意思这一期鸽了这么久.( ̄(工) ̄) 这是一个懒狗不想写1000行的状态机,所以写了1000行的脚本的故事. 虽然本期内容与FOC的直接相关度并不大,由于是在整个项 ...
- 带七段式数码显示管的自动售卖机设计(verilog自学笔记之有限状态机的设计)
采用三段式的方法写一个自动售卖机,功能如下: 共有三种纸币入口,分别支持10元,20元,50元.货物售价80元.需要支持找钱功能(注意,找钱有两种情况,90元和100元:110元和120元的情况不符合 ...
- 【Verilog】FPGA驱动WS2812B点阵
目录 1.整体框架 2.器件选择 WS2812B-64 8x8点阵: 3.手册解读 灯珠引脚: 连接方式: 数据传输方式: 数据波形构成: 数据波形持续时间: 4.模块设计 数据处理模块设计: 控制模 ...
- 有限状态机(FSM)设计原理
1 概述 2 状态机的描述方法 3 FSM的状态编码 4 FSM的Verilog HDL 设计的基本准则及有限状态机设计的一般步骤 基本准则 一般步骤 5 设计举例 51一段式one alwaysFS ...
- FPGA驱动24C04实现读写操作,提供工程源码和技术支持
目录 1.24c04芯片手册解读 2.纯verilog的i2c驱动 3.24c04读写状态机设计 4.上板调试验证 5.福利:工程源码获取 1.24c04芯片手册解读 24c04芯片手册很简单,原理图 ...
最新文章
- [转] 理解RESTful架构
- 自定义ArcGIS JavaScript 工具条样式
- Oracle数据库升级与补丁
- FacetWP 筛选与多条件搜索 WordPress插件
- App列表之拖拽ListView(上)
- 【离散数学】集合论 第三章 集合与关系(5) 集合的笛卡尔积、笛卡尔积对交/并的分配律、集合计数的乘法原理
- python数据爬虫代码_python如何示例爬虫代码
- 知识图谱构建技术综述与实践
- STM32系统结构图理解及GPIO学习笔记
- php 简繁体,php实现简体转繁体
- java框架难吗_java框架难学吗?怎样才能学好java框架?
- ipa安装失败,以及安装办法
- 电商运营数据分析常用分析指标--概述及流量指标
- Excel-DATEDIF函数计算两日期天数差
- java io closed_java.io.IOException: Stream closed 异常的原因和处理
- win10锁屏壁纸文件夹位置
- BFS 巡逻机器人
- C++:子类与父类构造与析构的调用时机
- Point1:STM32根据BRR反推波特率
- 基于S12ZVM的无感FOC失步检测