利用状态机实现比较复杂的接口设计:

这是一个将并行数据转换为串行输出的变换器,利用双向总线输出。这是由EEPROM读写器的缩减得到的,首先对I2C总线特征介绍:

I2C总线(inter integrated circuit)双向二线制串行总线协议为:只有总线处于“非忙”状态时,数据传输才开始。在数据传输期间,只要时钟线为高电平,数据线都必须保持稳定,否则数据线上的任何变化都被当作“启动”或“停止”信号。

下面介绍A、B、C、D的工作状态:

(1)总线处于非忙状态(A段):该段内的数据线(sda)和时钟线(scl)都保持高电平;

(2)启动数据传输(B段):当时钟线(scl)为高电平时,数据线(sda)由高电平变为低电平的下降沿被认为是“启动”信号;

(3)停止数据传输(C段):当时钟线(scl)为高电平时,数据线(sda)由低电平变为高电平的上升沿被认为是“停止”信号;

(4)数据有效(D段):在出现“启动”信号之后,在时钟线(scl)为高电平时,数据线是稳定的,这是数据线上的数据就是要传送的数据,数据线上的数据改变必须在时钟线(scl)为低电平期间完成,每个数据占用一个时钟;

(5)应答信号:每个正在接受数据的EEPROM在接收到一个字节的数据后,通常需要发出一个应答信号;而每个正在发送数据的EEPROM在发出一个字节的数据后,通常需要接受一个应答信号;EEPROM读写控制器必须提供一个与这个应答信号相联系的二外的始终脉冲。

其控制字节一共有8位:1010xxxW/R 其中1010是I2C总线器件特征编码,xxx表示地址,W/R表示读写状态。

在实现并行输入串行输出时,需要两个状态机:

主状态机主要控制内部存储器和输入端的连接,以及给出应答信号;从状态机主要负责总线连接时,内部寄存器的最高位输出个移位;

状态机的源码如下:

 module parallel_to_serial(rst,clk,addr,data,sda,ack);
input rst,clk;
input [:]data,addr; inout sda; //data bus
output ack; //ask for next address/data writting wo eeprm;
reg link_write; //whether connect to output
reg [:]state; //main status,
reg [:]sh8out_state; //serial output status
reg [:]sh8out_buf; //output data buffer
reg finish_F; //whether finished an operation of main status
reg ack; parameter idle=, addr_write='d1, data_write=3'd2, stop_ack='d4; //main status code
parameter bit0=, bit1=, bit2=, bit3=, bit4=, bit5=, bit6=, bit7=; //serial output status code assign sda=link_write?sh8out_buf[]:'bz; //??????????? always @(posedge clk)
begin
if(!rst) //reset
begin
ack<=;
link_write<=; //???????
finish_F<=;
state<=idle;
sh8out_state<=idle;
sh8out_buf<=;
end
else
case(state)
idle:begin
link_write<=; //??????
ack<=;
finish_F<=;
sh8out_buf<=addr; //???????
sh8out_state<=idle;
state<=addr_write; //???????
end
addr_write:begin
if (finish_F==) begin shift8_out;end //???????
else
begin
link_write<=;
ack<=;
finish_F<=;
sh8out_buf<=data; //???????
state<=data_write;
sh8out_state<=idle;
end
end
data_write:begin
if (finish_F==) begin shift8_out;end //???????
else
begin
link_write<=;
finish_F<=;
state<=stop_ack;
ack<=; //????????
end
end
stop_ack:begin //????
ack<=;
state<=idle;
end
endcase
end task shift8_out; //???????
begin
case(sh8out_state)
idle:begin
link_write<=; //?????????????????17?assign sda=link_write?sh8out_buf[7]:1'bz; sda??????????sh8out_buf?????
sh8out_state<=bit7;
end
bit7:begin
link_write<=;
sh8out_buf=sh8out_buf<<; //?????data?????bit6
sh8out_state<=bit6;
end
bit6:begin
link_write<=;
sh8out_buf=sh8out_buf<<;
sh8out_state<=bit5;
end
bit5:begin
link_write<=;
sh8out_buf=sh8out_buf<<;
sh8out_state<=bit4;
end
bit4:begin
link_write<=;
sh8out_buf=sh8out_buf<<;
sh8out_state<=bit3;
end
bit3:begin
link_write<=;
sh8out_buf=sh8out_buf<<;
sh8out_state<=bit2;
end
bit2:begin
link_write<=;
sh8out_buf=sh8out_buf<<;
sh8out_state<=bit1;
end
bit1:begin
link_write<=;
sh8out_buf=sh8out_buf<<;
sh8out_state<=bit0;
end
bit0:begin
link_write<=;
finish_F<=;
end
endcase
end
endtask
endmodule

测试程序:

 `timescale 1ns/1ns
`define clk_period
module parallel_to_serial_test;
reg rst,clk;
reg [:]data,addr;
wire ack,sda;
wire [:]state; //main status,
wire [:]sh8out_state; initial
begin
clk=;
rst=;
data=;
addr=;
#(*`clk_period) rst=;
#(*`clk_period) rst=;
#(*`clk_period) $stop;
end always # clk=~clk; always @(posedge clk)
begin data=data+; addr=addr+; end parallel_to_serial m(
.rst(rst),
.clk(clk),
.addr(addr),
.data(data),
.sda(sda),
.ack(ack)
); assign state=m.state;
assign sh8out_state=m.sh8out_state;
endmodule

波形信号:

Verilog学习笔记简单功能实现(七)...............接口设计(并行输入串行输出)的更多相关文章

  1. Verilog学习笔记简单功能实现(八)...............同步FIFO

    Part 1,功能定义: 用16*8 RAM实现一个同步先进先出(FIFO)队列设计.由写使能端控制该数据流的写入FIFO,并由读使能控制FIFO中数据的读出.写入和读出的操作(高电平有效)由时钟的上 ...

  2. Verilog学习笔记简单功能实现(二)...............全加器

    先以一位全加器为例:Xi.Yi代表两个加数,Cin是地位进位信号,Cout是向高位的进位信号.列表有:   Xi     Yi    Cin Sum Cout 0 0 0 0 0 0 0 1 1 0 ...

  3. Verilog学习笔记简单功能实现(六)...............计数分频电路

    在分频器电路中最重要的概念有两个:1)奇分频/偶分频:2)占空比. A)其中最简单的就是二分频电路,占空比为50%,其Verilog程序为 module half_clk(clr,clk_in,clk ...

  4. Verilog学习笔记简单功能实现(五)...............序列检测设计

    这里采用夏宇闻教授第十五章的序列检测为例来学习; 从以上的状态转换图可以写出状态机的程序: module seqdet(x,out,clk,rst); input x,clk,rst; output ...

  5. Verilog学习笔记简单功能实现(三)...............同步有限状态机

    在Verilog中可以采用多种方法来描述有限状态机最常见的方法就是用always和case语句.如下图所示的状态转移图就表示了一个简单的有限状态机: 图中:图表示了一个四状态的状态机,输入为A和Res ...

  6. Verilog学习笔记简单功能实现(四)...............译码器和编码器

    这里以简单的3-8译码器和8-3编码器为例: module decoder3_8(a,out); :]a; :]out; 'b1<<a;/*把最低位的1左移in位(根据in口输入的值)并赋 ...

  7. Verilog学习笔记简单功能实现(一)...............D触发器

    module D_flop(data,clk,clr,q,qb); input data,clk,clr; output q,qb; wire a,b,c,d,e,f,ndata,nclk; nand ...

  8. Verilog学习笔记简单功能实现(八)...............异步FIFO

    基本原理:       1.读写指针的工作原理 写指针:总是指向下一个将要被写入的单元,复位时,指向第1个单元(编号为0). 读指针:总是指向当前要被读出的数据,复位时,指向第1个单元(编号为0). ...

  9. Spring框架学习笔记(9)——API接口设计相关知识及具体编码实现

    最近需要设计一个API服务器,想要把API接口搞得规范一下,就通过网上搜集到了一些资料,以下便是自己的一些理解以及相关的具体实现 本文采用的是spring boot+maven的方案 restful规 ...

随机推荐

  1. 阿里云配置mysql navcat远程连接

    默认是不能用客户端远程连接的,阿里云提供的help.docx里面做了设置说明,mysql密码默认存放在/alidata/account.log 首先登录: mysql -u root -h local ...

  2. KnockoutJS 3.X API 第四章 表单绑定(6) click绑定

    目的 click绑定主要作用是用于DOM元素被点击时调用相关JS函数.最常见用于button.input.a元素. 例如: You've clicked timesClick me var viewM ...

  3. MySQL(一) 数据表数据库的基本操作

    序言 这类文章,记录我看<MySQL5.6从零开始学>这本书的过程,将自己觉得重要的东西记录一下,并有可能帮助到你们,在写的博文前几篇度会非常基础,只要动手敲,跟着我写的例子全部实现一遍, ...

  4. java之内部类详解

    序言 有位小同学要我写一篇这个的总结,我说那好吧,那就动手写总结一下这个内部类的知识,感觉这个在面试中也会经常遇到,内部类.反射.集合.IO流.异常.多线程.泛型这些重要的基础知识大家都比较容易记不住 ...

  5. 【WP8.1开发】认识后台任务

    在手机上,使用后台,不像电脑上那么随意,准确地讲嘛,在移动平台上,后台任务都有严格的限制.至于说为什么会有这么多限制,我估计初衷很明显——保证系统的性能不受某个或某几个应用的负面影响:另外就是出于安全 ...

  6. 【WP开发】手电筒

    或许很多人都想到,可以利用手机上摄像头的闪光灯做手电筒,当然,有利必有害,每次使用的时间不要过长,几分钟一般不会有什么问题,如果时间太长,难保会有损伤. 以往的方案是调用视频录制功能来开始录制视频,同 ...

  7. 深入理解PHP内核(六)函数的定义、传参及返回值

    一.函数的定义 用户函数的定义从function 关键字开始,如下 function foo($var) { echo $var; } 1.词法分析 在Zend/zend_language_scann ...

  8. NYOJ 1023 还是回文(DP,花最少费用形成回文串)

    /* 题意:给出一串字符(全部是小写字母),添加或删除一个字符,都会产生一定的花费. 那么,将字符串变成回文串的最小花费是多少呢? 思路:如果一个字符串增加一个字符 x可以形成一个回文串,那么从这个字 ...

  9. 基于Metronic的Bootstrap开发框架经验总结(1)-框架总览及菜单模块的处理

    最近一直很多事情,博客停下来好久没写了,整理下思路,把最近研究的基于Metronic的Bootstrap开发框架进行经验的总结出来和大家分享下,同时也记录自己对Bootstrap开发的学习研究的点点滴 ...

  10. 新人学习Android开发遇到的小问题总结

    1. IDE搭建: 搭建android的IDE时,先注意是什么版本的系统,64/32位系统. 通常使用的是Eclipse for android,Android Studio由于还需要FQ,网速慢,所 ...