并行数据流-串行数据流_第1页
并行数据流-串行数据流_第2页
并行数据流-串行数据流_第3页
并行数据流-串行数据流_第4页
并行数据流-串行数据流_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

instinst并行数据流转换为特殊串行数据流模块设计设计要求设计两个可综合的电路模块:第一个模块M1能把4位的并行数据转换为符合以下协议的串行码流,数据流用scl和sda两条线传输,scik为输入的时钟信号,data[3:0]为输入数据,ack为M1请求M0发送数据信号。第二个模块M2能把串行数据流内的信息接收到,并转换为相应 16条信号线的高电平,即若数据为1,则第一条信号线为高电平,数据为n,则第N=2n条信号线为高电平。总体的框图如下图所示:图1通信协议scl为不断输出的时钟信号,如果scl为高电平时,sda由高变低时刻,串行数据流开始;如果scl为高电平时,sda由低变高时刻,串行数据结束。sda信号的串行数据位必须在scl为低电平时变化,若为高则为1,否则为0。通信协议的波形如图2所示:sclsda 1/0 1/0 1/0 1/0图2M1模块设计模块功能:按照设计要求,把输入的4位并行数据转换为协议要求的串行数据流,并由scl和sda配合输出。思路分析:M1需要产生M2的时钟信号scl,考虑到M1时钟端所接为外部稳定时钟源,则scl信号应该可以通过sclk时钟信号分频产生。rst为异步复位端,便于在通电时将硬件电路复位到有效状态。 M1将接收到的并行数据转换为串行数据,需要先将并行数据存入寄存器中,在 sclk配合下,将并行数据转换为串行数据输出,同时再输出反馈信号ack到M0,所以设计的核心在于利用M1模块产生符合协议要求的sda信号和ack信号,以供M0模块和M2模块使用。sda信号的串行数据位必须在scl为低电平时变化,这是设计的关键所在。为了便于编写程序及调试,给出了如图3所示的时序逻辑状态转移图。3dr]—td•aa:0Li..J.HE流程图:设计中采用了同步状态机,利用状态跳转来使SCI、sdaack信号在同步性能上有明显提高,以保证时序的可靠性和准确性。link_sdalink_sda<=0ack<=1图3状态转移图程序代码如下:moduleptosda1(rst,sclk,ack,scl,sda,data);inputsclk,rst;input[3:0]data;outputack,scl,sda;regscl,link_sda,ack,sdabuf;reg[3:0]databuf;reg[7:0]state;assignsda=link_sda?sdabuf:1'b0;parameterready=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@(posedgesclkornegedgerst)beginif(!rst)scl<=1;elsescl=~scl;endalways@(posedgeack)databuf<=data;always@(negedgesclkornegedgerst)beginif(!rst)beginlink_sda<=0;state<=ready;sdabuf<=1;ack<=0;endelsebegincase(state)ready:if(ack)beginlink_sda<=1;state<=start;endelsebeginlink_sda<=0;state<=ready;ack=1;endstart:if(scl&&ack)beginsdabuf<=0;state<=bit1;endelsestate<=start;bit1:if(!scl)beginsdabuf<=databuf[3];state<=bit2;ack<=0;endelsestate<=bit1;bit2:if(!scl)beginsdabuf<=databuf[2];state<=bit3;endelsestate<=bit2;bit3:if(!scl)beginsdabuf<=databuf[1];state<=bit4;endelsestate<=bit3;bit4:if(!scl)beginsdabuf<=databuf[0];state<=bit5;endelsestate<=bit4;bit5:if(!scl)beginsdabuf<=0;state<=stop;endelsestate<=bit5;stop:if(scl)beginsdabuf<=1;state<=IDLE;endelsestate<=stop;IDLE:if(scl)beginlink_sda<=0;state<=ready;endelsestate<=IDLE;default:beginlink_sda<=0;sdabuf<=1;state<=ready;endendcaseendendendmodule仿真波形为:组并行数据转换为串行数据输出后,databuf中的数据才更新。输出串行数据流的格式为OxxxxO,其中,xxxx是转换后得到的四位串行数据。而且串行数据的变化均在scl为低电平器件,数据的传输符合通信协议要求,达到设计要求。M2模块设计模块功能:按照协议接收串行数据,进行处理并按照数据值在相应位输出高电平。思路分析:scl为M2的输入时钟信号,sda为输入串行数据流,M2准确读出sda中的串行数据并进行处理,然后按照要求在相应位输出高电平。 输入串行数据流的格式为OxxxxO,因此正确的读出数据xxxx并转换为并行数据是设计的关键,同时按照协议要求,应该设置相应的串行数据开始标志 StartFlag和结束标志EndFlag,设置这样的标志是极其重要的,因为这样可以帮助我们正确的设计状态机,从而准确可靠的读出串行数据xxxx并转换为并行数据。最后将并行数据按指定要求输出,要求M2内部有译码模块。・:--■J■'' ouihiQh[l&..■Kiai-";■-■--■■>nti■■-“-*:i■rr•---■:in$ii--状态转移图:程序代码如下:moduleout16hi(scl,sda,outhigh,rst);inputscl,sda,rst;output[15:0]outhigh;reg[5:0]mstate;reg[3:0]pdata,pdatabuf;reg[15:0]outhigh;regStartFlag,EndFlag;always@(negedgesdaornegedgerst)beginif(scl)StartFlag<=~StartFlag;elseif(!rst)StartFlag<=0;endalways@(posedgesdaornegedgerst)beginif(scl)beginEndFlagv=~EndFlag;pdatabuf<=pdata;endelseif(!rst)EndFlag<=1;endparameterready=6'b00_0000,sbit0=6'b00_0001,sbit1=6'b00_0010,sbit2=6'b00_0100,sbit3=6'b00_1000,sbit4=6'b01_0000;always@(pdatabuf)begincase(pdatabuf)4'b0001:outhigh=16'b0000_0000_0000_0001;4'b0010:outhigh=16'b0000_0000_0000_0010;4'b0011:outhigh=16'b0000_0000_0000_0100;4'b0100:outhigh=16'b0000_0000_0000_1000;4'b0101:outhigh=16'b0000_0000_0001_0000;4'b0110:outhigh=16'b0000_0000_0010_0000;4'b0111:outhigh=16'b0000_0000_0100_0000;4'b1000:outhigh=16'b0000_0000_1000_0000;4'b1001:outhigh=16'b0000_0001_0000_0000;4'b1010:outhigh=16'b0000_0010_0000_0000;4'b1011:outhigh=16'b0000_0100_0000_0000;4'b1100:outhigh=16'b0000_1000_0000_0000;4'b1101:outhigh=16'b0001_0000_0000_0000;4'b1110:outhigh=16'b0010_0000_0000_0000;4'b1111:outhigh=16'b0100_0000_0000_0000;4'b0000:outhigh=16'b1000_0000_0000_0000;endcaseendalways@(posedgescl)beginif(StartFlag)case(mstate)ready:beginmstate<=sbit0;$display("Iaminready");endsbit0:beginmstate<=sbit1;pdata[3]<=sda;$display("Iaminsdabit0");endsbit1:beginmstate<=sbit2;pdata[2]<=sda;$display("Iaminsdabit1");endsbit2:beginmstate<=sbit3;pdata[1]<=sda;$display("Iaminsdabit2");endsbit3:begin

mstate<=sbit4;pdata[O]v=sda;$display("laminsdabit3");endsbit4:beginmstate<=ready;$display("Iaminready");enddefault:mstate<=ready;endcaseelsemstate<=sbit0;endendmodule仿真波形为:仿真结果表明:rst复位信号用于对数据开始标志 StartFlag仿真结果表明:rst复位信号用于对数据开始标志 StartFlag和数据结束标志EndFlag置初值,根据通信协议要求,数据传输开始于 sda下降沿,结束与sda上升沿,因此可以利用sda的上升沿来改变EndFlag的状态,sda的下降沿来改变StartFlag的状态,同时在sda的上升沿到来时将串行数据转换为并行数据并输出高电平。从图中可以看出,StartFlag为高电平有效,EndFlag为低电平有效,M2准确地从串行数据流内读出串行数据,如图中串行数据依次为0000,0001,…,与测试输入数据吻合,表明M2模块设计符合要求。M1与M2连接方式M0测试模块设计思路:由于M1模块有输出信号反馈到M0模块,并对M0模块产生影响,因此需要在M0模块中加入输入信号,用于接收M1模块的反馈信号。利用这个反馈信号编制相应的输出信号,这样能更好地仿真实际电路。代码:'timescale1ns/1ns'definehalfperiod50modulesigdata(rst,sclk,data,ask_for_data);outputrst,sclk;output[3:0]data;inputask_for_data;regrst,sclk;reg[3:0]data;initialbeginrst=1;#10rst=0;#('halfperiod*2+3)rst=1;endinitialbeginsclk=0;data=0;#('halfperiod*1000)$stop;endalways#('halfperiod)sclk=~sclk;always@(posedgeask_for_data)#('halfperiod/2+3)data=data+1;Endmodule顶层模块设计模块功能:对所设计的两个可综合模块M1和M2进行联合测试,观察M1模块能否正确地把并行数据转换成符合协议要求的串行码流;串行码流能否通过M2模块的处理输出符合设计要求的信号。代码:'timescale1ns/1ns'include"sigdata.v"'include"ptosda1.v"'include"out16hi.v"modul

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论