【Verilog设计与实现】2ASK调制解调、2FSK调制解调

一、2ASK调制与解调

  • 2ASK调制

【Verilog设计与实现】2ASK调制解调、2FSK调制解调_第1张图片

【Verilog设计与实现】2ASK调制解调、2FSK调制解调_第2张图片

module modulate_2ASK(clk , rst , x, y);

	input	clk,rst;
	input	x;
	
	reg [1:0] cnt;
	reg carry = 0;

	output y; 	//wire类型
	
	//第一步:分频得到载波信号序列:carry,(4分频)
	always@(posedge clk)
		begin
			if(!rst)	//rst低电平有效:置位为0可以重置cnt、carry初值
				begin
				 cnt <= 0;
				 carry <= 0;
				end
			else	
				begin	//高电平:3、0;低电平:1、2
					if(cnt == 3 ) //先判断cnt是否为3:	令carry =1
						begin
							cnt <= 0;
							carry <= 1;
						end
					else if(cnt == 0)	//0:	令carry = 1
						begin
							carry <= 1;
							cnt <= cnt + 1;
						end
					else				//1、2:	令carry = 0	
						begin
							cnt = cnt + 1;
							carry <= 0;
						end
				end
		end
			
	//第二步:基带信号x、载波信号carry,&&
	assign	y = x && carry;

endmodule

【Verilog设计与实现】2ASK调制解调、2FSK调制解调_第3张图片

 

  • 2ASK解调

【Verilog设计与实现】2ASK调制解调、2FSK调制解调_第4张图片

【Verilog设计与实现】2ASK调制解调、2FSK调制解调_第5张图片

module demodulate_2ASK( clk,rst , y, x );

	input clk,rst;
	input y;		//调制信号
	output reg x;	//解调后信号,原始基带信号
	
	reg [3:0] cnt;
	reg [2:0] m;	//记录采样过程中"1"的个数
	reg yy;			//yy
	
	//计数器  0 ~ 11,一直循环累加
	always@(posedge clk)
		begin
			yy <= y;
			if(!rst)
				begin 
					cnt <= 0;
				end
			else
				begin
					if(cnt == 11) 
						cnt <= 0;
					else
						cnt <= cnt +1; // 000、001、···、007
				end
		end
	
	//采样判决
	always@(posedge clk)
		begin 
			if(cnt == 11)	//cnt=11,m重置为0
				begin
					m <= 0;
				end
			else
				begin
					if(cnt == 10)	//cnt=11,开始采样判决
						begin 
							if(m <= 2)	
								x <= 0;
							else		//只要 m 超过 2, 就判决为1
								x <= 1;
						end
					else if(yy == 1)
						m <= m + 1;	//cnt:0 ~ 5,都在累加
				end
		end	
endmodule

 

【Verilog设计与实现】2ASK调制解调、2FSK调制解调_第6张图片

二、2FSK调制解调

  • 2FSK调制

【Verilog设计与实现】2ASK调制解调、2FSK调制解调_第7张图片

【Verilog设计与实现】2ASK调制解调、2FSK调制解调_第8张图片

module modulate_2FSK(clk,rst , x, y);

	input clk, rst;
	input x;
	
	output y;
	
	reg [1:0] cnt1;
	reg	cnt2;
	
	reg y_f1, y_f2; // 2个不同频率的信号
	
	// 利用2位计数器cnt1实现4分频,分频之后的信号为y_f1
	always@(posedge clk or negedge rst)
		begin
			if(!rst)	// rst是低电平有效
				begin
					cnt1 <= 0;
					y_f1	<= 0;
				end
			else
				begin
					if(cnt1 == 2'b11)   //0、1、2、3、 0、1、2、3 、···
						begin
							cnt1 <= 0;
							y_f1 <= ~y_f1;
						end
					else
						cnt1 <= cnt1 + 1;
				end
		end
	
	// 利用1位计数器cnt2实现2分频,分频之后的信号为f2
	always@(posedge clk or negedge rst)
		begin
			if(!rst)	//rst是低电平有效
				begin
					cnt2 <= 0;
					y_f2 <= 0;
				end
			else
			
				begin
					if(cnt2 == 2'b1)
						begin
							cnt2 <= 0;
							y_f2 <= ~y_f2;
						end
					else
						cnt2 <= cnt2 + 1;
				end
		end
	assign y = (x==1)? y_f1 : y_f2;
endmodule

【Verilog设计与实现】2ASK调制解调、2FSK调制解调_第9张图片

  • 2FSK解调

module demodulate_2FSK(clk,rst , x, y);

	input clk, rst;
	input y;
	
	output reg x;
	
	reg clk1;
	reg temp;
	reg [3:0] cnt1;
	reg	[3:0] cnt2;
	
	//计数器,cnt1计数变量:记录clk下调制信号‘0’电平个数
	always@(posedge clk or negedge rst)
		begin
			if(!rst)
				cnt1 <= 0;
			else
				begin 
					if(!y)
						cnt1 <= cnt1 + 1;
					else
						cnt1 <= 0;
				end
		end
	
	//比较器,temp变量:记录‘0’电平个数大于6的数量,采样
	always@(posedge clk or negedge rst)
		begin 
			if(!rst)
				temp <= 0;
			else
				begin 
					if(cnt1 > 6)	//若clk时钟下调制信号中的‘1’电平个数大于6
						temp <=	1;	//temp置为‘1’
					else
						temp <=	0;
				end
		end
	
	//20分频作为采样频率
	always@(posedge clk or negedge rst)
		begin 
			if(!rst)
				begin
					cnt2 <= 0;
					clk1 <= 0;
				end
			else
				begin
					if(cnt2 == 9)
						begin 
							clk1 <= ~clk1;
							cnt2 <= 0;
						end
					else
						cnt2 <= cnt2 + 1;
				end
		end
	
	//调制信号是在clk1的上升沿下的temp状态	
	always@(posedge clk1 or negedge rst)
		begin
			if(!rst)
				x <= 0;
			else
				x <= temp;
		end
	
endmodule

 

你可能感兴趣的:(FPGA课程,2ASK,2FSK,ASK调制,FSK解调,Verilog实现)