并行数据流转化为一种特殊串行数据流模块的设计

本文介绍了如何设计两个可综合的电路模块,将四位并行数据转化为简化I2C传输格式,然后接收并转化为16条信号线的高电平。详细阐述了简化的I2C通信协议,并提供了Verilog代码实现。
摘要由CSDN通过智能技术生成

本文参考自: 原文地址

       设计两个可综合的电路模块:第一个模块(M1)接受四位并行数据,并将其转化为简化I2C传输格式。sclk为输入主钟,data[3:0]为输入的四位数据,ack为请求发送数据信号(请求后才有数据发送到data[3:0]),数据流用scl和sda两条线传输。第二个模块(M2)接收以简化I2C协议通过scl和sda传输来的数据,并转化为相应16条信号线上的高电平,若数据为1,则第一条线路为高电平,数据为n,则第N条线路为高电平。模块如下图所示。

        本文引用自https://blog.csdn.net/llxxyy507/article/details/81046981


       简化的I2C通信协议如下:scl为时钟信号,当scl为高电平的时候,sda从高电平变为低电平,表示串行数据流开始传输;当scl为高电平,sda从低电平变为高电平的时候,表示串行数据流结束。sda信号只能在scl为低电平的时候变化,在scl为高电平期间应该维持稳定。


       上图中,sda信号在scl为高时从高变低,为数据流的开始。在scl为低电平时传输第一位数据(MSB),并在整个scl为高的期间都维持信号的稳定,接着传递剩下的数据。sda信号在scl为高时从低变高,表示数据流的结束。

       模块M1的verilog代码(ptosda.v)如下:

module ptosda(sclk,rst,data,ack,scl,sda);
input sclk,rst,data;
wire [3:0]data;

output scl,sda,ack;
reg scl,ack,link_sda,sdabuf;
reg [3:0]databuf;
reg [7:0]state;

out16hi m2(.scl(scl), .sda(sda), .outhigh() );    //调用M2模块

assign  sda = link_sda ? sdabuf : 1'b0;        //link_sda控制sdabuf输出到串行总线上

parameter  ready  =  8'b0000_0000,
           start  =  8'b0000_0001,
           bit1   =  8'b0000_0010,
           bit2   =  8'b0000_0100,
           bit3   =  8'b0000_1000,
           bit4   =  8'b0001_0000,
           bit5   =  8'b0010_0000,
           stop   =  8'b0100_0000,
           IDLE   =  8'b1000_0000;

always @(posedge sclk or negedge rst)         //主钟sclk产生
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值