FPGA中的简单并串,串并转换

笔者在做OFDM扰码模块的时候,发现PSDU数据帧输入是并行数据,需要进行并串转换,才能进入扰码器进行扰码

在进行FFT的时候需要串转并,后面添加仿真图;

并——>串

FPGA中的简单并串,串并转换_第1张图片

从图中可以看出,并串转换的原理是:先将四位数据暂存于一个四位寄存器器中,然后左移输出到一位输出端口,这里通过一个“移位”指令就ok了。

如:

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2019/01/10 13:21:25
// Design Name: 
// Module Name: para_serial
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module para_serial(
clk,
rst_n,
data_para_en,
data_para,
sda_en,  //外部待传输数据输入
sda  //三态数据输入
);
 
input wire clk;
input wire rst_n;
input data_para_en;
input [7:0] data_para;
output reg sda;
output reg sda_en;
 
reg [7:0]sda_buf;
reg [3:0]counter;
reg dv;
 
 
//计数器
always@(posedge clk or negedge rst_n)
	begin
		if(!rst_n)
			begin
				dv <= 0;
			end
		else
			begin
			  if(data_para_en)
			    begin
                  sda_buf<= data_para;
                  dv <= 1; 
                 end
			end
	end
	
	
always@(posedge clk or negedge rst_n)
    begin
      if(!rst_n)
         begin
         	sda<=0;
            sda_buf<= 0;
            counter<=0;
            sda_en<=0;  
         end
      else
        if(dv)
            begin
                if(counter<8)
                      begin
                          counter<=counter+1'b1;
                          sda_buf<={sda_buf[6:0],sda_buf[7]};
                          sda<=sda_buf[7];
                          sda_en<=1;
                      end
                         else
                            begin
                               counter<=0;
                               sda<=0;
                               sda_en<=0;
                            end
            end
    end
endmodule 


tb:

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2019/01/10 13:30:06
// Design Name: 
// Module Name: para_serial_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module para_serial_tb();

reg clk;
reg rst_n;
reg data_para_en;
reg [7:0] data_para;
wire sda;
wire sda_en;

para_serial para_serial_inst(
.clk(clk),
.rst_n(rst_n),
.data_para_en(data_para_en),
.data_para(data_para),
.sda_en(sda_en),  //外部待传输数据输入
.sda(sda)  //三态数据输入
);
initial begin
 clk = 0;
 rst_n = 0;
 data_para_en = 0;
 data_para = 7'b0;
 #300
 rst_n = 1;
 #40
 data_para_en = 1;
 data_para = 7'b00010001;
 #200
 data_para = 7'b11111111;
 #200
 $stop;
end


always #10 clk = ~clk;
endmodule

 

 FPGA中的简单并串,串并转换_第2张图片

 

串------->并

FPGA中的简单并串,串并转换_第3张图片

从图中可以看出,串并转换的原理是:新输入的位值成为原来数据的最低位,将原来数据的最高位舍去,这里可以通过一个简单的“连接符”就能搞定。

reg [7:0]sda_reg;
//wire en;
 
always@(posedge clk or negedge rst_n)
	begin
		if(!rst_n)
			begin
				sda_reg<=0;
			end
		else
			begin
				if(en)
					begin
						sda_reg<={sda_reg[6:0],sda};  //将并转串模块输出的串行数据sda转入sda_reg的每一位(从低位到高位)
					end
				else
					begin
						sda_reg<=0;
					end
			end
	end
	

 

你可能感兴趣的:(fpga,ofdm)