串行并行数据转换

前言

串行数据传输通常在数据传输距离较远时使用,而并行数据传输适用于短距离、高速数据交换。通过转换,可以根据实际需求选择合适的传输方式,以优化数据传输效率和速度。串行数据传输在长距离传输中可以减少信号的干扰和失真,因为它只使用一条数据线。而并行传输由于多条数据线可能引入干扰,串行并行转换可以在需要时将数据转为串行传输,以减少干扰。在多种接口标准之间转换数据时,串行并行转换可以实现不同接口之间的数据兼容。例如,许多现代通信系统使用串行接口,而内部处理可能使用并行数据格式,转换可以使系统之间的数据交换顺畅。在某些应用中,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与串行输入结果相同,实验成功。

参考资料

串并转换

相关推荐
内有小猪卖2 小时前
时序约束 记录
fpga开发
Cao1234567893215 小时前
FPGA时钟设计
fpga开发
JNTeresa8 小时前
锁存器知识点详解
fpga开发
Cao12345678932111 小时前
FPGA基础之基础语法
fpga开发
一大Cpp11 小时前
通过Quartus II实现Nios II编程
fpga开发
7yewh12 小时前
Verilog 语法 (二)
fpga开发
边缘计算社区1 天前
FPGA与边缘AI:计算革命的前沿力量
人工智能·fpga开发
S&Z34631 天前
[官方IP] Shift RAM
网络协议·tcp/ip·fpga开发
S&Z34631 天前
[FPGA Video IP] Video Processing Subsystem
网络协议·tcp/ip·fpga开发·video
FPGA_Linuxer1 天前
FPGA 100G UDP纯逻辑协议栈
网络协议·fpga开发·udp