当前位置: 首页 > news >正文

[Verilog]用Verilog实现串并转换/并串装换

用Verilog实现串并转换/并串装换

摘要

一、串并转换模块

       串转并就是将低3位信号和输入信号一起赋值。因为经过转换后,码元速率会将为原来四分之一,所以设置4分频时钟,将其输出。而并转串就是不断右移,取高位输出。

module serial2para(input clk, rst_n,input ser_data_in,output reg [3:0] para_data_out
);parameter N = 4;//四分频模块
reg [13:0]  cnt;
reg         clk_out;
reg [3:0]   data;always @(posedge clk or negedge rst_n) beginif(cnt == N/2 - 1) begincnt     <= 14'b0;clk_out <= ~clk_out;end elsecnt <= cnt + 1'b1;
endalways @(posedge clk or negedge rst_n) beginif(~rst_n) data <= 4'h0;else       data <= {data[2:0], d};
endalways @(posedge clk_out or negedge rst_n) beginif(~rst_n) para_data_out <= 4'h0;else       para_data_out <= data;
endendmodule

1.1 利用移位寄存器

        串行转并行数据输出:采用位拼接技术(移位寄存器),将串行的数据总数先表示出来,然后发送一位数据加一,后面的接收的这样标志:para_data_o <= {para_data_o[6:0], ser_data_i };

module serial_parallel #(parameter DATA_WIDTH     = 8
)(input                          clk,input                          rst_n,input                          left_shift,input                          ser_data_in,   //1位串行输入output                         valid,output reg [DATA_WIDTH-1:0]    para_data_o	//8位并行输出
);parameter CNT_WIDTH = $clog2(DATA_WIDTH);reg [CNT_WIDTH-1:0]              ser_bit_cnt;always @(posedge clk or negedge rst_n) beginif (~rst_n)para_data_o <= {DATA_WIDTH{1'b0}};else if (left_shift == 1'b1)para_data_o <= {para_data_o[DATA_WIDTH-2:0], ser_data_in};	//低位先赋值,左移else if(left_shift == 1'b0)para_data_o <= {ser_data_in, para_data_o[DATA_WIDTH-1:1]};	//高位先赋值,右移
endalways @(posedge clk or negedge rst_n) beginif(~rst_n) beginser_bit_cnt <= {CNT_WIDTH{1'b0}};valid       <= 1'h0;endelse if(ser_bit_cnt == DATA_WIDTH-1) beginser_bit_cnt <= {CNT_WIDTH{1'b0}};valid = 1'b1;endelse beginser_bit_cnt <= ser_bit_cnt + 1'b1;valid       <= 1'b0;end
endendmodule

1.2 利用计数器

        利用计数器cnt 时钟计数,开始数据先给高位,每过一个时钟周期,数据便给低一位。这样便可以达到串转并的效果。

module serial_parallel(parameter         DATA_WITH = 8
)(input                      clk,input                      rst_n,input                      ser_data_in,input                      valid,output reg [DATA_WITH-1:0] para_data_o
);parameter                      CNT_WIDTH = $clog2(DATA_WITH);//msb first   most significant bit 表示二进制数据的最高位
reg   [DATA_WITH-1:0]   cnt; 	//计数器0-7  always @(posedge clk or negedge rst_n)beginif(rst_n == 1'b0) beginpara_data_o <= {DATA_WITH{1'b0}};cnt <= {CNT_WIDTH{1'd0}};endelse beginpara_data_o[DATA_WITH-1 - cnt] <= ser_data_in;	//高位先赋值cnt <= cnt + 1'b1;end
end/*
//lsb first	(least significant bit) 表示二进制数据的最低位reg     [2:0]   cnt;always @(posedge clk or negedge rst_n)beginif(rst_n == 1'b0) beginpara_data_o <= {DATA_WITH{1'b0}};cnt <= {CNT_WIDTH{1'd0}};endelse beginpara_data_o[cnt] <= data_i;   //低位先赋值cnt <= cnt + 1'b1;end
end
*/endmodule

相关文章:

  • c语言插入排序及希尔排序详解
  • Spring Boot 常用注解分类
  • 开源框架Apache NiFi调研
  • NSSCTF Crypto靶场练习,21-30wp
  • Springboot入门篇
  • 自动数据增广论文笔记 | AutoAugment: Learning Augmentation Strategies from Data
  • Lua字符串(包含任意字符,如中文)任意位置截取
  • 新增模板中心和系统设置模块,支持飞书平台对接,DataEase开源数据可视化分析平台v2.1.0发布
  • Flink SQL: 高效解析 Kafka 数据并存储为 Parquet 至 HDFS
  • uni-app 微信小程序之好看的ui登录页面(四)
  • Kafka使用总结
  • 一、微前端目标、前端架构的前生今世、微前端架构优势和劣势、软件设计原则与分层
  • python socket编程9 - PyQt6界面实现UDP server/client 多客户端通讯的例子
  • docker的镜像创建 dockerfile
  • 【头歌-Python】Python第五章作业(初级)(7~16)
  • 30天自制操作系统-2
  • canvas 绘制双线技巧
  • download使用浅析
  • echarts花样作死的坑
  • extract-text-webpack-plugin用法
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • leetcode46 Permutation 排列组合
  • log4j2输出到kafka
  • npx命令介绍
  • NSTimer学习笔记
  • Phpstorm怎样批量删除空行?
  • Python爬虫--- 1.3 BS4库的解析器
  • RxJS: 简单入门
  • vue总结
  • web标准化(下)
  • 安卓应用性能调试和优化经验分享
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 基于web的全景—— Pannellum小试
  • 使用 QuickBI 搭建酷炫可视化分析
  • 一些css基础学习笔记
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 做一名精致的JavaScripter 01:JavaScript简介
  • const的用法,特别是用在函数前面与后面的区别
  • ionic异常记录
  • NLPIR智能语义技术让大数据挖掘更简单
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​secrets --- 生成管理密码的安全随机数​
  • ​低代码平台的核心价值与优势
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • (1)STL算法之遍历容器
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (libusb) usb口自动刷新
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (二)斐波那契Fabonacci函数
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...