精华内容
下载资源
问答
  • 并行数据
    千次阅读
    2021-08-13 10:30:46

    1、8位并行数据输入转串行数据输出,采用移位方式,代码如下:
    module shift
    (
    clk,rst_n,
    din,dout
    );

    parameter Num=8;

    output dout; //串行数据输出
    input clk; //控制时钟
    input rst_n; //复位信号,低电平有效
    input [Num-1:0]din; //并行数据输入
    reg dout;

    reg [Num-1:0]din_reg; //并行数据寄存器
    reg [2:0]cnt;

    //右移 ,补高位
    always @(posedge clk,negedge rst_n)begin
    if(!rst_n) //异步复位
    begin
    dout <= 0;
    din_reg<=3’d0;
    end
    else
    if(cnt<3’d7)
    begin
    din_reg <= din_reg >>1; //寄存器内容右移一位
    dout<= din_reg[0];
    cnt<=cnt+1’b1;
    end
    else
    begin
    dout<= din_reg[0];
    din_reg<=din;
    cnt<=2’d0;
    end
    end

    endmodule

    更多相关内容
  • 51单片机Proteus仿真实例 串行数据转换为并行数据51单片机Proteus仿真实例 串行数据转换为并行数据51单片机Proteus仿真实例 串行数据转换为并行数据51单片机Proteus仿真实例 串行数据转换为并行数据51单片机Proteus...
  • 单片机C语言程序设计 并行数据转换为串行数据(有源码)单片机C语言程序设计 并行数据转换为串行数据(有源码)单片机C语言程序设计 并行数据转换为串行数据(有源码)单片机C语言程序设计 并行数据转换为串行数据(有...
  • 单片机C语言程序设计 串行数据转换为并行数据(有源码)单片机C语言程序设计 串行数据转换为并行数据(有源码)单片机C语言程序设计 串行数据转换为并行数据(有源码)单片机C语言程序设计 串行数据转换为并行数据(有...
  • 单片机C语言程序设计43 串行数据转换为并行数据(基于8051+Proteus仿真)单片机C语言程序设计43 串行数据转换为并行数据(基于8051+Proteus仿真)单片机C语言程序设计43 串行数据转换为并行数据(基于8051+Proteus...
  • ad7606模块8通道,ad7606模块程序并行方式采集
  • 名称:串行数据转换为并行数据 说明:串行数据由 RXD 发送给串 并转换芯片 74164,TXD 则用于输出移位时钟脉冲,74164 将串行输入的 1 字节转换为并行数据,并将转换的数据通过 8 只 LED 显示出来。本例串口工作...
  • 最新单片机仿真 串行数据转换为并行数据最新单片机仿真 串行数据转换为并行数据最新单片机仿真 串行数据转换为并行数据最新单片机仿真 串行数据转换为并行数据最新单片机仿真 串行数据转换为并行数据最新单片机仿真 ...
  • 51单片机Proteus仿真实例 并行数据转换为串行数据51单片机Proteus仿真实例 并行数据转换为串行数据51单片机Proteus仿真实例 并行数据转换为串行数据51单片机Proteus仿真实例 并行数据转换为串行数据51单片机Proteus...
  • 单片机C语言程序设计44 并行数据转换为串行数据(基于8051+Proteus仿真)单片机C语言程序设计44 并行数据转换为串行数据(基于8051+Proteus仿真)单片机C语言程序设计44 并行数据转换为串行数据(基于8051+Proteus...
  • 最新单片机仿真 并行数据转换为串行数据最新单片机仿真 并行数据转换为串行数据最新单片机仿真 并行数据转换为串行数据最新单片机仿真 并行数据转换为串行数据最新单片机仿真 并行数据转换为串行数据最新单片机仿真 ...
  • 基于FPGA的并行数据采集.pdf
  • 包含:微软Big-Data-and-PDW-Solution并行数据仓库解决方案.pdf 和微软大数据库解决方案手册.pdf 面对快速增长的数据量,企业需要具备切合实际、及时的业务洞察力。 通过使用 SQL Server 中的并行数据仓库及其大规模...
  • 一种基于FPGA控制的多路并行数据采集设计方法.pdf
  • 名称:并行数据转换为串行数据 说 明 : 切 换 连 接 到 并 串 转 换 芯 片74LS165 的拨码开关,该芯片将并行数据以串行方式发送到 8051 的 RXD 引脚,移位脉冲由 TXD 提供,显示在 P0 口。
  • 基于Hadoop平台的并行数据挖掘算法工具箱与数据挖掘云.pdf基于Hadoop平台的并行数据挖掘算法工具箱与数据挖掘云.pdf基于Hadoop平台的并行数据挖掘算法工具箱与数据挖掘云.pdf基于Hadoop平台的并行数据挖掘算法工具箱...
  • 基于Hadoop平台的并行数据挖掘算法工具箱与数据挖掘云.docx基于Hadoop平台的并行数据挖掘算法工具箱与数据挖掘云.docx基于Hadoop平台的并行数据挖掘算法工具箱与数据挖掘云.docx基于Hadoop平台的并行数据挖掘算法...
  • 用于串行数据转并行数据的VHDL代码,可参考,欢迎下载
  • 并行数据转换为串行数据.zip
  • 单片机并行数据转换为串行数据,比赛练习案例,仿真实例,现成调用封装使用,可运行的仿真电路图和调好的程序,开箱即用。适用于教学案例、毕业设计、电子设计比赛、出书项目实例,实际设计、个人DIY参考。 已调试好...
  • 单片机串行数据转换为并行数据,比赛练习案例,仿真实例,现成调用封装使用,可运行的仿真电路图和调好的程序,开箱即用。适用于教学案例、毕业设计、电子设计比赛、出书项目实例,实际设计、个人DIY参考。 已调试好...
  • 提出了一款基于Hadoop的并行数据分析系统―――PDM.该系统拥有大量以MapReduce为计算框架的并行数据分析算法,不仅包括传统的ETL、数据挖掘、数据统计和文本分析算法,还引入了基于图理论的SNA(社会网络分析)算法.详细...
  • 模块功能:接收串行数据,转为并行数据。 应用场景:在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

    展开全文
  • 串行数据转换为并行数据.zip
  • 为了解决云粒子测量系统中并行数据采集通道之间的信息交互问题,采用LabVIEW中库函数节点、消 息队列和状态机相结合的方法,实现了多路不同速率数据的并行采集,试验验证了该并行数据采集方法的可行性. 研究结果表明:...
  • 绍基于C6727B的并行数据传输系统的设计,利用其内部的dMAX模块,可以处理来自外部的2个中断,实现从HPI接口和EMIF接口并行传输数据,在数据传输时无需CPU参与;由于并行数据传输存在优先级和总线仲裁,还介绍了多个...
  • 44 并行数据转换为串行数据.zip
  • 43 串行数据转换为并行数据.zip
  • protues串行数据转换为并行数据很经典。
  • 串行数据转并行数据并行数据转串行数据行转串行代码 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_...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 680,090
精华内容 272,036
关键字:

并行数据

友情链接: ftp.rar