串行并行数据转换

前言

串行数据传输通常在数据传输距离较远时使用,而并行数据传输适用于短距离、高速数据交换。通过转换,可以根据实际需求选择合适的传输方式,以优化数据传输效率和速度。串行数据传输在长距离传输中可以减少信号的干扰和失真,因为它只使用一条数据线。而并行传输由于多条数据线可能引入干扰,串行并行转换可以在需要时将数据转为串行传输,以减少干扰。在多种接口标准之间转换数据时,串行并行转换可以实现不同接口之间的数据兼容。例如,许多现代通信系统使用串行接口,而内部处理可能使用并行数据格式,转换可以使系统之间的数据交换顺畅。在某些应用中,FPGA等硬件平台可以通过串行并行数据转换实现灵活的设计,简化电路结构,降低成本和复杂度,同时提高系统的整体性能。

正文

一、串行并行数据转换

1.项目需求

进行串行数据转换为并行数据,并行数据转化为串行数据实验

2.技术介绍

并转串的设计思想:首先准备好一组寄存器,把需要发送的数据(并行数据)放到这个寄存器组里面,然后通过位拼接的移位方式把这个并行数据一位一位地发送给接收端,同时拉高标志信号en,当全部数据发送完之后,再把标志信号en拉低。

串转并的设计思想:准备好一组寄存器,接收串行数据,将数据按位移入寄存器组,然后将整个寄存器组的数据组合成一个完整的并行数据字。使用一组寄存器暂时存储数据,然后逐位将数据移出至串行输出端,同时使用标志信号指示何时数据转换完成。

3.顶层架构

并转串

串转并

4.端口描述

并转串

|---------------|-------------|
| clk | 系统时钟(50Mhz) |
| rst_n | 复位按键(低电平有效) |
| sda_in[7:0] | 并行数据输入 |
| en串行数据 | 串行输出有效信号 |
| sda_out | 串行输出 |

串转并

|----------------|-------------|
| clk | 系统时钟(50Mhz) |
| rst_n | 复位按键(低电平有效) |
| en | 串行输入有效信号 |
| sda_in | 串行输入 |
| sda_out[7:0] | 并行输出 |

二、代码验证

并转串:

复制代码
module para_serial(

	input clk,
	input rst_n,
	input [7:0]sda_in,//并行输入
	
	output reg en,
	output reg sda_out//串行输出

);


reg [7:0]sda;//并行数据寄存器
reg [3:0]cnt;//移位计数器

always @(posedge clk,negedge rst_n)
begin
	if(rst_n == 0)
		begin
			sda_out <= 1'b0;
			cnt <= 4'd0;
			sda <= 8'b0;
			en  <= 1'b0;
		end
	else
		begin
			if(cnt == 0)//数据加载
				begin
					sda <= sda_in;
					cnt <= 4'd1;
				end
			else if(cnt < 9)//移位输出
				begin
					en  <= 1'b1;
					cnt <= cnt + 4'd1;
					sda <= {sda[6:0],sda[7]};
					sda_out <= sda[7];
				end
			else
				begin
					cnt <= 4'd0;//系统复位
					sda <= 8'b0;
					en  <= 1'b0;
				end
		end
end

endmodule

仿真程序

复制代码
`timescale 1ns/1ps
module para_serial_tb;

	reg clk;
	reg rst_n;
	reg [7:0]sda_in;
	
	wire en;
	wire sda_out;
	
	
para_serial para_serial_inst(

	.clk(clk),
	.rst_n(rst_n),
	.sda_in(sda_in),

	.en(en),
	.sda_out(sda_out)

);
	
initial clk = 1;
always #10 clk = ~clk;

initial begin
	rst_n = 0;
	#10
	rst_n = 1;
	sda_in = 8'b1011_0100;//数据载入
	#200
	sda_in = 8'b1010_0001;//数据载入
	#200
	$stop;
end
	
endmodule

串转并

复制代码
module serial_para(

	input clk,
	input rst_n,
	input sda_in,//串行输入
	input en,//输入有效
	
	output reg [7:0] sda//并行输出

);

always @(posedge clk,negedge rst_n)
begin
	if(rst_n == 0)
		begin
			sda <= 8'b0;
		end
	else
		begin
			if(en == 1)//输入使能
					sda <= {sda[6:0],sda_in};//数据并位
			else
					sda <= 8'b0;
		end
end

endmodule

创建顶层,利用并转串输出数据

复制代码
module top(//进行数据连线

	input clk,
	input rst_n,
	input [7:0]sda_in,
	
	output en,
	output sda_out,
	output [7:0]sda

);

	
	
para_serial para_serial_inst(

	.clk(clk),
	.rst_n(rst_n),
	.sda_in(sda_in),

	.en(en),
	.sda_out(sda_out)

);
	
serial_para serial_para_inst(

	.clk(clk),
	.rst_n(rst_n),
	.sda_in(sda_out),
	.en(en),

	.sda(sda)

);
endmodule

仿真程序

复制代码
`timescale 1ns/1ps
module para_serial_tb;

	reg clk;
	reg rst_n;
	reg [7:0]sda_in;
	
	wire en;
	wire sda_out;
	wire [7:0]sda;
	
	
top top_inst(

	.clk(clk),
	.rst_n(rst_n),
	.sda_in(sda_in),
	
	.en(en),
	.sda_out(sda_out),
	.sda(sda)

);

	
initial clk = 1;
always #10 clk = ~clk;

initial begin
	rst_n = 0;
	#10
	rst_n = 1;
	sda_in = 8'b1011_0100;
	#200
	sda_in = 8'b1010_0001;
	#200
	$stop;
end
	
endmodule

三、仿真验证

并转串:观察仿真波形图,数据有正常显示,调出过程信号

数据在cnt=0的时钟上升沿时候加载sda,在cnt=1的时候显示输入并进行移位,在cnt=2的时候显示移位结果,并将移位结果输出,依次循环移,直到cnt=8的时钟上升沿对输入数据移位完8次,在cnt = 9的时候输出数据并系统复位,在下一个cnt=0的上升沿时钟加载数据

上图输入10110100,输出电平在en有效下依次为10110100,下图输入10100001输出电平在en有效下依次为10100001,数据转化正确。

串转并:可以观察到在en拉低后sda输出10110100与并转串模块输入数据相同。

在时钟上升沿读取到en=1后将串行输入依次移位保存到并行输出串口并输出,串行输入10100001,经过8次en=1的时钟上升沿后由于输入en为并转串的输出使能,经过8个时钟周期后数据输出完成,en拉低,此时串转并模块输出上个时钟周期产生的完整串转并数据。此时数据为10100001与串行输入结果相同,实验成功。

参考资料

串并转换

相关推荐
XINVRY-FPGA15 小时前
XCVP1802-2MSILSVC4072 AMD Xilinx Versal Premium Adaptive SoC FPGA
人工智能·嵌入式硬件·fpga开发·数据挖掘·云计算·硬件工程·fpga
9527华安1 天前
国产安路FPGA开发设计培训课程,提供开发板+工程源码+视频教程+技术支持
fpga开发·fpga·安路·视频教程·培训·安路fpga
UVM_ERROR2 天前
硬件设计实战:解决Valid单拍采样失效问题(附非阻塞赋值与时序对齐核心要点)
驱动开发·fpga开发·github·芯片
brave and determined2 天前
可编程逻辑器件学习(day36):从沙粒到智能核心:芯片设计、制造与封装的万字全景解析
fpga开发·制造·verilog·fpga·芯片设计·硬件设计·芯片制造
步达硬件2 天前
【FPGA】FPGA开发流程
fpga开发
我爱C编程3 天前
【仿真测试】基于FPGA的完整16QAM通信链路实现,含频偏锁定,帧同步,定时点,Viterbi译码,信道,误码统计
fpga开发·16qam·帧同步·卷积编码·viterbi译码·维特比译码·频偏锁定
s09071363 天前
ZYNQ DMA to UDP 数据传输系统设计文档
网络协议·fpga开发·udp
燎原星火*4 天前
QSPI IP核 基本参数
fpga开发
XINVRY-FPGA4 天前
XCVU9P-2FLGC2104I Xilinx AMD Virtex UltraScale+ FPGA
嵌入式硬件·机器学习·计算机视觉·fpga开发·硬件工程·dsp开发·fpga
FPGA_小田老师4 天前
FPGA Debug:PCIE一直自动重启(link up一直高低切换)
fpga开发·pcie debug·pcie初始化问题