层次化设计
数字电路屯根据模块层次不同有两种基本的结构设计方法:自底向上(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编译码的层次化设计与实现相关推荐

  1. 【FPGA教程案例88】编译码1——基于FPGA的HDB3编译码verilog实现

    FPGA教程目录 MATLAB教程目录 目录 1.软件版本 2.HDB3编译码理论概述 2.1 HDB3编码 2.2 HDB3译码 3.verilog实现过程

  2. 【编码译码】基于matlab HDB3编译码仿真【含Matlab源码 1961期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[编码译码]基于matlab HDB3编译码仿真[含Matlab源码 1961期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2 ...

  3. Verilog学习笔记6:层次化设计-数码管位选

        本日志继续介绍Verilog的层次化设计方法,数码管的位选,电路图不变,如下图所示.     该电路图由8位数码管组成,这8位数码管共用一组段选,所以为了让这8位数码管显示不同的数字,必须利用 ...

  4. 基于FPGA的HDB3编译码verilog实现,结合MATLAB进行辅助验证

    目录 一.理论基础 二.核心程序 三.测试结果 一.理论基础 HDB3码(三阶高密度双极性码)是串行数据传输的一种重要编码方式,和最常用的NRZ码(非归零码)相比,以上所说的有点使HDB3码具有明显的 ...

  5. 基于FPGA的HDB3编译码verilog实现,包括testbench

    目录 1.算法仿真效果 2.算法涉及理论知识概要 3.verilog核心程序 4.完整算法代码文件 1.算法仿真效果 vivado2019.2仿真结果如下: 2.算法涉及理论知识概要 数字基带信号的传 ...

  6. Verilog实现HDB3编码译码

    Verilog实现HDB3编码译码 前言 一.使用的软件 二.具体实现 1.模块介绍 2.模块的.V文件 三.仿真结果 四.总结 1.关于编程的结构 2.收获 五.附testbench文件 前言 本次 ...

  7. 了解线性分组码的编码原理并编程实现C语言,线性分组码的编译码(DOC).doc

    ****************** 实践教学 ****************** 兰州理工大学 计算机与通信学院 2013年秋季学期 计算机通信 课程设计 题 目: 线性分组码(7,3)码的编译码 ...

  8. matlab 卷积码函数,MATLAB实现卷积码编译码-.doc

    MATLAB实现卷积码编译码- 本科生毕业论文(设计) 题 目: 作者姓名: 学 号: 单 位: 指导教师: 年 月 日 目 录 前言1 1. 纠错码基本理论2 1.1纠错码基本理论2 1.1.1纠错 ...

  9. 基于matlab的卷积码实验报告,基于MATLAB的卷积码编译码设计仿真.doc

    摘要:在数字信号的传输过程中,会受到信道特性不理想和噪声的影响,通常采用差错控制编码来提高系统的可靠性.卷积码是P.Elias等人提出的,这一编码技术至今广泛使用.目前,卷积码已普遍在无线通信标准使用 ...

  10. 基于matlab编译码器的设计,基于MATLAB循环码编译码仿真

    基于MATLAB循环码编译码仿真(论文11000字) 摘要:在具体了解循环码的编码理论的基础上,使用 M ATLA B 软件设计了循环码编译码器. 通过 M ATLAB 软件实现循环码的编译码 ,通过 ...

最新文章

  1. element-ui上传下载excel(超详细der)
  2. C++ 最大公约数排序
  3. 马明哲新年内部讲话透露新战略:全面开启3.0时代
  4. Arm v8 中断处理
  5. compiz把xfce4系统搞崩溃后的恢复方案
  6. 单片机按键软硬件设计技巧!
  7. 软件测试的学习之路-----计算机基础 (详情展示)
  8. Grub2中文指南4---开机影像和主题
  9. 和方舟rust一样的手游_偶像梦幻祭2新活动 ES手游全新开服
  10. Jsp+SpringMVC+Mysql实现的进销存库存管理系统附带论文
  11. v8的垃圾回收机制(二)
  12. IBM加入OpenOffice 贡献Lotus Notes程序代码
  13. 常用的加密算法--摘要认证和签名认证的实现
  14. Head First 设计模式 —— 装饰器模式与门面模式
  15. python日志模块logging
  16. 差分进化算法用c语言实现,差分进化算法C++语言实现
  17. 基金:波动率、收益率、贝塔系数、最大回撤率、夏普比率
  18. 搅拌设备行业——双行星搅拌机即将成为龙头
  19. 计算机毕设(附源码)JAVA-SSM基于Yigo平台库房管理系统
  20. 十五、Events类

热门文章

  1. linux加载打印机驱动程序,Linux下安装HP打印机的驱动程序
  2. 甘特图控件VARCHART XGantt:XGantt的用途
  3. FRED应用:锥透镜的设计
  4. 深入浅出Word2Vec原理解析
  5. 【PyQt5】串口数据实时绘图
  6. 凤凰os 停在android,电脑的安卓系统,凤凰OS:有亮点但还很粗糙的系统
  7. 原神ios android,原神ios和安卓数据互通吗 原神ios和安卓能一起玩吗
  8. 收集五款常用的HTML编辑软件
  9. 手机html5测试苹果八,怎么简单质检你的iPhone手机以及真假判断!
  10. android qq下载路径,手机qq下载的文件在哪个文件夹 查找路径解答