串行扰码和解扰码的设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.串行扰码和解扰码的设计
实验原理
在数字通信系统中,若经常出现长的“0”或“1”系列,将会影响位同步的建立和保持。

为了解决这个问题以及限制电路中存在的不同程度的非线性特性对其他电路通信造成的串扰,要求数字信号的最小周期足够长。

将数字信号变成具有近似于白噪声统计特性的数字序列即可满足要求,这通常用加扰来实现。

而所谓加扰,就是不用增加冗余而扰乱信号,改变数字信号统计特性,使其具有近似白噪声统计特性的一种技术。

扰码产生是通过循环移位寄存器来实现的,而扰码生成多项式决定循环移位寄存器的结构。

本节使用的扰码生成多项式为:X7 + X6 + 1
设扰码的输入数字序列为t k ,输出为S k ;解码器的输入为S k ,输出为r k 。

扰码器的输入和输出序列关系为:S k = t
X
X7
解扰码器的输入和输出序列关系为:r k = S
X
X7
= t
X
X
X
X7
= t k
串行扰码器的电路结构图如图1所示:
k
图1 串行加扰器电路结构
串行扰码器的电路结构图如图2所示:
输出r k
图2 串行解扰器电路结构
扰码器实质上是一个反馈移位寄存器,其输出为一个m序列。

它能最有效地将输入序列搅乱,使输出数字码元之间相关性最小。

实验步骤
一、打开Project Navigator
在桌面上面双击Xilinx ISE 12.4的快捷方式图标
打开Project Navigator的界面如下:
二、创建一个新的工程
单击File New Project…,弹出下面对话框
在这里填写将要创建的工程的名称(Project Name),路径(Project Location),和工程的顶层模块类型(Top-Level Module Type)。

填写好后单击下一步:
在这个对话框里面选择:
Family 使用的FPGA的种类
Device 使用的FPGA的型号
Package 使用的FPGA的封装
Speed 使用的FPGA的速度
Top-Level Source Type 顶层模块类型
Synthesis Tool 综合工具
Simulator 仿真工具
填写好FPGA型号和使用的综合,仿真软件以后点击下一步:
在这个对话框里面显示将要创建的工程的全部信息,确认无误后点击完成。

三、为工程添加源文件
在xc3s400-4pq208图标上面点击鼠标右键,选择New Source…选项
选择了New Source将弹出如下对话框:
在右面的File Name栏里面填写要生成的源文件的名字,路径一般位于工程文件夹里面,没有特殊需要不必更改,一定要选择Add to project,然后在左边的一排图标里面选择源文件的类型后点击下一步:
可以在上面的对话框里面输入源文件的模块名称和管脚定义,也可以先不输入,后面写程序的时候自己输入。

单击下一步:
确认信息无误后,点击完成,将生成名为serial_scram.v的源文件。

在输入程序之前,要注意代码的可综合性问题。

由于原程序中所给的异步复位信号的代码风格(即在rst_n的下降沿触发,又高电平有效复位)在ISE12.4中是不可综合的,只能进行功能上的仿真,为了达到既能进行功能仿真又能综合成具
体的电路结构的目的,需将rst_n改为低电平有效复位。

输入扰码的程序:
module serial_scram(clk,
rst_n,
scram_in,
scram_out);
input clk,rst_n; //rst_n为复位信号,低电平有效
input scram_in; //扰码数据输入
output scram_out; //扰码数据输出
reg [6:0] feedback_reg; //反馈移位寄存器
//输出的反馈异或关系
assign scram_out = feedback_reg[6] ^ feedback_reg[5] ^ scram_in;
always @ (posedge clk or negedge rst_n) begin
if(!rst_n) //已将rst改为!rst(考虑到可综合性问题)feedback_reg[6:0] <= 7'b111_1111;
else begin
//寄存器反馈异或关系
feedback_reg[6:1] <= feedback_reg[5:0];
feedback_reg[0] <= feedback_reg[6] ^ feedback_reg[5] ^ scram_in;
end
end
endmodule
输入好程序以后,保存源文件。

同样,新建一个serial_descram.v的源文件并输入解扰码程序:
module serial_descram(clk,
rst_n,
descram_in,
descram_out);
input clk,rst_n; //rst_n为复位信号,低电平有效
input descram_in; //解扰码数据输入
output descram_out; //解扰码数据输出
reg [6:0] shift_reg; //移位寄存器
//输出的反馈异或关系
assign descram_out = shift_reg[6] ^ shift_reg[5] ^descram_in;
always @ (posedge clk or negedge rst_n) begin
if(!rst_n) //已将rst改为!rst(考虑到可综合性问题)shift_reg[6:0] <= 7'b111_1111;
else begin
//寄存器反馈异或关系
shift_reg[6:1] <= shift_reg[5:0];
shift_reg[0] <= descram_in;
end
end
endmodule
输入好程序以后,保存源文件。

四、综合仿真
(一)综合
在Process对话框里面双击Synthesize - XST
仿真主要检查源文件程序里面的语法错误(Check Syntax),如果没有语法错误,会在console对话框中出现Process "Synthesize - XST" completed successfully。

如果在这步软件发现源程序的设计语言有语法毛病,就会弹出Error警告,这样就可以根据报错的位置,在源程序里面查找错误位置。

改好以后重新进行综合。

(二)仿真
1、建立仿真文件
新建一个tb_scram_descram.v的源文件,输入仿真程序:
module tb_scram_descram;
reg clk;
reg rst_n;
reg [7:0] shift_reg;
wire scram_in; //扰码器的输入端
wire scram_out; //既是扰码器的输出端,也是解扰器的输入端
wire descram_out; //解扰器的输出端
parameter period = 20;
initial begin
clk = 1;
rst_n = 0; //已将rst_n = 1改为rst_n = 0
#(4*period) rst_n = 1; //已将rst_n = 0改为rst_n = 1
end
//根据第8章,伪随机序列产生的原理,产生一个伪随机的序列作为加扰器的输入数据,//该伪随机序列的生成多项式为x^8 + x^4 + x^3 + x^2 + 1
always @ (posedge clk) begin
if(!rst_n) //已将rst_n改为!rst_n
shift_reg[7:0] <= 8'b1111_1111;
else begin
shift_reg[7:1] <= shift_reg[6:0];
shift_reg[0] <= shift_reg[7] ^ shift_reg[3] ^ shift_reg[2] ^ shift_reg[1];
end
end
assign scram_in = shift_reg[7];
always #(period/2) clk = ~clk; //时钟激励
//加扰、解扰器模块调用
serial_scram u1 (.clk(clk),
.rst_n(rst_n),
.scram_in(scram_in),
.scram_out(scram_out));
serial_descram u2 (.clk(clk),
.rst_n(rst_n),
.descram_in(scram_out),
.descram_out(descram_out));
endmodule
在view对话框中选择simulation可以看到仿真文件:
双击processes对话框中的simulat behavioral model选项
如果程序没有错误,将会自动弹出仿真波形,点击按钮,就可以看到如下波形:
注意:仿真结果问题。

根据教材上的程序描述可以知道,从加扰器的输入到输出以及从解扰器的输入到输出都是采用组合逻辑结构实现的,因此在功能仿真中解扰器的输出数据和加扰器的输入数据并没有时序上的延时。

相关文档
最新文档