verilog简单卷积器的设计.docx
- 文档编号:26611839
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:14
- 大小:42.57KB
verilog简单卷积器的设计.docx
《verilog简单卷积器的设计.docx》由会员分享,可在线阅读,更多相关《verilog简单卷积器的设计.docx(14页珍藏版)》请在冰豆网上搜索。
verilog简单卷积器的设计
简单卷积器的设计
专业:
电子信息工程
班级:
电子092
学号:
姓名:
2012年12月16日
一、引言
卷积码是1955年由Elias等人提出的,是一种非常有前途的编码方法。
我们在一些资料上可以找到关于分组码的一些介绍,分组码的实现是将编码信息分组单独进行编码,因此无论是在编码还是译码的过程中不同码组之间的码元无关。
卷积码和分组码的根本区别在于,它不是把信息序列分组后再进行单独编码,而是由连续输入的信息序列得到连续输出的已编码序列。
即进行分组编码时,其本组中的n-k个校验元仅与本组的k个信息元有关,而与其它各组信息无关;但在卷积码中,其编码器将k个信息码元编为n个码元时,这n个码元不仅与当前段的k个信息有关,而且与前面的(m-1)段信息有关(m为编码的约束长度)。
同样,在卷积码译码过程中,不仅从此时刻收到的码组中提取译码信息,而且还要利用以前或以后各时刻收到的码组中提取有关信息。
而且卷积码的纠错能力随约束长度的增加而增强,差错率则随着约束长度增加而呈指数下降。
卷积码(n,k,m)主要用来纠正随机错误,它的码元与前后码元有一定的约束关系,编码复杂度可用编码约束长度m*n来表示。
一般地,最小距离d表明了卷积码在连续m段以内的距离特性,该码可以在m个连续码流内纠正(d-1)/2个错误。
卷积码的纠错能力不仅与约束长度有关,还与采用的译码方式有关。
总之,由于n,k较小,且利用了各组之间的相关性,在同样的码率和设备的复杂性条件下,无论理论上还是实践上都证明:
卷积码的性能至少不比分组码差。
二、设计目的
(1)学习和掌握高速计算逻辑状态机的控制基本方法;
(2)了解计算逻辑与存储器和AD模块的接口设计技术基础;
(3)进一步掌握数据总线在模块设计中的应用和控制;
(4)熟悉用工程概念来编写较完整的测试模块,做到接近真实的完整测试。
三、设计原理
卷积器是数字信号处理系统中常用的部件。
它对模拟输入信号实时采样,得到数字信号序列。
然后对数字信号进行卷积运算,再将卷积结果存入RAM中。
对模拟信号的采样由A/D转换器来完成,而卷积过程由卷积器来实现。
为了设计卷积器,首先要设计RAM和A/D转换器的VerilogHDL模型。
在电子工业发达的国家,可以通过商业渠道得到非常准确的外围器件的虚拟模型。
如果没有外围器件的虚拟模型,就需要仔细地阅读和分析RAM和A/D转换器的器件说明书,来自行编写。
因为RAM和A/D转换器不是我们设计的硬件对象,所以需要的只是它们的行为模型,精确的行为模型需要认真细致地编写,并不比可综合模块容易编写。
它们与实际器件的吻合程度直接影响设计的成功。
在这里我们把重点放在卷积器的设计上,直接给出RAM和A/D转换器的VerilogHDL模型和它们的器件参数(见附录),可以对照器件手册,认真阅读RAM和A/D转换器的VerilogHDL模型。
对RAM和A/D转换器的VerilogHDL模型的详细了解对卷积器的设计是十分必要的。
到目前为止,我们对设计模块要完成的功能比较明确了。
总结如下:
首先它要控制AD变换器进行AD变换,从AD变换器得到变换后的数字序列,然后对数字序列进行卷积,最后将结果存入RAM。
四、设计实现
卷积码编码器通常记作(n,k,N),对应于每段k个比特的输入序列,输出n个比特;这n个输出比特不仅与当前的k个输入比特有关,而且还与以前的(N-1)k个输入比特有关。
(n,k,N)卷积码编码器包括:
一个由N段组成的输入移位寄存器,每段有k级,共Nk位;一组n个模2加法器;一个由n级组成的输出移位寄存器。
整个编码过程可以看成是输入序列与由移位寄存器和模2加法器连接方式所决定的另一个序列的卷积。
卷积码的解码方法主要有两种:
代数译码和概率译码。
代数译码是根据卷积码的本身编码结构进行译码,译码时不考虑信道的统计特性。
概率译码在计算时要考虑信道的统计特性。
大数逻辑解码器是代数解码最主要的解码方法,它既可用于纠正随机错误,又可用于纠正突发错误。
选择8位输入总线,输出到RAM的数据总线也选择8位,卷积值为16位,分高、低字节分别写到俩个RAM中,地址总线为11位。
为了理解卷积器设计中的状态机,必须对A/D转换器和RAM的行为模块有深入的理解。
卷积码的编码器是由一个有k个输入端、n个输出端、m节移位寄存器所构成的有限状态的有记忆系统,通常称它为时序网络。
描述这类时序网络的方法很多,大致可分为两大类型:
解析表示法与图形表示法。
解析法又可分为离散卷积法、生成矩阵法、码多项式法等;描述卷积码编译码的过程,可以用不同的描述方法,如矩阵法、码树法、状态图法和篱状图法等。
采用何种方法描述卷积码的编码器,与其译码方法有很大关系。
编码器为串入串出结构,这里一共定义四个端口信号,它们分别
data_in:
INSTD_LOGIC;--信息数据输入
clk_in:
INSTD_LOGIC;--时钟输入
start:
INSTD_LOGIC;--编码使能
data_out:
OUTSTD_LOGIC;--编码数据输出
定义内部状态信号state,表示mj、mj-1、mj-2:
SIGNALstate:
STD_LOGIC_VECTOR(2downto0);
定义内部信号dtat_internal,用以暂存x1,j、x2,j:
SIGNALdata_internal:
TD_LOGIC_VECTOR(1downto0);
于是,由⑴、⑵式可知,data_internal与state的关系为:
data_internal
(1)=state(0)⊕⊕state
(1)state
(2)
data_internal(0)=state(0)⊕state
(2)
当编码使能start为0时不进行编码,并将状态state清零;start为1时进行编码,此时每2个时钟周期输入一个新的信息比特,同时状态信号改变,输出2位已编码比特,即每个时钟周期输出1位已编码比特。
通过前面的分析我们已经知道,用高层次的设计方法来设计复杂的时序逻辑,重点是把时序逻辑抽象为有限状态机,并用可综合风格的VerilogHDL把这样的状态机描述出来。
下面我们将通过注释来介绍整个程序的设计过程。
我们选择8位输入总线,输出到RAM的数据总线也选择8位,卷积值的高、低字节被分别写到两个RAM中。
地址总线为11位。
为了理解卷积器设计中的状态机,必须对A/D转换器和RAM的行为模块有深入的理解。
卷积器的程序代码如下:
`timescale100ps/100ps
modulecon1(address,indata,outdata,wr,nconvst,nbusy,
enout1,enout2,CLK,reset,start);
inputCLK,//采用10MHZ的时钟
reset,//复位信号
start,//因为RAM的空间是有限的,当RAM存满后采样和卷积都会停止。
//此时给一个start的高电平脉冲将会开始下一次的卷积。
nbusy;//从A/D转换器来的信号表示转换器的忙或闲
outputwr,//RAM写控制信号
enout1,enout2,//enout1是存储卷积低字节结果RAM的片选信号
//enout2是存储卷积高字节结果RAM的片选信号
nconvst,//给A/D转换器的控制信号,命令转换器开始工作,低电平有效
address;//地址输出
input[7:
0]indata;//从A/D转换器来的数据总线
output[7:
0]outdata;//写到RAM去的数据总线
wirenbusy;
regwr;
regnconvst,
enout1,
enout2;
reg[7:
0]outdata;
reg[10:
0]address;
reg[8:
0]state;
reg[15:
0]result;
reg[23:
0]line;
reg[11:
0]counter;
reghigh;
reg[4:
0]j;
regEOC;
parameterh1=1,h2=2,h3=3;//假设的系统系数
parameterIDLE=9'b000000001,START=9'b000000010,NCONVST=9'b000000100,
READ=9'b000001000,CALCU=9'b000010000,WRREADY=9'b000100000,
WR=9'b001000000,WREND=9'b010000000,WAITFOR=9'b100000000;
parameterFMAX=20;//因为A/D转换的时间是随机的,为保证按一定的频率采样,A/D
//转换控制信号应以一定频率给出。
这里采样频率通过FMAX控制
//为500KHZ。
always@(posedgeCLK)
if(!
reset)
begin
state<=IDLE;
nconvst<=1'b1;
enout1<=1;
enout2<=1;
counter<=12'b0;
high<=0;
wr<=1;
line<=24'b0;
address<=11'b0;
end
else
case(state)
IDLE:
if(start==1)
begin
counter<=0;//counter是一个计数器,记录已
//用的RAM空间
line<=24'b0;
state<=START;
end
else
state<=IDLE;
//START状态控制A/D开始转换
START:
if(EOC)
begin
nconvst<=0;
high<=0;
state<=NCONVST;
end
else
state<=START;
//NCONVST状态是A/D转换保持阶段
NCONVST:
begin
nconvst<=1;
state<=READ;
end
//READ状态读取A/D转换结果,计算卷积结果
READ:
begin
if(EOC)
begin
line<={line[15:
0],indata};
state<=CALCU;
end
else
state<=READ;
end
CALCU:
begin
result<=line[7:
0]*h1+line[15:
8]*h2+line[23:
16]*h3;
state<=WRREADY;
end
//将卷积结果写入RAM时,先写入低字节,再写入高字节
//WRREADY状态是写RAM准备状态,建立地址和数据信号
WRREADY:
begin
address<=counter;
if(!
high)outdata<=result[7:
0];
elseoutdata<=result[15:
8];
state<=WR;
end
//WR状态产生片选和写脉冲
WR:
begin
if(!
high)enout1<=0;
elseenout2<=0;
wr<=0;
state<=WREND;
end
//WREND状态结束一次写操作,若还未写入高字节则转到WRREADY状
//态开始高字节写入
WREND:
begin
wr<=1;
enout1<=1;
enout2<=1;
if(!
high)
begin
high<=1;
state<=WRREADY;
end
elsestate<=WAITFOR;
end
//WAITFOR状态控制采样频率并判断RAM是否已被写满
WAITFOR:
begin
if(j==FMAX-1)
begin
counter<=counter+1;
if(!
counter[11])state<=START;
else
begin
state<=IDLE;
$display($time,"Theramisused
up.");
$stop;
end
end
elsestate<=WAITFOR;
end
default:
state<=IDLE;
endcase
//assignrd=1;//RAM的读信号始终保持为高
//j记录时钟,与FMAX共同控制采样频率
//由于直接用CLK的上升沿对nbusy判断以
//决定某些操作是否运行时,会因为两个信号
//的跳变沿相隔太近而令状态机不能正常工作。
因此
//利用CLK的下降沿建立EOC信号与nbusy同步,相位
//相差180度,然后用CLK的上升沿判断操作是否进行。
always@(negedgeCLK)
begin
EOC<=nbusy;
if(!
reset||state==START)
j<=1;
else
j<=j+1;
end
endmodule
程序仿真
程序写完后首先要做前仿真,我们可用仿真器(如ModelSimSE/EEPLUS5.4)来做。
为检查我们写的程序,需要编写测试程序,测试程序应尽可能检测出各种极限情况。
这里给出一个测试程序供参考。
//---------------------------testcon1.v-------------------
`timescale100ps/100ps
moduletestcon1;
wirewr,
enin,
enout1,
enout2;
wire[10:
0]address;
regrd,
CLK,
reset,
start;
wirenbusy;
wirenconvst;
wire[7:
0]indata;
wire[7:
0]outdata;
integeri;
parameterHALF_PERIOD=1000;
//产生10KHZ的时钟
initial
begin
rd=1;
i=0;
CLK=1;
forever#HALF_PERIODCLK=~CLK;
end
//产生置位信号
initial
begin
reset=1;
#(HALF_PERIOD*2+50)reset=0;
#(HALF_PERIOD*3)reset=1;
end
//产生开始卷积控制信号
initial
begin
start=0;
#(HALF_PERIOD*7+20)start=1;
#(HALF_PERIOD*2)start=0;
#(HALF_PERIOD*1000)start=1;
#(HALF_PERIOD*2)start=0;
end
assignenin=1;
con1con(.address(address),.indata(indata),.outdata(outdata),.wr(wr),
.nconvst(nconvst),.nbusy(nbusy),.enout1(enout1),
.enout2(enout2),.CLK(CLK),.reset(reset),.start(start));
sramramlow(.Address(address),.Data(outdata),.SRW(wr),.SRG(rd),.SRE(enout1));
adcadc(.nconvst(nconvst),.nbusy(nbusy),.data(indata));
endmodule
因测试程序已经包括了各模块,只需编译测试程序并运行它。
通过仿真器中的菜单(如ModelSim仿真器中功能列表中view的下拉菜单选择structure,signal和wave),可以根据需要看到各种信号的波形,由此检测程序。
仿真波形如下:
五、设计总结
科学技术的发展使人类跨入了高度发展的信息化时代。
在政治、军事、经济等各个领域,信息的重要性不言而喻,有关卷积码的研究将越来越受到重视。
在编写程序的过程中,我深入学习了VHDL语言的仿真及应用环境,掌握了操作的基本过程与步骤,并能用VHDL语言进行编程及仿真,结合VHDL语言,充分了解到卷积码编译码器的原理和应用。
通过这次设计,使我对Verilog数字系统设计这门课程有了更深入的理解。
Verilog数字系统是一门实践性较强的课程,为了学好这门课程,必须在掌握理论知识的同时,加强实践。
一个人的力量是有限的,要想把设计做的更好,就要学会参考一定的资料,吸取别人的经验,让自己和别人的思想有机的结合起来,得出属于你自己的灵感。
程序的编写需要有耐心,有些事情看起来很复杂,但问题需要一点一点去解决,分析问题,把问题一个一个划分,划分成小块以后就逐个去解决。
再总体解决大的问题。
这样做起来不仅有条理也使问题得到了轻松的解决。
在这个过程中,我曾经失落过,也曾热情高涨过。
生活就是这样,汗水预示着结果也见证着收获。
劳动是人类生存生活永恒不变的话题。
虽然这只是一次的课程论文的编写,并没有验证方案是否可行,可是平心而论,也耗费了我不少的心血,这就让我不得不佩服开发技术的前辈,才意识到老一辈对我们社会的付出,为了人们的生活更加美好,他们付出多少心血啊!
对我而言,知识上的收获重要,精神上的丰收更加可喜。
让我知道了学无止境的道理。
我们每一个人永远不能满足于现有的成就,人生就像在爬山,一座山峰的后面还有更高的山峰在等着你。
挫折是一份财富,经历是一份拥有。
这次论文的写作过程必将成为我人生旅途上一个非常美好的回忆!
通过这次的设计我对于专业课的学习有了更加深刻的认识,以为现在学的知识用不上就加以怠慢,等到想用的时候却发现自己的学习原来是那么的不扎实。
以后努力学好每门专业课,让自己拥有更多的知识,才能解决更多的问题!
我在更加牢固、灵活地掌握了所学的专业知识的同时,大量学习了VHDL编程的相关知识,为日后深入研究数字系统设计技术打下了基础。
六、参考文献
[1]夏宇闻,Verilog数字系统设计教程,北京航天航空大学出版社,2008.6
[2]钱莹晶,张仁民,基于VerilogHDL语言描述的卷积码编码器的设计[J].《科技信息》2009第五期
[3]王新梅,肖国镇,纠错码——原理与方法(修订版)[M].西安电子科技大学出版社,2001.
[4]王金龙,沈良,任国春,无线通信系统的DSP实现[M].人民邮电出版社,2002.
[5]张建斌,基于VHDL语言的卷积码编解码器的设计,现代电子技术《2005年第三期》
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- verilog 简单 卷积 设计