Verilog——hdb3编译码的层次化设计与实现
层次化设计
数字电路屯根据模块层次不同有两种基本的结构设计方法:自底向上(Bottom-Up)的设计方法和自顶向下(Top-Down)的设计方法。
1.自底向上
自底向上的设计是一种传统的设计方法,对设计进行逐次划分的过程是从存在的基本单元出发的,由基本单元构建高层单元,依次向上,直至构建系统。(有一些已经实现的模块搭建成一个系统)
2.自顶向下
从系统级开始,把系统分为基本单元,然后再把每个单元划分为下一层次的基本单元,一直这样做下去,直到直接可以用EDA元件库中的原件来实现为止。(先定义顶层,在分析子功能模块)
本文通过Verilog 实现HDB3编译码层次化设计及仿真。
这里采用自顶向下的层次化设计,顶层模块HDB,子功能模块HDB3_V、HDB3_B、HDB3_polar。
由HDB3编码原理,可将整个功能分解为三个模块。
1.变V模块(HDB3_V)。加V编码实际是为了相处hdb3消息码中四连0的情况,当消息码中出现四个连0的时候,就会把第四个0编成V码,即0000变成000V。在hdb3的编码规则中出现B和V只是作为标识符,所以我在这里对采用了两位二进制代码来表示hdb3中0码,1码,B码,V码,分别采用00,01,10,11表示。在加V模块用Verilog HDL实现的过程中,采用时序逻辑电路,输入进来的消息码进行判决,当进来的是0码时,用一个变量进行计数,当计数到4的时候,对当前的消息码进行更换操作,即把0码换成V码(00换成11)
2.变B模块(HDB3_B)。加B模块的功能是对加V编码之后的消息码序列进行插B操作。加B操作首先是检测两个V码之间的非零是否为偶数,如果为偶数,则要把第一个0码换成B码,即000V换成B00V(00 00 00 11 换成 10 00 00 11)。
3.极性处理模块(HDB3_polar)。该模块是对插V模块和插B模块处理之后的消息码进行极性处理,根据HDB3的编码规则,相邻的两个1码之间的极性相反,在插V的时候,V码要与它前面第一个相邻的非零的极性相同,同时相邻的两个V码之间的极性要相反,所以在插B操作时,B码的极性与其相邻的后一位V码的极性相同,0码不做极性要求。
顶层模块HDL代码
module HDB//顶层模块
(input wire sys_clk,input wire sys_rst,input wire in_bit,output wire [1:0] data_out,//译码输出output wire [1:0] polar_out//码极性输出
);wire [1:0] net_vb;//中间变量,连接HDB3_V模块和HDB3_B模块
wire [1:0] net_bp;
wire [1:0] out_p;HDB3_V HDB3_V_inst //例化变V模块
(. in(in_bit),. sys_rst(sys_rst),. sys_clk(sys_clk),. out(net_vb)
);HDB3_B HDB3_B_inst //例化变B模块
(. in_b(net_vb),. sys_rst(sys_rst),. sys_clk(sys_clk),. out_b(net_bp)
);HDB3_polar HDB3_polar_inst //例化极性处理模块
(.in_p (net_bp),.sys_rst (sys_rst),.sys_clk (sys_clk),.out_polar (out_p)
);assign data_out = net_bp;
assign polar_out = out_p;endmodule
子功能模块HDB3_V RTL代码
module HDB3_V //0 1 b v分别对应00 01 10 11 插v
(input wire in,input wire sys_rst,input wire sys_clk,output reg [1:0] out
);
reg [1:0] count; //3换算成二进制位宽为2的11,对0个数进行计数
always@(posedge sys_clk or negedge sys_rst)
beginif(sys_rst == 1'b0) //复位信号0有效begincount <= 2'd0;out <= 2'bz;endelsebeginif(in == 1'b1)beginout <= 2'b01;count<=2'd0; endelsebegincount <= count+1'd1;if(count == 2'd3) //达到连续4个0,满足条件beginout <= 2'b11;count <= 2'd0; endelseout <= 2'b00;endend
end
endmodule
子功能模块HDB3_B RTL代码
module HDB3_B //变B模块
(input wire [1:0] in_b,input wire sys_rst,input wire sys_clk,output [1:0] out_b
);wire [1:0] h_out; //用来连接插B模块和插V模块的中间变量,中间变量要用wire型reg [1:0] tab_3,tab_2,tab_1,tab_0; //四位移位寄存器reg count_01; //对非零码个数计数reg [1:0] count_v; // 对V计数always@(posedge sys_clk or negedge sys_rst)if(sys_rst == 1'b0)count_01 <= 1'b0;elsebeginif(tab_0 == 2'b11) //进来的是V码count_01 <= 1'b0; //当V码出现时,对非零码个数计数清零else if(tab_0 == 2'b01) //进来的是1码count_01 <= count_01 + 1'b1;//当1码出现时,计数器加1elsecount_01 <= count_01; //其他情况保持不变endalways@(posedge sys_clk or negedge sys_rst)if(sys_rst == 1'b0)count_v <= 1'b0;elsebeginif(tab_0 == 2'b11)count_v <= count_v + 1'b1; //第一个V码出现时,计数器加1elsebeginif(count_v == 2'd2)count_v <= 1'b1; //对V码计数到二时,将计数变为1。end end //(count_01==0)&&(count_v==1)&&(tab_0==2'b11)表示两个V码之间的非零个数时偶数个
//当满足条件时输出10码,不满足输出寄存器tab_3的消息码
//这里count_01相当于一位宽的寄存器,最高计数到1,利用寄存器会溢出的特性,到计数大于1时,count_01的值就是0
//1 1 1 1 1 1,这里表示有六个1码
//1 0 1 0 1 0,这是count_01值变化。因为在第二个1时,计数器理论上加到了2,但是溢出后变为0,当下一个1出现时计数器又会计1,以此类推。
//所以奇数个1码的count_01的值就是1,偶数个1码时count_01的值就是0.
assign out_b = (count_01==0)&&(count_v==1)&&(tab_0==2'b11)? 2'b10:tab_3;always@(posedge sys_clk)//四位移位寄存器begintab_0 <= in_b;tab_1 <= tab_0;tab_2 <= tab_1;tab_3 <= tab_2;endendmodule
子功能模块HDB3_polar RTL代码
module HDB3_polar //极性处理模块
(input wire in_p,input wire sys_rst,input wire sys_clk,output reg [1:0] out_polar
);
//wire [1:0] h_out_b; //连接极性变化板块和插B板块的中间变量,要用wire型
reg flag; //标志位
reg [1:0] out_B; always@(posedge sys_clk)beginout_B <= in_p; //把in_p延时一个时钟周期end always@( posedge sys_clk or negedge sys_rst )beginif(sys_rst == 1'b0) flag <= 0;else beginif( in_p == 2'b01 || in_p == 2'b10 ) //进来的消息码是1码或者B码begin if( flag == 0 ) beginout_polar <= 2'b10; //极性输出负 flag <= 1; //标志位取反,下个极性取反 endelse beginout_polar <= 2'b01; //输出极性为正 flag <= 0; //标志位取反,下个极性取反 endendelse if( in_p == 2'b11 ) //进来的消息码是v码begin if( flag == 0 ) out_polar <= 2'b01; elseout_polar <= 2'b10; endelse out_polar <= in_p; //0码不做极性处理,输出00endend
endmodule
测试脚本(testbench)
这次只仿真了全0的情况
`timescale 1ns/1ns
module tb_HDB();reg sys_clk;reg sys_rst;reg in_bit;wire [1:0] data_out;wire [1:0] polar_out;initialbeginsys_clk = 1'b0;sys_rst <= 1'b0;in_bit = 1'b1;#10sys_rst <= 1'b1;endalways #5 sys_clk = ~sys_clk;always begin//#10 in_bit <= {$random} % 2;随机生成二进制数,随机码#10 in_bit <= 1'b0; //1 0 1 1#10 in_bit <= 1'b0; //1 0 0 0#10 in_bit <= 1'b0; //1 0 1 0#10 in_bit <= 1'b0; //1 0 0 0#10 in_bit <= 1'b0; //1 0 0 0#10 in_bit <= 1'b0; //1 0 0 0#10 in_bit <= 1'b0; //1 0 0 0#10 in_bit <= 1'b0; //1 0 0 0#10 in_bit <= 1'b0; //1 0 0 0#10 in_bit <= 1'b0; //1 0 0 0#10 in_bit <= 1'b0; //1 0 1 0#10 in_bit <= 1'b0; //1 0 0 0#10 in_bit <= 1'b0; //1 0 1 1#10 in_bit <= 1'b0; //1 0 0 0#10 in_bit <= 1'b0; //1 0 1 0#10 in_bit <= 1'b0; //1 0 1 0#10 in_bit <= 1'b0; //1 0 1 0#10 in_bit <= 1'b0; //1 0 1 0#10 in_bit <= 1'b0;#10 in_bit <= 1'b0;endHDB HDB_inst
(.sys_clk (sys_clk),.sys_rst (sys_rst),.in_bit (in_bit),.data_out (data_out),.polar_out (polar_out)
);endmodule
modulesim仿真结果
Verilog——hdb3编译码的层次化设计与实现相关推荐
- 【FPGA教程案例88】编译码1——基于FPGA的HDB3编译码verilog实现
FPGA教程目录 MATLAB教程目录 目录 1.软件版本 2.HDB3编译码理论概述 2.1 HDB3编码 2.2 HDB3译码 3.verilog实现过程
- 【编码译码】基于matlab HDB3编译码仿真【含Matlab源码 1961期】
⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[编码译码]基于matlab HDB3编译码仿真[含Matlab源码 1961期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2 ...
- Verilog学习笔记6:层次化设计-数码管位选
本日志继续介绍Verilog的层次化设计方法,数码管的位选,电路图不变,如下图所示. 该电路图由8位数码管组成,这8位数码管共用一组段选,所以为了让这8位数码管显示不同的数字,必须利用 ...
- 基于FPGA的HDB3编译码verilog实现,结合MATLAB进行辅助验证
目录 一.理论基础 二.核心程序 三.测试结果 一.理论基础 HDB3码(三阶高密度双极性码)是串行数据传输的一种重要编码方式,和最常用的NRZ码(非归零码)相比,以上所说的有点使HDB3码具有明显的 ...
- 基于FPGA的HDB3编译码verilog实现,包括testbench
目录 1.算法仿真效果 2.算法涉及理论知识概要 3.verilog核心程序 4.完整算法代码文件 1.算法仿真效果 vivado2019.2仿真结果如下: 2.算法涉及理论知识概要 数字基带信号的传 ...
- Verilog实现HDB3编码译码
Verilog实现HDB3编码译码 前言 一.使用的软件 二.具体实现 1.模块介绍 2.模块的.V文件 三.仿真结果 四.总结 1.关于编程的结构 2.收获 五.附testbench文件 前言 本次 ...
- 了解线性分组码的编码原理并编程实现C语言,线性分组码的编译码(DOC).doc
****************** 实践教学 ****************** 兰州理工大学 计算机与通信学院 2013年秋季学期 计算机通信 课程设计 题 目: 线性分组码(7,3)码的编译码 ...
- matlab 卷积码函数,MATLAB实现卷积码编译码-.doc
MATLAB实现卷积码编译码- 本科生毕业论文(设计) 题 目: 作者姓名: 学 号: 单 位: 指导教师: 年 月 日 目 录 前言1 1. 纠错码基本理论2 1.1纠错码基本理论2 1.1.1纠错 ...
- 基于matlab的卷积码实验报告,基于MATLAB的卷积码编译码设计仿真.doc
摘要:在数字信号的传输过程中,会受到信道特性不理想和噪声的影响,通常采用差错控制编码来提高系统的可靠性.卷积码是P.Elias等人提出的,这一编码技术至今广泛使用.目前,卷积码已普遍在无线通信标准使用 ...
- 基于matlab编译码器的设计,基于MATLAB循环码编译码仿真
基于MATLAB循环码编译码仿真(论文11000字) 摘要:在具体了解循环码的编码理论的基础上,使用 M ATLA B 软件设计了循环码编译码器. 通过 M ATLAB 软件实现循环码的编译码 ,通过 ...
最新文章
- element-ui上传下载excel(超详细der)
- C++ 最大公约数排序
- 马明哲新年内部讲话透露新战略:全面开启3.0时代
- Arm v8 中断处理
- compiz把xfce4系统搞崩溃后的恢复方案
- 单片机按键软硬件设计技巧!
- 软件测试的学习之路-----计算机基础 (详情展示)
- Grub2中文指南4---开机影像和主题
- 和方舟rust一样的手游_偶像梦幻祭2新活动 ES手游全新开服
- Jsp+SpringMVC+Mysql实现的进销存库存管理系统附带论文
- v8的垃圾回收机制(二)
- IBM加入OpenOffice 贡献Lotus Notes程序代码
- 常用的加密算法--摘要认证和签名认证的实现
- Head First 设计模式 —— 装饰器模式与门面模式
- python日志模块logging
- 差分进化算法用c语言实现,差分进化算法C++语言实现
- 基金:波动率、收益率、贝塔系数、最大回撤率、夏普比率
- 搅拌设备行业——双行星搅拌机即将成为龙头
- 计算机毕设(附源码)JAVA-SSM基于Yigo平台库房管理系统
- 十五、Events类
热门文章
- linux加载打印机驱动程序,Linux下安装HP打印机的驱动程序
- 甘特图控件VARCHART XGantt:XGantt的用途
- FRED应用:锥透镜的设计
- 深入浅出Word2Vec原理解析
- 【PyQt5】串口数据实时绘图
- 凤凰os 停在android,电脑的安卓系统,凤凰OS:有亮点但还很粗糙的系统
- 原神ios android,原神ios和安卓数据互通吗 原神ios和安卓能一起玩吗
- 收集五款常用的HTML编辑软件
- 手机html5测试苹果八,怎么简单质检你的iPhone手机以及真假判断!
- android qq下载路径,手机qq下载的文件在哪个文件夹 查找路径解答