TS流嵌入控制数据的设计Word文档下载推荐.docx
《TS流嵌入控制数据的设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《TS流嵌入控制数据的设计Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
TS流中的空帧很多,将某些空帧的数据区全换为控制数据DIN(帧同步字节和空帧标志不变),按照TS流格式进行传输。
TS流数据帧中的数据和控制数据不能出现丢失。
设计要求:
完成HDL的描述,用EDA开发系统完成综合、时序仿真验证。
提交设计报告文档(含设计思路、HDL设计程序、综合结果、时序仿真结果及说明等)。
文档为word2003或word2003的兼容版本,文档名的格式为:
学号_姓名_课程设计。
报告提交截止时间:
2012年5月20日,逾期不候。
抄袭者计为0分。
一、
设计思想
1、系统程序流程图
2、查找空帧程序流程图
首先根据外部输入使能信号en来存储控制数据,en是在一个clk_w(300Khz)周期内持续一个clk(10Mhz)周期的使能信号,这样就保证了在一个clk_w周期内只存一个控制数据到fifo,避免将控制数据重复存入fifo。
当en=1时,en使能信号有效,将一个控制数据存fifo,同时开始计数(cnt1=cnt1+1),以保证fifo中存有7个控制数据时,及时将其插入到Ts数据流中。
当fifo中存有7个控制数据时,发出一个控制数据准备好信号,同时将计数器及时清零(cnt1=0),这样就保证了在找空帧时,如果有en使能信号有效,就可以继续将控制数据写入fifo前7个数据的后面,fifo的深度是10,即保证控制数据不丢失。
当rdy=1;
表明fifo中已经存有7个控制数据,同时开始查找空帧,可以由同步信号标志47和47后面的两个数分别为1F和FF来判断。
找到空帧后,停止在继续查找,将rdy及时清零,另外发出一个找到空帧的标志信号rd_en=1,表明在下一个clk到来时可以准备将fifo中存放的控制数据插入到Ts数据流中。
3、系统功能模块图
二、设计中需注意的问题
1、在本次设计中出现最大的问题就是fifo,首先是存储深度问题,由于我使用的fifo主要是靠读写指针和mem来得到其深度的。
这个fifo代码对于2的幂次方深度的是很容易实现的,因为这样fifo存储深度可以直接由指针的位数来控制。
在本次设计中由于要实现fifo为10字节的存储深度,所以读写指针的位数为3位,而这样的话指针将在0-15之间循环移动,相关代码如下:
reg[7:
0]mem[9:
0];
//fifo存储深度为10
reg[3:
0]rp,wp;
//读指针和写指针
为了控制好指针在0-9之间循环移动,才能实现设计要求,故需要对指针控制进行相关修改,如下所示:
begin//由于存储深度是10,所以必须保证写指针在0-9之间移动
if(wp<
9)wp<
=(wr&
&
~full_in)?
(wp+1'
b1):
wp;
elsewp<
0:
end
begin//由于存储深度是10,所以必须保证读指针在0-9之间移动
if(rp<
9)rp<
=(rd&
~empty_in)?
(rp+1'
b1):
rp;
elserp<
0:
end
图1、fifo深度测试
2、在本次设计中还遇到fifo的数据读出问题,因为由测试数据可以看到fifo一直只能读出0100010001这些控制数据,一开始怎么修改程序都没弄明白到底是哪儿出问题了,还以为控制数据没写进fifo。
后来通过单步运行,一步一步查看相关寄存器值的情况,才发现fifo中存储的控制数据是正确的,指针移动也是正确的,这样就可以马上得出结论是读出的时候出现了问题,然后在主控程序里面查看调用fifo模块的代码,还是正确的,这个问题一直困扰了我好几天,后来我一直在想为什么fifo中存储的控制数据是正确的,而只读到0100010001这些控制数据呢?
那么肯定是位数不够,后来我再查看主控程序,终于让我发现了问题的所在,原来对fifo读出端口dataout没有进行定义。
即dataout正确的定义和fifo模块调用如下:
wire[7:
0]dataout;
//fifo数据输出口
//对fifo模块进行调用
Synfifouut(
.datain(datain),
.rd(rd_en),
.wr(wr_en),
.rst(reset),
.clk(clk),
.dataout(dataout)
);
图2、fifo数据读出出错分析
3、在本次设计中,对于7个控制数据的插入问题,我一开始是采用先找空帧,找到后产生一个空帧准备好信号(null_rdy=1),然后再根据null_rdy的值是否为1来插入控制数据,代码如下:
if(null_rdy==0)ts_out=ts_in;
elseif(null_rdy==1)begin
rd_en=1;
//开始从fifo读出数据
ts_out=dataout;
test=dataout;
cnt3=cnt3+1;
if(cnt3==7)begin
cnt3=0;
rd_en=0;
null_rdy=0;
end
end
但是这样的结果是将导致数据被重复读出,如下图所示,数据41被重复读出:
图3、fifo数据重复读出出错分析
为了实现设计要求,得到正确的结果,将选择判断条件修改如下:
if(rd_en==0)ts_out=ts_in;
//如果fifo写使能信号无效,则ts流数据保持原样输出
elseif(rd_en==1)begin//如果fifo写使能信号生效,将fifo中的7个控制数据插入ts流
fifo_out=dataout;
if(cnt3==7)begin//控制fifo中的7个控制数据插入ts流,一旦插入完毕,则fifo读使能信号无效,ts流数据保持原样输出
rd_en=0;
end
4、在查找空帧的时候,一开始是定义了三个寄存器变量对ts流中同步信号47和后面的两个数进行存储并判断ts流中同步信号47后面的两个数是否分别为8'
h1F和8'
hFF。
代码如下:
if(rdy==1)begin
if(sync==1)mem3[0]=ts_in;
elseif(cnt2==1)mem3[1]=ts_in;
elseif(cnt2==2)begin
mem3[2]=ts_in;
if((mem3[1]==8'
h1F)&
(mem3[2]==8'
hFF))begin
rd_en=1;
rdy=0;
end
end
cnt2=cnt2+1;
if(cnt2==3)cnt2=0;
但这样会导致资源消耗过大,因为3个mem3寄存器组都是7位的,基本上没怎么利用。
故优化如下:
if(rdy==1)begin//当准备好信号有效时,开始查找空帧
if(sync==1)flag=0;
//sync对应的是ts流中的同步信号47
elseif(cnt2==1)flag=(ts_in==8'
h1F)?
1:
0;
//判断ts流中紧跟同步信号47后面的数是否为8'
h1F
flag=((ts_in==8'
hFF)&
(flag==1))?
//判断ts流中同步信号47后面的两个数是否分别为8'
hFF
rd_en=flag?
1:
rd_en;
//若满足ts流中同步信号47后面的两个数分别为8'
hFF,则找到空帧rd_en生效,开始将fifo数据读出
end
//只考虑ts流中同步信号47和后面的两个数的情况,所以要对计数变量cnt2及时清零
rdy=rd_en?
rdy;
//找到空帧后,停止在继续查找,及时清零
5、在本次设计中en使能信号是通过clk_w(300Khz)的下降沿来产生一个持续时间为一个clk(10Mhz)时钟周期的信号。
在实际工程中,也可以通过D触发器将clk_w信号延迟一个clk时钟周期来实现。
6、本次中所用到的ts数据流和控制数据流是通过自己手动设定的值,通过对文本文件读取命令将数据读出来。
$readmemh("
tsdata.txt"
mem1);
//tsdata.txt中存有100个ts数据流
controlflow.txt"
mem2);
//controlflow.txt中存有28个控制数据
always@(negedgeclk)begin
if(i<
99)begin
ts_in=mem1[i];
if(ts_in==8'
h47)sync=1;
elsesync=0;
i=i+1;
end
elsei=0;
end
always@(negedgeclk_w)begin
en=1;
#100en=0;
if(j<
28)begin
din=mem2[j];
j=j+1;
elsej=0;
7、需要插入的控制数据如下图所示:
图4、din中输入的控制数据流
三、时序仿真及程序代码
1、时序仿真图
如图所示,当fifo中有7个控制数据时,将第一组制数据为01020304554123插入到ts_out数据流的空帧中,空帧位置为471FFF后面的7个数据,由ts_in可以看到图中是以00表示空帧位置的。
第二组插入的控制数据为56127889563221
第三组插入的控制数据为45878910230200
第四组插入的控制数据为14556499080140
2、综合结果
3、功耗分析