数字光纤通信线路编译码实验

此实验属于西电大三选修光通信课程的实验,共分为两部分,第一部分为光纤通信系统综合实验(在实验室完成),第二部分为数字光纤通信线路编译码实验,此文章主要讲解第二部分,另外两次实验的实验报告与工程文件可前往此处下载:

一、实验目的

  1. 熟悉指定序列NRZ码生成原理以及光纤线路CMI编译码原理。
    2.初步熟练Altera公司QUARTUS II仿真平台的使用。
    3.进一步熟悉数字电路设计技巧。
    4.基本掌握如何进行FPGA的电路设计与仿真。
    5.了解FPGA功能的物理验证。

二、实验环境

QUARTUS II 13.0

三、实验基本原理及预习

  1. 编写VERILOG语言新工程,设计实现FPGA内部功能: 15位学号序列(二进制码(非BCD码)表示的本人学号最后四位(前面补零))NRZ码的生成;
    CMI编码;
    CMI译码(在实验室条件下使用统一系统时钟,输入为CMI编码输出);
    时钟分频功能
  2. 使用对所做设计完成正确编译。
  3. 使用ALTERA-MODELSIM仿真环境完成信号波形仿真。
    FPGA电路仿真的输入输出信号即各测试点信号要求如下:
    输入:系统时钟信号(7.68MC) :1路;
    输出:周期15位二进制后四位学号序列:
    1路;(480Kbps)
    CMI编码输出信号: 1路;
    CMI译码输出信号: 1路;
  4. 对仿真信号波形结果进行原理分析,发现可能的问题并加以解决,得到正确的仿真结果。

四、设计文件

设计文件代码展示

module test_top(
	output reg pin98_te3,  //codein
	output reg pin99_te4,  //cmi_ceded
	output reg pin100_te5, //cmi_decoded
	input wire pin103_te6, //system clk 7.68Mhz
	input wire rst         //reset

);

reg [3:0] counter;   //对时钟clk1十六分频 对时钟clk2八分频
reg clk1;            //学号NRZ序列及CMI解码序列时钟 480kbps
reg clk2;            //CMI编码序列时钟960kpbs

always@(posedge pin103_te6 or negedge rst)      //counter从0到15循环
begin
	if(!rst) counter <= 4'b0;
	else if(counter == 4'b1111)
		begin
			counter <= 4'b0;
		end
	else if(pin103_te6)
		begin 
			counter <= counter+1;
		end
end

// clk1, 16分频
always@(posedge pin103_te6 or negedge rst)
begin
	if(!rst)
	clk1 <= 0;
	else if(counter[3] == 0)
		clk1 <= 1'b0;
	else if(counter[3] == 1)
		clk1 <= 1'b1;
end

//clk2, 8分频
always@(posedge pin103_te6 or negedge rst)
begin
	if(!rst)
	clk2 <= 0;
	else if(counter[2] == 0)
		clk2 <= 1'b1;
	else if(counter[2] == 1)
		clk2 <= 1'b0;
end

//输出15位学号NRZ码  后四位0094  变为1011110
reg [3:0] num;
always@(posedge clk1 or negedge rst)
begin
	if(!rst)
	begin
	num <= 4'b0;
	end
	else if(num == 4'b1111)
		begin
			num <= 4'b0;
		end
	else num <= num+1;
	
	case(num)
	4'b1001:pin98_te3 <=1;
	4'b1010:pin98_te3 <=0;
	4'b1011:pin98_te3 <=1;
	4'b1100:pin98_te3 <=1;
	4'b1101:pin98_te3 <=1;	
	4'b1110:pin98_te3 <=1;	
	4'b1111:pin98_te3 <=0;
	
	default:pin98_te3 <=0;
	endcase
end	
	
reg [1:0] cmi_reg;   //CMI编码寄存器
reg flag =0;
always@(posedge clk1)
begin
	if(pin98_te3 == 0)        //0码变为01码
	cmi_reg <= 2'b01;
	else if(pin98_te3 == 1)   //1码变为00、11交替
	begin
		if(flag == 0)
		begin
			cmi_reg <= 2'b00;
			flag <=~flag;
		end
		else if(flag == 1)
		begin
		cmi_reg <= 2'b11;
		flag <=~flag;
		end
	end
end

//	cmi_ceded  输出CMI编码
reg flag0 = 1'b0;
always@(posedge clk2)
begin
	flag0 <= flag0 + 1;
	if(flag0 == 1)
	pin99_te4 <= cmi_reg[0];
	else if(flag0 == 0)
	pin99_te4<=cmi_reg[1];
end

//cmi_decoded 输出CMI解码
always@(posedge clk2)
	begin
	if(cmi_reg == 2'b01)
	pin100_te5<=0;
	else if(cmi_reg==2'b00 || cmi_reg==2'b11)
	pin100_te5<=1;
	end

endmodule

激励文件等其他部分请前往资源下载(内含完整报告和工程文件):

五、仿真结果分析

MODELSIM软件中的波形仿真文件

光纤通信架构设计_工程文件