北京邮电大学 ASIC原理课程实验
实验报告
设计要求:(3,1,8)卷积码编码器 学院:电子工程学院 专业:电子信息科学与技术 班级: 学号: 姓名:
2013年6月20日
.
.
一、设计要求
运用verilog语言编写一个(3,1,8)卷积码编码器,并对其进行仿真。
二、卷积码编码器原理
卷积码拥有良好的纠错性能,是一种被广泛应用于移动通信的信道编码系统。一个(n,k,m)卷积码编码器由k个输入,具有m阶存储的n个输出的线形时序电路实现。通常, n和k是较小的整数,且k<n,但m比较大。当k=1时,信息序列不再分成小块,以便可以连续处理。卷积码(n,k,m)表示码率R=k/n,编码器级数m=s-1,其中s是码约束长度。
反向CDMA信道使用(3,1,8)卷积码,码率R=1/3,约束长度为9,由于k=1,n=3,m=8,则该卷积编码器包含单个输入端,一个8级移位寄存器,三个模 2加法器和一个3向编码器输出的连续转向器。编码器每输入一位信息比特将产生三位编码输出。这些编码符号中,第一个输出符号G0是生成序列g1⑴编码产生的符号,第二个输出符号G1是由生成序列g1⑵编码产生的符号,最后一个输出符号G2是由生成序列g1⑶编码产生的符号,如下图所示。
该电路由一个八位寄存器、三个码生成逻辑、一个时隙发生器和一个四选一复用器构成。mux的输入为G0、G1和G2,码选择信号C[1:0]和clk1由时隙发
.
.
生器产生,输出信号即为整个电路的输出Yout。
卷积编码器的初始状态用rst异步清零信号置为0,rst=0时,电路清零。 卷积编码器的初始状态全为0,初始状态之后输出的第一个编码符号由生成序列g1⑴编码产生。这里,三个生成序列分别为g1⑴=(101101111),g1⑵=(110110011), g1⑶=(111001001)。
即三个生成多项式分别为: C0=1+X+X2+X3+X5+X6+X8 (557) C1=1+X+X4+X5+X7+X8 (663) C2=1+X3+X6+X7+X8 (711)
三、实验设计与实现
根据以上实验要求,我们首先设想了分为几个模块,然后将各个模块进行整合实现编码器的功能,根据我们的设想编写相应的verilog程序,进行调试、实现。以下是实验的具体过程。 1.卷积码模块设计
(1)3分频器(fenping)。它的功能是产生clk时钟三分之一频率的时钟信号,命名为clk1,同时产生选择信号sel[1:0]。
(2)4-1多路选择器(mux_4_1)。根据sel[1:0]输入的选择信号,选择4路(in0,in1,in2,in3)输入的1路来输出(out)。后来,根据老师的指导,将卷积的运算逻辑组装在这个模块里。
(3)8位移位寄存器(wyjc_8)。用于记录输入的信息。每经过一个时钟上升沿(clk1)向前移位一次。
2.verilog程序编写
.
.
各个模块相应的代码和注释如下所示。
(1)3分频器
module fenping(clear,clk,clk1,count); input clk,clear; output clk1,count; wire clk,clear; reg clk1;
reg [2:0] count;
always @(posedge clk or posedge clear)
begin
if(clear==1)
count[2:0]<=3’b010; else
begin//通过循环移位实现3分频 count[0]<=count[2]; count[1]<=count[0]; count[2]<=count[1]; clk1<=count[1]; end; end
endmodule
(2)4—1多路选择器
module mux_4_1(clk1,clk,sel,in,kin,out); input[1:0] sel; input clk,in,clk1; input[7:0] kin; output out; wire [1:0] sel; reg out; reg [8:0]k;
always @(posedge clk) //依次计算c0,c1,c2 begin
case(sel)
default out<=0;
2’b00:out<=(k[0]+k[1])+(k[2]+k[3])+(k[5]+k[6]+k[8]); 2’b01:out<=k[0]+k[1]+k[4]+k[5]+k[7]+k[8];
.
.
2’b10:out<=k[0] +k[3]+k[6])+k[7]+k[8]; endcase
end
always @(posedge clk1) //采样部分 begin
k[7:0]<=kin[7:0]; k[8]<=in; end
endmodule
(3)8位移位寄存器
module wyjc_8(clear,clk,in,out);
Input clear,clk,in; output[7:0] out; reg[7:0] out;
wire clear,clk,in;
always @(posedge clk or posedge clear) begin
if(clear==1)
out[7:0]<=8’b0; else
begin
out[7]<=in; out[6]<=out[7]; out[5]<=out[6]; out[4]<=out[5]; out[3]<=out[4]; out[2]<=out[3]; out[1]<=out[2]; out[0]<=out[1]; end end
endmodule
(4)整合模块
`include “fenping.v”//将各模块加入文件 `include “mux_4_1.v”
.
.
`include “wyjc_8.v”
module bianma(rst,clk,in,out,clk1); input rst,clk,in; output out; output clk1;
wire clr,clk,in,clk1,rst; wire[7:0] k; wire[2:0] sel; reg g0,g1,g2;
fenping f1(.clk(clk),.clear(clr),.clk1(clk1),.count(sel));//分频器实例化 wyjc_8 w1(.clear(clr),.clk(clk1),.in(in),.out(k));//移位寄存器实例化 mux_4_1
m1(.clk1(clk1),.in(in),.kin(k),.clk(clk),.sel(sel[1:0]),.out(out)); //多路选择器实例化
assign clr=~rst;//复位信号翻转
endmodule
(5)测试程序
·timescale 1 ns/ 1 ns
module bianma_test1;
reg clk,rst,in,code,flag; wire out,clk1;
integer I,j,r_seed; reg[31:0] a;
reg[15:0] c0,c1,c2;
bianma b1(.clk1(clk1),.clk(clk),.rst(rst),.in(in),.out(out));
initial clk=0;//时钟产生 always #5 clk=~clk;
initial//复位部分 begin rst=0; #7 rst=1; end
.
.
initial//结束仿真 #490 $finish;
Initial//输入与对照分量产生 begin
$monitor($stime,,”clk=%b,rst=%b,in=%b,out=%b,code=%b,error=%b ”,clk,rst,in,out,code,flag); a[31:0]=32’b0;
a[18:0]=$random % (1024*8); for(i=0;i<16;i=i+1)
begin
c0[i]=a[i+8]^ a[i+6]^ a[i+5]^ a[i+3]^ a[i+2]^ a[i+1]^a[i]; c1[i]=a[i+8]^ a[i+7]^ a[i+5]^ a[i+4]^ a[i+1]^a[i]; c2[i]=a[i+8]^ a[i+7]^ a[i+6]^ a[i+3]^a[i]; end in=0; flag=0;
#10 in=a[8];
for(i=0;i<16;i=i+1)
begin
#30 in=a[i+9]; end end
initial//采样对比 begin
#20 code=0;
for(j=0;j<16;j=j+1)
begin
#5 code=c0[j];
#5 if(out!=code) flag=1; #5 code=c1[j];
#5 if(out!=code) flag=1; #5 code=c2[j];
#5 if(out!=code) flag=1;
if(flag==1) $dispaly(“error”); end end
initial $sdf_annotate(“bianma.sdf”,b1);//延时文件 endmodule
.
.
四、仿真与综合
1.初始波形(输入
IN为随机数)
图中out端输出为编码器输出,code端输出为对照输出,从仿真波形图可以看出,两者的输出波形完全一致,即编码器工作正常。
2.门级电路仿真
各模块和综合后仿真结果如下4张图所示。
.
.
3.综合后电路信息
.
.
4.综合后仿真波形(输入IN为随机数)
在 control_test.v 文件中加入以下语句,以便将control.sdf 文件标注到测试文件中: initial $sdf_annotate(“control.sdf”,c1); [c1 为测试文件中调用control 电路模块的标签]在对门级电路control.vg 进行仿真时,在仿真命令中使用-v/home2/student/lib/train/verilog/tsmc25.v将库文件引入,得到的仿真波形如下图所示。
.
.
由上图可知,在其他条件不变情况下,编码器工作依然正常,但是out端(实际)的输出与code端(对照)的输出相比,有1ps的延迟。
五.实验思考题
请用 vi 打开control.vg 和control.sdf 文件,理解其中内容,尤其是control.sdf 中的延迟信息是如何表示的,并回答以下问题。
1.control.vg 文件是verilog 语言级的描述还是结构化的描述?
实验中的部分vg文件如下截图所示。
可以看出,vg文件是结构化描述。
2.control.sdf 文件中,对触发器的延迟包括哪些信息,请一一列出。
Sdf文件中关于触发器的描述部分截图如下。
.
.
可以看出触发器的延时信息包括每一个逻辑单元的每一个管脚的上升时延与下降时延的最小值、典型值、最大值。
3.在对门级电路control.vg 进行仿真时,加上+maxdelays 模拟选项,观察仿真结果;并与不加+maxdelays 模拟选项的模拟结果进行比较,如果有不同之处,请将其不同处列在下面,并分析原因。
加上+maxdelays 模拟选项的模拟结果:
通过仿真波形对比发现,是否加入模拟选项之间没有任何差别,实际上使用+maxdelays与不使用+maxdelays在门级仿真中有延时的差别,是因为门级仿真时使用到.sdf文件。这个文件中包含逻辑综合中生成的33个逻辑单元的延时信息。这些信息表示了每一个逻辑单元的每一个管脚的上升时延与下降时延的最小值、典型值、最大值。当使用+maxdelays时,门级仿真使用了延时的最大值,
.
.
故门级仿真波形表现出其延时要长于不用+maxdelays。
六、实验总结
本次ASIC实验课程的要求是编写一个(3,1,8)卷积码编码器,实验过程总体还算顺利,不过也难免遇到一些问题,程序的编写和修改是贯穿始终的,除此之外,首先的问题是理论知识的应用方面,因为我之前对卷积码了解不多,因此不得不查阅相关书籍仔细了解了卷积码的概念和编码过程,另外一点就是在我们进行仿真的最后阶段,输出波形和校验波形之间有一点冒险的差异,我们试图从各个方面查找问题都没有成功,最终还是得到了老师的帮助,顺利完成。实验中除了进一步锻炼了我的动手能力和解决实际问题的能力之外,还进一步让我体会到了理论联系实际的重要性,并且巩固和应用了课堂所学的verilog语言,通过实验,我对这门课有了更深入的了解,也让我更加有了学习的兴趣。我相信今后我会越来越重视和喜欢实验课程。
.
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务