Verilog常见的误区

  • 组合逻辑锁存器的生成
  • Verilog语句中signed的作用
  • 总结

组合逻辑锁存器的生成

在Verilog语言组合逻辑的书写中,我们经常会写下面语句:

assign      din_x       =       rvalid == 1'b1 ? {{24{din[9]}},din}: din_x;

或者,

always @(*)if(ext_valid == 1'b1)dout            <=      comb_in3;elsedout            <=      dout;

直接读写的语法,我们以为编译器会生成锁存器,但是上面的语法分别核下面的等效,

assign      din_x       =       {{24{din[9]}},din};
always @(*)dout             =      comb_in3;

是不是很神奇,上面的两条语句就相当于两个信号直接相连。因为编译器自动给你避免了锁存器的生成,但是这样一来,我们的实验结果或许就出现了错误,所以这里需要大家重点关注。

Verilog语句中signed的作用

这里关键字signed的作用不体现在数字的加减上,因为我们不管声不声明这个变量是有符号数,FPGA内部都是按照二进制数的加法来计算的,减法将减数转换成补码进行运算。
test模块:

`timescale 1ns / 1ps
module test(//System Interfacesinput                   sclk            ,input                   rst_n           ,//Communication Interfacesinput           [ 7:0]  a               ,input           [ 7:0]  b               ,output  reg     [ 7:0]  add             ,output  reg     [ 7:0]  subtract
);//========================================================================================\
//**************Define Parameter and  Internal Signals**********************************
//========================================================================================///========================================================================================\
//**************     Main      Code        **********************************
//========================================================================================/
always @(posedge sclk or negedge rst_n)if(rst_n == 1'b0)add             <=          8'd0;  else add             <=          a + b;always @(posedge sclk or negedge rst_n)if(rst_n == 1'b0)subtract        <=          8'd0;elsesubtract        <=          a - b;endmodule

tb模块:

`timescale 1ns / 1ps
module tb();
//System Interfaces
reg                         sclk            ;
reg                         rst_n           ;
reg                 [ 7:0]  a               ;
reg                 [ 7:0]  b               ;
wire                [ 7:0]  add             ;
wire                [ 7:0]  subtract        ;initial beginsclk            =           1'b0;rst_n           <=          1'b0;a               <=          0;b               <=          0;#(1000)rst_n           <=          1'b1;#(1000)a               <=          5;b               <=          7;#(1000)a               <=          5;b               <=          -7;#(1000)a               <=          -5;b               <=          7;#(1000)a               <=          -5;b               <=          -7;#(1000);$stop;
endalways  #(10)       sclk        =           ~sclk;test test_inst(//System Interfaces.sclk                   (sclk                   ),.rst_n                  (rst_n                  ),//Communication Interfaces.a                      (a                      ),.b                      (b                      ),.add                    (add                    ),.subtract               (subtract               )
);endmodule

运行的结果如下:

我们将使用关键字signed进行如下实验:
test模块:

`timescale 1ns / 1ps
module test(//System Interfacesinput                       sclk            ,input                       rst_n           ,//Communication Interfacesinput       signed  [ 7:0]  a               ,input       signed  [ 7:0]  b               ,output  reg signed  [ 7:0]  add             ,output  reg signed  [ 7:0]  subtract
);//========================================================================================\
//**************Define Parameter and  Internal Signals**********************************
//========================================================================================///========================================================================================\
//**************     Main      Code        **********************************
//========================================================================================/
always @(posedge sclk or negedge rst_n)if(rst_n == 1'b0)add             <=          8'd0;  else add             <=          a + b;always @(posedge sclk or negedge rst_n)if(rst_n == 1'b0)subtract        <=          8'd0;elsesubtract        <=          a - b;endmodule

tb模块:

`timescale 1ns / 1ps
module tb();
//System Interfaces
reg                         sclk            ;
reg                         rst_n           ;
reg     signed      [ 7:0]  a               ;
reg     signed      [ 7:0]  b               ;
wire    signed      [ 7:0]  add             ;
wire    signed      [ 7:0]  subtract        ;initial beginsclk            =           1'b0;rst_n           <=          1'b0;a               <=          0;b               <=          0;#(1000)rst_n           <=          1'b1;#(1000)a               <=          5;b               <=          7;#(1000)a               <=          5;b               <=          -7;#(1000)a               <=          -5;b               <=          7;#(1000)a               <=          -5;b               <=          -7;#(1000);$stop;
endalways  #(10)       sclk        =           ~sclk;test test_inst(//System Interfaces.sclk                   (sclk                   ),.rst_n                  (rst_n                  ),//Communication Interfaces.a                      (a                      ),.b                      (b                      ),.add                    (add                    ),.subtract               (subtract               )
);endmodule

运行结果如下:

对比以上两组实验,我们可以发现定义signed关键字在加减实验中没有体现应有的作用。

但是关键字在移位操作的时候就得到了体现
test模块:

`timescale 1ns / 1ps
module test(//System Interfacesinput                       sclk            ,input                       rst_n           ,//Communication Interfacesinput               [ 7:0]  a               ,input               [ 7:0]  b               ,output  reg         [ 7:0]  add             ,output  reg         [ 7:0]  subtract
);//========================================================================================\
//**************Define Parameter and  Internal Signals**********************************
//========================================================================================///========================================================================================\
//**************     Main      Code        **********************************
//========================================================================================/
always @(posedge sclk or negedge rst_n)if(rst_n == 1'b0)add             <=          8'd0;  else add             <=          a <<< 1;always @(posedge sclk or negedge rst_n)if(rst_n == 1'b0)subtract        <=          8'd0;elsesubtract        <=          b >>> 1;endmodule

tb模块:

`timescale 1ns / 1ps
module tb();
//System Interfaces
reg                         sclk            ;
reg                         rst_n           ;
reg                 [ 7:0]  a               ;
reg                 [ 7:0]  b               ;
wire                [ 7:0]  add             ;
wire                [ 7:0]  subtract        ;initial beginsclk            =           1'b0;rst_n           <=          1'b0;a               <=          0;b               <=          0;#(1000)rst_n           <=          1'b1;#(1000)a               <=          8;b               <=          10;#(1000)a               <=          8;b               <=          -10;#(1000)a               <=          -8;b               <=          10;#(1000)a               <=          -8;b               <=          -10;#(1000);$stop;
endalways  #(10)       sclk        =           ~sclk;test test_inst(//System Interfaces.sclk                   (sclk                   ),.rst_n                  (rst_n                  ),//Communication Interfaces.a                      (a                      ),.b                      (b                      ),.add                    (add                    ),.subtract               (subtract               )
);endmodule

运行结果:

下面是加了signed操作的移位,我们可以看出来结果的不一样。
test模块:

`timescale 1ns / 1ps
module test(//System Interfacesinput                       sclk            ,input                       rst_n           ,//Communication Interfacesinput       signed  [ 7:0]  a               ,input       signed  [ 7:0]  b               ,output  reg signed  [ 7:0]  add             ,output  reg signed  [ 7:0]  subtract
);//========================================================================================\
//**************Define Parameter and  Internal Signals**********************************
//========================================================================================///========================================================================================\
//**************     Main      Code        **********************************
//========================================================================================/
always @(posedge sclk or negedge rst_n)if(rst_n == 1'b0)add             <=          8'd0;  else add             <=          a <<< 1;always @(posedge sclk or negedge rst_n)if(rst_n == 1'b0)subtract        <=          8'd0;elsesubtract        <=          b >>> 1;endmodule

tb模块:

`timescale 1ns / 1ps
module tb();
//System Interfaces
reg                         sclk            ;
reg                         rst_n           ;
reg     signed      [ 7:0]  a               ;
reg     signed      [ 7:0]  b               ;
wire    signed      [ 7:0]  add             ;
wire    signed      [ 7:0]  subtract        ;initial beginsclk            =           1'b0;rst_n           <=          1'b0;a               <=          0;b               <=          0;#(1000)rst_n           <=          1'b1;#(1000)a               <=          8;b               <=          10;#(1000)a               <=          8;b               <=          -10;#(1000)a               <=          -8;b               <=          10;#(1000)a               <=          -8;b               <=          -10;#(1000);$stop;
endalways  #(10)       sclk        =           ~sclk;test test_inst(//System Interfaces.sclk                   (sclk                   ),.rst_n                  (rst_n                  ),//Communication Interfaces.a                      (a                      ),.b                      (b                      ),.add                    (add                    ),.subtract               (subtract               )
);endmodule

运行结果:

所以,在写程序的时候对有符号数操作,关键走signed还是应该添加。

总结

该篇文章我们会一直补充完善,共同发掘一些语法中的大坑。

在查找一些资料的时候,发现一些博主只给出部分代码,其实这样别人根本看不懂,只有给出整个工程代码才易于知识的传播。创作不易,认为文章有帮助的同学们可以关注、点赞、转发支持。为行业贡献及其微小的一部分。或者对文章有什么看法或者需要更近一步交流的同学,可以加入下面的群:

Verilog语法误区总结相关推荐

  1. [转]verilog语法学习心得

    verilog语法学习心得 1.数字电路基础知识: 布尔代数.门级电路的内部晶体管结构.组合逻辑电路分析与设计.触发器.时序逻辑电路分析与设计 2.数字系统的构成: 传感器  AD  数字处理器  D ...

  2. Verilog 语法入门知识

    Verilog 语法入门知识 一.变量类型 ①数值 数值表示采用 <二进制位数>'<数值表示的进制><数值>的结构. 其中进制可以为b.o.d.h分别代表二.八.十 ...

  3. Verilog语法-005—宏定义

    Verilog语法-005-宏定义 1.Verilog宏定义-`ifdef `ifndef `ifdef FOR_FPGA //如果定义了FOR_FPGA宏,则会执行如下 语句/或者没有语句 `els ...

  4. 【系统设计】Verilog语法及示例(2)

    参考Verilog语法 | 教程 (ustc.edu.cn) 1.7 D触发器 D触发器是一个具有记忆功能.具有两个稳定状态的信息存储器件,是构成时序逻辑的最基本逻辑单元.其具有两个稳定状态,即&qu ...

  5. verilog语法学习目录

    verilog语法实例学习(1) Verilog中注释 Verilog代码中的信号 标识符 信号的值 Verilog中的数字 Verilog中的参数 verilog语法实例学习(2) 线网类型 变量类 ...

  6. Verilog语法之运算符

    本文转自知乎罗成的文章Verilog语法之四:运算符 总的文章小白如何快速入门Verilog Verilog HDL语言的运算符范围很广,其运算符按其功能可分为以下几类: 算术运算符(+,-,×,/, ...

  7. Verilog语法和典型电路

    这里写目录标题 Verilog语法知识 Q:锁存器 Q:D触发器 Q:消除毛刺 Q:同步复位和异步复位 Q:边沿检测 Q:握手信号 Q:脉冲展宽(单bit慢采快) Q:二进制与格雷码的转换 Q:二进制 ...

  8. Verilog语法之变量

    本文转自知乎罗成的Verilog语法之三:变量 总的文章链接地址小白如何快速入门Verilog 本文首发于微信公众号"花蚂蚁",想要学习FPGA及Verilog的同学可以关注一下. ...

  9. verilog语法中+:和-:用法

    verilog语法中+:和-:主要用来进行位选择. 位选择从向量net.向量 reg.整数变量或时间变量中提取特定位.可以使用表达式寻址该位.如果位选择超出地址边界或位选择为 x 或 z,则引用返回的 ...

  10. Verilog 语法(二)···············简单入门

    经过数字逻辑电路课程的学习,大家已对多路选择器(数据选择器)有了一定的认识.本节将通过建模2选1的数据选择器,简单介绍Verilog的各级建模语言. 一.行为级建模 使用always块来对数据选择器进 ...

最新文章

  1. Rancher-创建自己的应用商店教程
  2. 无法使用BIPublisher开发报表
  3. JS合并数组的几种方法及优劣比较
  4. python流程控制语法_005 Python语法之流程控制
  5. 如何删除一个员工编号及其全部主数据和事务数据?
  6. Spring JdbcTemplate查询实例
  7. MySQL-TCL语言
  8. pow()函数的应用
  9. 阿里云负载均衡器(SLB)的配置方法
  10. 使用canvas制作一个移动端画板
  11. mysql中date与datetime类型的区别
  12. 将多个excel文件合并为:一个excel文件的多个sheet页【方法技巧】
  13. 深度学习之跟学霹雳吧啦Wz笔记
  14. SourceInsight4.0黑色背景主题
  15. vue2.0 实现页面导航提示引导
  16. matlab外推预测函数,时间序列模型 (五): 趋势外推预测方法
  17. 【Python 百炼成钢】进制转换、特殊回文数、水仙花数、杨辉三角、字母图形、01字符串、回形取数、排他方数、世纪末的星期日、约瑟夫环
  18. Oracle中修改表列名(SQL语句)
  19. AOD452场效应管MOS管
  20. python判断正确的是_Python输入数据类型判断正确与否的函数大全(非常全)

热门文章

  1. 工具-IDEA 好看的样式字体/字号/
  2. flash乱码解决方案
  3. #Qt#QListView的两种用法,亲测有效
  4. html视频怎么转换成图片,视频怎么转成gif格式 录制视频转gif图片用什么软件|gif动画录制工具...
  5. 【牛客网】养兔子(斐波那契数列)
  6. CAD工具——批量打印
  7. 2019 版idea设置字体大小
  8. PR、PS小技巧汇总
  9. 音视频入门系列-字幕篇(SSA ASS)
  10. ass translation python(ass字幕文件半自动平移时间轴py脚本)