串行并行数据转换

种地  论坛元老 | 2024-8-11 07:43:49 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1724|帖子 1724|积分 5172

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
前言

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

并转串:
  1. module para_serial(
  2.         input clk,
  3.         input rst_n,
  4.         input [7:0]sda_in,//并行输入
  5.        
  6.         output reg en,
  7.         output reg sda_out//串行输出
  8. );
  9. reg [7:0]sda;//并行数据寄存器
  10. reg [3:0]cnt;//移位计数器
  11. always @(posedge clk,negedge rst_n)
  12. begin
  13.         if(rst_n == 0)
  14.                 begin
  15.                         sda_out <= 1'b0;
  16.                         cnt <= 4'd0;
  17.                         sda <= 8'b0;
  18.                         en  <= 1'b0;
  19.                 end
  20.         else
  21.                 begin
  22.                         if(cnt == 0)//数据加载
  23.                                 begin
  24.                                         sda <= sda_in;
  25.                                         cnt <= 4'd1;
  26.                                 end
  27.                         else if(cnt < 9)//移位输出
  28.                                 begin
  29.                                         en  <= 1'b1;
  30.                                         cnt <= cnt + 4'd1;
  31.                                         sda <= {sda[6:0],sda[7]};
  32.                                         sda_out <= sda[7];
  33.                                 end
  34.                         else
  35.                                 begin
  36.                                         cnt <= 4'd0;//系统复位
  37.                                         sda <= 8'b0;
  38.                                         en  <= 1'b0;
  39.                                 end
  40.                 end
  41. end
  42. endmodule
复制代码
        仿真程序
  1. `timescale 1ns/1ps
  2. module para_serial_tb;
  3.         reg clk;
  4.         reg rst_n;
  5.         reg [7:0]sda_in;
  6.        
  7.         wire en;
  8.         wire sda_out;
  9.        
  10.        
  11. para_serial para_serial_inst(
  12.         .clk(clk),
  13.         .rst_n(rst_n),
  14.         .sda_in(sda_in),
  15.         .en(en),
  16.         .sda_out(sda_out)
  17. );
  18.        
  19. initial clk = 1;
  20. always #10 clk = ~clk;
  21. initial begin
  22.         rst_n = 0;
  23.         #10
  24.         rst_n = 1;
  25.         sda_in = 8'b1011_0100;//数据载入
  26.         #200
  27.         sda_in = 8'b1010_0001;//数据载入
  28.         #200
  29.         $stop;
  30. end
  31.        
  32. endmodule
复制代码
串转并
  1. module serial_para(
  2.         input clk,
  3.         input rst_n,
  4.         input sda_in,//串行输入
  5.         input en,//输入有效
  6.        
  7.         output reg [7:0] sda//并行输出
  8. );
  9. always @(posedge clk,negedge rst_n)
  10. begin
  11.         if(rst_n == 0)
  12.                 begin
  13.                         sda <= 8'b0;
  14.                 end
  15.         else
  16.                 begin
  17.                         if(en == 1)//输入使能
  18.                                         sda <= {sda[6:0],sda_in};//数据并位
  19.                         else
  20.                                         sda <= 8'b0;
  21.                 end
  22. end
  23. endmodule
复制代码
创建顶层,利用并转串输出数据
  1. module top(//进行数据连线
  2.         input clk,
  3.         input rst_n,
  4.         input [7:0]sda_in,
  5.        
  6.         output en,
  7.         output sda_out,
  8.         output [7:0]sda
  9. );
  10.        
  11.        
  12. para_serial para_serial_inst(
  13.         .clk(clk),
  14.         .rst_n(rst_n),
  15.         .sda_in(sda_in),
  16.         .en(en),
  17.         .sda_out(sda_out)
  18. );
  19.        
  20. serial_para serial_para_inst(
  21.         .clk(clk),
  22.         .rst_n(rst_n),
  23.         .sda_in(sda_out),
  24.         .en(en),
  25.         .sda(sda)
  26. );
  27. endmodule
复制代码
        仿真程序
  1. `timescale 1ns/1ps
  2. module para_serial_tb;
  3.         reg clk;
  4.         reg rst_n;
  5.         reg [7:0]sda_in;
  6.        
  7.         wire en;
  8.         wire sda_out;
  9.         wire [7:0]sda;
  10.        
  11.        
  12. top top_inst(
  13.         .clk(clk),
  14.         .rst_n(rst_n),
  15.         .sda_in(sda_in),
  16.        
  17.         .en(en),
  18.         .sda_out(sda_out),
  19.         .sda(sda)
  20. );
  21.        
  22. initial clk = 1;
  23. always #10 clk = ~clk;
  24. initial begin
  25.         rst_n = 0;
  26.         #10
  27.         rst_n = 1;
  28.         sda_in = 8'b1011_0100;
  29.         #200
  30.         sda_in = 8'b1010_0001;
  31.         #200
  32.         $stop;
  33. end
  34.        
  35. 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与串行输入结果雷同,实验成功。

参考资料

串并转换

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

种地

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表