精华内容
下载资源
问答
  • 串行并行
    千次阅读
    2019-07-31 19:21:31

    串行传输:串行传输即串行通信,是指使用一条数据线 将数据一位一位地依次传输,每一个数据占据一个固定的时间长度,其只需要少数几条线就可以在系统之间交换信息,特别适合计算机和计算机  计算机和外设之间的远距离通信。

    并行传输:并行传输指的是数据以成组的方式,在多条并行信道上同时进行传输,是在传输中有多条数据位同时在设备之间进行传输。

    区别:串行传输的速度比并行传输的速度要慢的多,但是费用低并行传输适用距离短,而串行传输适用远距离传输。

    并行传输即使=同步通信较复杂,双方时钟的允许误差较小,串行传输即异步通信简单,双方时钟可允许一定误差。

    并行传输可以用与点对多点,串行传输只用于点对点。

    并行传输的实现

    一个采用8单位二进制码构成了一个字符进行并行传输,系统采用8个信道并行传输,一次传送一个字符,因此收、发双方不存在字符同步的问题,不需要额外的措施来实现收发双方的字符同步,这是并行传输的主要优点。

    但是并行传输必须有多条并行信道,成本比较高,不易远距离传输。

    这类总线传输速度快,但适用于短距离传送。典型的有S-100总线、MUI.TIBUS总线、标准总线、IEEE-488总线等。并行标准总线通常是用于插件板之间的连接。只有IEEE-488是用于系统和系统之间的连接。

    更多相关内容
  • 用于串行数据并行数据的VHDL代码,可参考,欢迎下载
  • 名称:并行数据转换为串行数据 说 明 : 切 换 连 接 到 并 串 转 换 芯 片74LS165 的拨码开关,该芯片将并行数据以串行方式发送到 8051 的 RXD 引脚,移位脉冲由 TXD 提供,显示在 P0 口。
  • 串行通讯 一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。串行通讯的特点是:数据位传送,传按位顺序进行,少只需一根传输线即可完成,成本低但送速度慢。串行通讯的距离可以从几米到几千米。 根据...
  • 串行数据并行数据与并行数据转串行数据行转串行代码 module parallel_to_serial(clk,data_in,data_out,state); input clk;input [7:0] data_in;output data_out;output [7:0] state;reg [7:0] state=0;reg data_...
  • 模块功能:接收串行数据,转为并行数据。 应用场景:在SPI,Uart等串行协议接收侧均有应用。 二. 模块框图使用说明 有两种模式(通过参数SDATA_IS_CONTINUOUS进行选择): 1.数据连续模式,此时sdata_valid指示...

    一. 模块功能与应用场景

    模块功能:接收串行数据,转为并行数据。

    应用场景:在SPI,Uart等串行协议接收侧均有应用。

    二. 模块框图与使用说明

    Verilog功能模块-串行数据转并行数据-1

    有两种模式(通过参数SDATA_IS_CONTINUOUS进行选择):

    1.数据连续模式,此时sdata_valid指示有效数据开始,在并行数据接收完成前,后面数据均有效。输入时序如下图。

    Verilog功能模块-串行数据转并行数据-2

    2.数据不连续模式,此时sdata_valid指示当前数据有效。输入时序如下图。

    Verilog功能模块-串行数据转并行数据-3

    注意:

    1.sdata与sdata_valid应同步有效,且因为代码中有同步处理,所以这两者不需要与sclk的某边沿同步

    2.sdata应从最高位开始发

    2.第一组数据和第二组数据之间的间隔可以为0~N个时钟周期,即可以连续发不间隔,也可以有任意间隔。

    三. 模块代码

    /*
     * @Author       : Xu Dakang
     * @Email        : XudaKang_up@qq.com
     * @Date         : 2021-04-24 12:27:11
     * @LastEditors  : Xu Dakang
     * @LastEditTime : 2021-04-25 21:08:14
     * @Filename     : sdata2pdata.sv
     * @Description  : 输入串行数据,输出并行数据,实现串转并
    */
    
    
    
    module sdata2pdata
    #(
      parameter PDATA_WIDTH = 24,
      parameter SDATA_IS_CONTINUOUS = 0
    )(
      output logic [PDATA_WIDTH-1 : 0] pdata,
      output logic                     pdata_valid,
    
      input  logic                     sdata,
      input  logic                     sdata_valid,
    
      input  logic                     sclk,
    
      input  logic rstn
    );
    
    
    
    //< 输入信号同步 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    logic sdata_r1;
    logic sdata_r2;
    logic sdata_r3;
    always_ff @(posedge sclk) begin
      sdata_r1 <= sdata;
      sdata_r2 <= sdata_r1;
      sdata_r3 <= sdata_r2;
    end
    
    
    logic sdata_valid_r1;
    logic sdata_valid_r2;
    always_ff @(posedge sclk) begin
      sdata_valid_r1 <= sdata_valid;
      sdata_valid_r2 <= sdata_valid_r1;
    end
    //< 输入信号同步 ------------------------------------------------------------
    
    
    
    //> 串行数据计数 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    logic [$clog2(PDATA_WIDTH+1)-1 : 0] sdata_cnt;
    
    logic sdata_cnt_en;
    always_ff @(posedge sclk, negedge rstn) begin
      if (~rstn)
        sdata_cnt_en <= '0;
      else if (SDATA_IS_CONTINUOUS)
        if (sdata_valid_r2 && (sdata_cnt == '0 || sdata_cnt == PDATA_WIDTH - 1 || sdata_cnt ==  PDATA_WIDTH))
          sdata_cnt_en <= 1'b1;
        else if (~sdata_valid_r2 && sdata_cnt ==  PDATA_WIDTH - 1)
          sdata_cnt_en <= 1'b0;
        else
          sdata_cnt_en <= sdata_cnt_en;
      else
        sdata_cnt_en <= sdata_valid_r2;
    end
    
    
    always_ff @(posedge sclk, negedge rstn) begin
      if (~rstn)
        sdata_cnt <= '0;
      else if (sdata_cnt_en)
        if (sdata_cnt == PDATA_WIDTH) // 数据有效时,一组数据刚转换完成,下一组的第一个数据来了,计为1
          sdata_cnt <= 'b1;
        else //! 数据有效时,一组数据还未转换完成,计数加1
          sdata_cnt <= sdata_cnt + 1'b1;
      else if (sdata_cnt == PDATA_WIDTH) // 一组数据转换完成,下一组数据没马上来,回到0
        sdata_cnt <= '0;
      else
        sdata_cnt <= sdata_cnt;
    end
    //> 串行数据计数 ------------------------------------------------------------
    
    
    
    //< 生成输出 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    logic [PDATA_WIDTH-1 : 0] pdata_temp; // pdata的计算中间值
    always_ff @(posedge sclk, negedge rstn) begin
      if (~rstn)
        pdata_temp <= '0;
      else if (sdata_cnt_en)
        pdata_temp <= {pdata_temp[PDATA_WIDTH-2 : 0], sdata_r3};
      else
        pdata_temp <= pdata_temp;
    end
    
    
    always_ff @(posedge sclk, negedge rstn) begin
      if (~rstn)
        pdata <= '0;
      else if (sdata_cnt == PDATA_WIDTH)
        pdata <= pdata_temp;
      else
        pdata <= pdata;
    end
    
    
    always_ff @(posedge sclk, negedge rstn) begin
      if (~rstn)
        pdata_valid <= '0;
      else if (sdata_cnt == PDATA_WIDTH)
        pdata_valid <= 1'b1;
      else
        pdata_valid <= '0;
    end
    //< 生成输出 ------------------------------------------------------------
    
    
    
    endmodule
    

    四. testbench

    /*
     * @Author       : Xu Dakang
     * @Email        : XudaKang_up@qq.com
     * @Date         : 2021-04-24 12:27:28
     * @LastEditors  : Xu Dakang
     * @LastEditTime : 2021-04-25 21:05:02
     * @Filename     : sdata2pdata_tb.sv
     * @Description  : testbench of sdata2pdata
    */
    
    
    
    module sdata2pdata_tb ();
    
    timeunit 1ns;
    timeprecision 10ps;
    
    localparam PDATA_WIDTH = 5;
    localparam SDATA_IS_CONTINUOUS = 1;
    
    logic [PDATA_WIDTH-1 : 0] pdata;
    logic                     pdata_valid;
    
    logic                     sdata;
    logic                     sdata_valid;
    logic                     sclk;
    logic                     rstn;
    
    
    
    // 实例化模块
    sdata2pdata #(
      .PDATA_WIDTH (PDATA_WIDTH),
      .SDATA_IS_CONTINUOUS (SDATA_IS_CONTINUOUS)
    ) sdata2pdata_inst(.*);
    
    
    
    // 产生测试数据 最大值 2^PDATA_WIDTH-1
    localparam NUM = 15;
    logic [PDATA_WIDTH-1 : 0] pdata_list [NUM];
    initial begin
      for (int i = 0; i < NUM; i++) begin
        pdata_list[i] = {$random()} % (2**PDATA_WIDTH);
      end
    end
    
    
    
    // 生成时钟
    localparam CLKT = 2;
    initial begin
      sclk = 0;
      forever #(CLKT / 2) sclk = ~sclk;
    end
    
    
    
    // 数据连续模式
    initial begin
      if (SDATA_IS_CONTINUOUS == 1) begin
        rstn = 0;
        sdata_valid = 0;
        #(CLKT * 2)  rstn = 1;
        for (int i = 0; i < NUM; i++) begin
          sdata_valid = 1;
          for (int j = 0; j < PDATA_WIDTH; j++) begin
            sdata = pdata_list[i][PDATA_WIDTH-1-j];
            #(CLKT) sdata_valid = 0;
          end
          #(CLKT * ({$random} % 3)) ; // 数据连续模式时,可在各组数据间插入随机时钟间隔
        end
    
        #(CLKT * 10) $stop;
      end
    end
    
    
    // 数据不连续模式
    initial begin
      if (SDATA_IS_CONTINUOUS == 0) begin
        rstn = 0;
        sdata_valid = 0;
        #(CLKT * 2)  rstn = 1;
        for (int i = 0; i < NUM; i++) begin
          for (int j = 0; j < PDATA_WIDTH; j++) begin
            sdata = pdata_list[i][PDATA_WIDTH-1-j];
            sdata_valid = 1;
            #CLKT ;
            sdata_valid = 0;
            #(CLKT * ({$random} % 3)) ; // 数据不连续模式时,可在同组数据间插入随机时钟间隔
          end
          sdata_valid = 0;
          #(CLKT * ({$random} % 3)) ;
        end
    
        #(CLKT * 10) $stop;
      end
    end
    
    
    
    endmodule
    

    五. 仿真验证

    仿真工具:Vivado 2020.2 Simulator。

    数据连续模式,从结果可以看出,串转并输出正确。

    image-20210425212255013

    数据不连续模式,同样正确。

    image-20210425212515021

    六. 工程分享

    sdata2pdata 串转并模块 vivado 2020.2工程.7z

    链接:https://pan.baidu.com/s/1wBCLjYqcjj0HGm_S9O5iOQ
    提取码:j3z4

    展开全文
  • 单片机串行数据转换为并行数据,比赛练习案例,仿真实例,现成调用封装使用,可运行的仿真电路图和调好的程序,开箱即用。适用于教学案例、毕业设计、电子设计比赛、出书项目实例,实际设计、个人DIY参考。 已调试好...
  • 单片机C语言程序设计 串行数据转换为并行数据(有源码)单片机C语言程序设计 串行数据转换为并行数据(有源码)单片机C语言程序设计 串行数据转换为并行数据(有源码)单片机C语言程序设计 串行数据转换为并行数据(有...
  • 名称:串行数据转换为并行数据 说明:串行数据由 RXD 发送给串 并转换芯片 74164,TXD 则用于输出移位时钟脉冲,74164 将串行输入的 1 字节转换为并行数据,并将转换的数据通过 8 只 LED 显示出来。本例串口工作...
  • 本文通过12位串行ADC ADS7822和并行ADC ADS774AT89C51的接口电路,给出二者采样时间的差异性。  1 引言  A/D转换器是一种数据采集中常用的模拟-数字信号转换元件,按转换原理可以分为逐次逼近型、双积分型等;...
  • 采用FPGA实现同步串行数据并行采集.pdf
  • 并行数据转换为串行数据_74ls165 由拨马开关控制并行数据状态,通过74LS165转串口输出 在由8位LED灯的亮灭来显示当前的拨码开关的状态 源程序+Proteus的仿真文件 可以帮助你很好的学习哦
  • endmodule 仿真截图: 说明:无意中看到了一些博客上的数据串并转换,逻辑上基本都能实现,但绝大部分都不能用,连基本的信号使能、时序打拍都没有,信号命名也很随便,就简单的实现了移位寄存器,直接复用的价值...

    代码:

    module bit1_bit4(
        input    clk_50M_i,
    	input    rst_n_i,
    	
    	input    data_i,
    	input    data_en_i,
    	
    	output   [3:0]data_o,
    	output   data_en_o
    );
    reg  data_i_tmp1;
    reg  data_i_tmp2;
    reg  data_en_i_tmp1;
    reg  data_en_i_tmp2;
    
    reg  [3:0]data_o_tmp;
    reg       data_en_o_tmp; 
    reg  [3:0]cnt; 
    
    always@(posedge clk_50M_i or negedge rst_n_i)
    	if(!rst_n_i)begin
    	    data_i_tmp1    <= 1'b0;
    	    data_i_tmp2    <= 1'b0;
    		data_en_i_tmp1 <= 1'b0;
    		data_en_i_tmp2 <= 1'b0;
    	end
    	else begin 
    	    data_i_tmp1    <= data_i;
    		data_i_tmp2    <= data_i_tmp1;
    		data_en_i_tmp1 <= data_en_i;
    		data_en_i_tmp2 <= data_en_i_tmp1;
    	end
    always@(posedge clk_50M_i or negedge rst_n_i)
    	if(!rst_n_i)
    	    data_o_tmp <= 4'b0;
    	else if(data_en_i_tmp2)
    	    data_o_tmp <= {data_o_tmp[2:0],data_i_tmp2};
    	else
    	    data_o_tmp <= 4'b0;
    always@(posedge clk_50M_i or negedge rst_n_i)
        if(!rst_n_i)
    	    cnt <= 4'b0;
    	else if(data_en_i_tmp2)
    	    cnt <= cnt + 1'b1;
    	else
    	    cnt <= 4'b0;
    always@(posedge clk_50M_i or negedge rst_n_i)
    	if(!rst_n_i)
    	    data_en_o_tmp <= 1'b0;
    	else if(cnt == 4-1)
    	    data_en_o_tmp <= 1'b1;
    	else
    	    data_en_o_tmp <= 1'b0;
    
    assign  data_o = data_o_tmp;	
    assign  data_en_o = data_en_o_tmp; 	 
    endmodule
    
    
    
    
    
    

    测试:

    `timescale 1ns/1ns
    
    module  bit1_bit4_tb();
    
    parameter  clk_period = 20;
    
    reg    clk_50M_i;
    reg    rst_n_i;
    reg    data_i;
    reg    data_en_i;
    
    initial begin
        clk_50M_i    = 1'b0;
        rst_n_i      = 1'b0;
    	data_i       = 1'b0;
    	data_en_i    = 1'b0;
    	
        #100
    	rst_n_i = 1'b1;
    	   
    	#200
    	
        #clk_period data_i = 1'b1; data_en_i = 1'b1;
    	#clk_period data_i = 1'b1;
    	#clk_period data_i = 1'b0;
    	#clk_period data_i = 1'b1;
    	#clk_period                data_en_i = 1'b0;
    	
    	#200
    	#clk_period data_i = 1'b0; data_en_i = 1'b1;
    	#clk_period data_i = 1'b1;
    	#clk_period data_i = 1'b1;
    	#clk_period data_i = 1'b0;
    	#clk_period                data_en_i = 1'b0;
    	
    	#200
    	#clk_period data_i = 1'b1; data_en_i = 1'b1;
    	#clk_period data_i = 1'b1;
    	#clk_period data_i = 1'b1;
    	#clk_period data_i = 1'b0;
    	#clk_period                data_en_i = 1'b0;
    	
    	#200
    	#clk_period data_i = 1'b0; data_en_i = 1'b1;
    	#clk_period data_i = 1'b0;
    	#clk_period data_i = 1'b0;
    	#clk_period data_i = 1'b1;
    	#clk_period                data_en_i = 1'b0;
    	
    	#200
    	#clk_period data_i = 1'b1; data_en_i = 1'b1;
    	#clk_period data_i = 1'b0;
    	#clk_period data_i = 1'b0;
    	#clk_period data_i = 1'b0;
    	#clk_period                data_en_i = 1'b0;
    	
    end
    
    always #(clk_period/2) clk_50M_i = ~clk_50M_i;
    
    bit1_bit4  bit1_bit4_inst(
        .clk_50M_i(clk_50M_i),
    	.rst_n_i(rst_n_i),
    	
    	.data_i(data_i),
    	.data_en_i(data_en_i),
    	
    	.data_o(),
    	.data_en_o()
    );
    
    
    endmodule
    

    仿真截图:
    在这里插入图片描述

    说明:无意中看到了一些博客上的数据串并转换,逻辑上基本都能实现,但绝大部分都不能用,连基本的信号使能、时序打拍都没有,信号命名也很随便,就简单的实现了移位寄存器,直接复用的价值几乎为零,所以才有了我这两篇博客的诞生。时间比较赶,后面有时间会再优化一下,希望提供一种规范化的实用代码思路大家一起学习

    展开全文
  • protues串行数据转换为并行数据很经典。
  • 单片机并行数据转换为串行数据,比赛练习案例,仿真实例,现成调用封装使用,可运行的仿真电路图和调好的程序,开箱即用。适用于教学案例、毕业设计、电子设计比赛、出书项目实例,实际设计、个人DIY参考。 已调试好...
  • Verilog实现8位串行数据并行数据

    千次阅读 2021-08-18 19:26:11
    串行数据输入信号din。 输出信号为8bit并行信号dout。 每经过8个时钟周期,便把收到的8个串行信号合成并行信号并输出,等下8个时钟周期过后再输出下一个并行信号。 module deserialize( input rst,clk,din, output ...

    解串器(deserialize):串行信号转并行信号

    输入信号有:
    时钟信号clk,
    复位信号rst
    串行数据输入信号din。

    输出信号为8bit并行信号dout。

    每经过8个时钟周期,便把收到的8个串行信号合成并行信号并输出,等下8个时钟周期过后再输出下一个并行信号。

    module deserialize(
    input rst,clk,din,
    output reg[7:0] dout
    );
     
    reg[7:0] data;
    reg[2:0] cnt;
     
     
    always@(negedge rst, posedge clk)
    begin
    	if(rst == 1'b0)//reset signial
    	begin
    		data <= 0;
    		cnt <= 0;
    		dout <= 0;
    	end
    	
    	else
    	begin
    		if (cnt == 3'b111)//get all 8bit data,change dout
    		begin		
    			dout[7-cnt] <= din;
    			dout[7:1] <= data[7:1];
    			cnt <= 0;
    		end
    		else
    		begin
    			data[7-cnt] <= din;
    			cnt <= cnt + 1;
    		end		
    	end
    end
     
     
    endmodule
    
    展开全文
  • 该系统充分利用了DSP的两个缓冲串口,可以使两路A/D转换数据高速并行传输。同时文中给出了系统的硬件原理图和软件设计的部分关键程序。关键词:DSP;多通道缓冲串口;A/D转换;数据采集引言---TMS320VC5402(以下简称...
  • 单片机C语言程序设计 并行数据转换为串行数据(有源码)单片机C语言程序设计 并行数据转换为串行数据(有源码)单片机C语言程序设计 并行数据转换为串行数据(有源码)单片机C语言程序设计 并行数据转换为串行数据(有...
  • 串行数据转换为并行数据.zip
  • 并行传输数据串行传输数据SATA hard drive connections are faster than older PATA hard drive connections and the same can be said for external cabling standards, but this is counter-intuitive: why ...
  • 它包含两个功能—— 1.ser2par : 将串行数据转换为并行数据2.par2ser : 将并行数据转换为串行数据
  • 串行并行接口模式是A/D转换器诸多分类中的一种,但却是应用中器件选择的一个重要指标。在同样的转换分辨率及转换...本文通过12位串行ADC ADS7822和并行ADC ADS774AT89C51的接口电路,给出二者采样时间的差异性。
  • 43 串行数据转换为并行数据.zip
  • 源代码+仿真+电路图
  • 串行通讯与并行通讯

    2022-01-05 10:56:06
    通讯方式按照数据的传输形式分为串行通讯和并行通讯两种方式。这两个概念从文字表面就可以理解,专业些的解释是:串行通讯是指设备 之间通过少量数据信号线(一般是8根一下),地线以及控制信号线,通讯时数据按照一...
  • 1、8位并行数据输入转串行数据输出,采用移位方式,代码如下: module shift ( clk,rst_n, din,dout ); parameter Num=8; output dout; //串行数据输出 input clk; //控制时钟 input rst_n; //复位信号,...
  • 假如reg是一个串行不断输入的1bit数据,当其传输8位后停止传输,假设其8次输入的数据为 1111 1111,而rx_data本来的数据为8位的0000 0000 always@(posedge sys_clk or negedge sys_rst_n) if(sys_rst_n == 1'b0) ...
  • 单片机C语言程序设计基于8051+Proteus仿真 串行数据转换为并行数据

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 131,984
精华内容 52,793
关键字:

串行数据与并行数据