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

这是一个将并行数据转换为串行输出的变换器,利用双向总线输出。这是由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. Atitit 桌面软件跨平台gui解决方案 javafx webview

    Atitit 桌面软件跨平台gui解决方案 javafx webview 1.1. 双向js交互1 1.2. 新弹出窗口解决1 1.3. 3.文档对象入口dom解析1 1.4. 所以果断JavaFX, ...

  2. paip. 解决php 以及 python 连接access无效的参数量。参数不足,期待是 1”的错误

    paip. 解决php 以及 python 连接access无效的参数量.参数不足,期待是 1"的错误 作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源 ...

  3. Android TextView 常用技巧

    Android ListView 常用技巧 Android TextView 常用技巧 TextView在Android中实现文字说明等功能,基本的使用都很简单,那么除了基本展示文字的使用,我们还能够 ...

  4. mysql如果数据不存在,则插入新数据,否则更新的实现方法

    mysql如果数据不存在,则插入新数据,否则更新的实现方法 //如果不存在,则插入新数据 $sql = "INSERT INTO {$ecs->table('cat_lang')} ( ...

  5. Netty学习四:Channel

    1. Channel Channel是Netty的核心概念之一,它是Netty网络通信的主体,由它负责同对端进行网络通信.注册和数据操作等功能. 1.1 工作原理 如上图所示: 一旦用户端连接成功,将 ...

  6. javascript设计模式与开发实践阅读笔记(5)——策略模式

    策略模式:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换. 我的理解就是把各种方法封装成函数,同时存在一个可以调用这些方法的公共函数.这样做的好处是可以消化掉内部的分支判断,使代码效率 ...

  7. Ucos系统常用的数据结构有哪些?

    1)表 链表 表中主要了解链表,尤其是单向链表. 2)数组 一维数组 二维数组 使用数组有什么好处,在c语言中,数组是一组连续数字的集合它们数组的下标,代表了数组的相对位置,所以说,在一些高效的查表过 ...

  8. windows phone 存储图片 数据库写法

    byte[] _DiseaseImage; [Column(DbType = "Image", UpdateCheck = UpdateCheck.Never)] //保证图像超出 ...

  9. 【博客美化】06.添加QQ交谈链接

    博客园美化相关文章目录: [博客美化]01.推荐和反对炫酷样式 [博客美化]02.公告栏显示个性化时间 [博客美化]03.分享按钮 [博客美化]04.自定义地址栏logo [博客美化]05.添加Git ...

  10. hdu1962Corporative Network带权回路

    /* 有N个企业,每个企业想要实现通信,要用线路来连接,线路的长度为abs(a-b)%1000; 如果企业a 链接到了企业b 那么b就是the center of the serving! 然后有两种 ...