[Verilog HDL] VERILOG常见的误区

[复制链接]
11565|30
 楼主| gaochy1126 发表于 2023-5-29 15:05 | 显示全部楼层 |阅读模式
组合逻辑锁存器的生成
在Verilog语言组合逻辑的书写中,我们经常会写下面语句:
  1. assign      din_x       =       rvalid == 1'b1 ? {{24{din[9]}},din}: din_x;
或者,
  1. always @(*)
  2.     if(ext_valid == 1'b1)
  3.         dout            <=      comb_in3;
  4.     else
  5.         dout            <=      dout;
直接读写的语法,我们以为编译器会生成锁存器,但是上面的语法分别核下面的等效,
  1. assign      din_x       =       {{24{din[9]}},din};
  2. always @(*)
  3.     dout             =      comb_in3;

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

VERILOG语句中SIGNED的作用

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

  1. `timescale 1ns / 1ps
  2. module test(
  3.     //System Interfaces
  4.     input                   sclk            ,
  5.     input                   rst_n           ,
  6.     //Communication Interfaces
  7.     input           [ 7:0]  a               ,
  8.     input           [ 7:0]  b               ,
  9.     output  reg     [ 7:0]  add             ,
  10.     output  reg     [ 7:0]  subtract        
  11. );

  12. //========================================================================================\
  13. //**************Define Parameter and  Internal Signals**********************************
  14. //========================================================================================/


  15. //========================================================================================\
  16. //**************     Main      Code        **********************************
  17. //========================================================================================/
  18. always @(posedge sclk or negedge rst_n)
  19.     if(rst_n == 1'b0)
  20.         add             <=          8'd0;  
  21.     else
  22.         add             <=          a + b;

  23. always @(posedge sclk or negedge rst_n)
  24.     if(rst_n == 1'b0)
  25.         subtract        <=          8'd0;
  26.     else
  27.         subtract        <=          a - b;

  28. endmodule

tb模块:

  1. `timescale 1ns / 1ps
  2. module tb();
  3. //System Interfaces
  4. reg                         sclk            ;
  5. reg                         rst_n           ;
  6. reg                 [ 7:0]  a               ;
  7. reg                 [ 7:0]  b               ;
  8. wire                [ 7:0]  add             ;
  9. wire                [ 7:0]  subtract        ;

  10. initial begin
  11.     sclk            =           1'b0;
  12.     rst_n           <=          1'b0;
  13.     a               <=          0;
  14.     b               <=          0;
  15.     #(1000)
  16.     rst_n           <=          1'b1;
  17.     #(1000)
  18.     a               <=          5;
  19.     b               <=          7;
  20.     #(1000)
  21.     a               <=          5;
  22.     b               <=          -7;
  23.     #(1000)
  24.     a               <=          -5;
  25.     b               <=          7;
  26.     #(1000)
  27.     a               <=          -5;
  28.     b               <=          -7;
  29.     #(1000);
  30.     $stop;
  31. end

  32. always  #(10)       sclk        =           ~sclk;

  33. test test_inst(
  34.     //System Interfaces
  35.     .sclk                   (sclk                   ),
  36.     .rst_n                  (rst_n                  ),
  37.     //Communication Interfaces
  38.     .a                      (a                      ),
  39.     .b                      (b                      ),
  40.     .add                    (add                    ),
  41.     .subtract               (subtract               )
  42. );

  43. endmodule








 楼主| gaochy1126 发表于 2023-5-29 15:06 | 显示全部楼层
运行的结果如下:

我们将使用关键字signed进行如下实验:
test模块:
  1. `timescale 1ns / 1ps
  2. module test(
  3.     //System Interfaces
  4.     input                       sclk            ,
  5.     input                       rst_n           ,
  6.     //Communication Interfaces
  7.     input       signed  [ 7:0]  a               ,
  8.     input       signed  [ 7:0]  b               ,
  9.     output  reg signed  [ 7:0]  add             ,
  10.     output  reg signed  [ 7:0]  subtract        
  11. );

  12. //========================================================================================\
  13. //**************Define Parameter and  Internal Signals**********************************
  14. //========================================================================================/


  15. //========================================================================================\
  16. //**************     Main      Code        **********************************
  17. //========================================================================================/
  18. always @(posedge sclk or negedge rst_n)
  19.     if(rst_n == 1'b0)
  20.         add             <=          8'd0;  
  21.     else
  22.         add             <=          a + b;

  23. always @(posedge sclk or negedge rst_n)
  24.     if(rst_n == 1'b0)
  25.         subtract        <=          8'd0;
  26.     else
  27.         subtract        <=          a - b;

  28. endmodule

  1. `timescale 1ns / 1ps
  2. module tb();
  3. //System Interfaces
  4. reg                         sclk            ;
  5. reg                         rst_n           ;
  6. reg     signed      [ 7:0]  a               ;
  7. reg     signed      [ 7:0]  b               ;
  8. wire    signed      [ 7:0]  add             ;
  9. wire    signed      [ 7:0]  subtract        ;

  10. initial begin
  11.     sclk            =           1'b0;
  12.     rst_n           <=          1'b0;
  13.     a               <=          0;
  14.     b               <=          0;
  15.     #(1000)
  16.     rst_n           <=          1'b1;
  17.     #(1000)
  18.     a               <=          5;
  19.     b               <=          7;
  20.     #(1000)
  21.     a               <=          5;
  22.     b               <=          -7;
  23.     #(1000)
  24.     a               <=          -5;
  25.     b               <=          7;
  26.     #(1000)
  27.     a               <=          -5;
  28.     b               <=          -7;
  29.     #(1000);
  30.     $stop;
  31. end

  32. always  #(10)       sclk        =           ~sclk;

  33. test test_inst(
  34.     //System Interfaces
  35.     .sclk                   (sclk                   ),
  36.     .rst_n                  (rst_n                  ),
  37.     //Communication Interfaces
  38.     .a                      (a                      ),
  39.     .b                      (b                      ),
  40.     .add                    (add                    ),
  41.     .subtract               (subtract               )
  42. );

  43. endmodule



评论

赞一个  发表于 2023-5-29 16:56
 楼主| gaochy1126 发表于 2023-5-29 15:07 | 显示全部楼层
运行结果如下:
在这里插入图片描述
对比以上两组实验,我们可以发现定义signed关键字在加减实验中没有体现应有的作用。

但是关键字在移位操作的时候就得到了体现
test模块:
  1. `timescale 1ns / 1ps
  2. module test(
  3.     //System Interfaces
  4.     input                       sclk            ,
  5.     input                       rst_n           ,
  6.     //Communication Interfaces
  7.     input               [ 7:0]  a               ,
  8.     input               [ 7:0]  b               ,
  9.     output  reg         [ 7:0]  add             ,
  10.     output  reg         [ 7:0]  subtract        
  11. );

  12. //========================================================================================\
  13. //**************Define Parameter and  Internal Signals**********************************
  14. //========================================================================================/


  15. //========================================================================================\
  16. //**************     Main      Code        **********************************
  17. //========================================================================================/
  18. always @(posedge sclk or negedge rst_n)
  19.     if(rst_n == 1'b0)
  20.         add             <=          8'd0;  
  21.     else
  22.         add             <=          a <<< 1;

  23. always @(posedge sclk or negedge rst_n)
  24.     if(rst_n == 1'b0)
  25.         subtract        <=          8'd0;
  26.     else
  27.         subtract        <=          b >>> 1;

  28. endmodule

  1. `timescale 1ns / 1ps
  2. module tb();
  3. //System Interfaces
  4. reg                         sclk            ;
  5. reg                         rst_n           ;
  6. reg                 [ 7:0]  a               ;
  7. reg                 [ 7:0]  b               ;
  8. wire                [ 7:0]  add             ;
  9. wire                [ 7:0]  subtract        ;

  10. initial begin
  11.     sclk            =           1'b0;
  12.     rst_n           <=          1'b0;
  13.     a               <=          0;
  14.     b               <=          0;
  15.     #(1000)
  16.     rst_n           <=          1'b1;
  17.     #(1000)
  18.     a               <=          8;
  19.     b               <=          10;
  20.     #(1000)
  21.     a               <=          8;
  22.     b               <=          -10;
  23.     #(1000)
  24.     a               <=          -8;
  25.     b               <=          10;
  26.     #(1000)
  27.     a               <=          -8;
  28.     b               <=          -10;
  29.     #(1000);
  30.     $stop;
  31. end

  32. always  #(10)       sclk        =           ~sclk;

  33. test test_inst(
  34.     //System Interfaces
  35.     .sclk                   (sclk                   ),
  36.     .rst_n                  (rst_n                  ),
  37.     //Communication Interfaces
  38.     .a                      (a                      ),
  39.     .b                      (b                      ),
  40.     .add                    (add                    ),
  41.     .subtract               (subtract               )
  42. );

  43. endmodule

运行结果:



评论

赞一个  发表于 2023-5-29 16:56
 楼主| gaochy1126 发表于 2023-5-29 15:08 | 显示全部楼层
下面是加了signed操作的移位,我们可以看出来结果的不一样。
test模块:
  1. `timescale 1ns / 1ps
  2. module test(
  3.     //System Interfaces
  4.     input                       sclk            ,
  5.     input                       rst_n           ,
  6.     //Communication Interfaces
  7.     input       signed  [ 7:0]  a               ,
  8.     input       signed  [ 7:0]  b               ,
  9.     output  reg signed  [ 7:0]  add             ,
  10.     output  reg signed  [ 7:0]  subtract        
  11. );

  12. //========================================================================================\
  13. //**************Define Parameter and  Internal Signals**********************************
  14. //========================================================================================/


  15. //========================================================================================\
  16. //**************     Main      Code        **********************************
  17. //========================================================================================/
  18. always @(posedge sclk or negedge rst_n)
  19.     if(rst_n == 1'b0)
  20.         add             <=          8'd0;  
  21.     else
  22.         add             <=          a <<< 1;

  23. always @(posedge sclk or negedge rst_n)
  24.     if(rst_n == 1'b0)
  25.         subtract        <=          8'd0;
  26.     else
  27.         subtract        <=          b >>> 1;

  28. endmodule

  1. `timescale 1ns / 1ps
  2. module tb();
  3. //System Interfaces
  4. reg                         sclk            ;
  5. reg                         rst_n           ;
  6. reg     signed      [ 7:0]  a               ;
  7. reg     signed      [ 7:0]  b               ;
  8. wire    signed      [ 7:0]  add             ;
  9. wire    signed      [ 7:0]  subtract        ;

  10. initial begin
  11.     sclk            =           1'b0;
  12.     rst_n           <=          1'b0;
  13.     a               <=          0;
  14.     b               <=          0;
  15.     #(1000)
  16.     rst_n           <=          1'b1;
  17.     #(1000)
  18.     a               <=          8;
  19.     b               <=          10;
  20.     #(1000)
  21.     a               <=          8;
  22.     b               <=          -10;
  23.     #(1000)
  24.     a               <=          -8;
  25.     b               <=          10;
  26.     #(1000)
  27.     a               <=          -8;
  28.     b               <=          -10;
  29.     #(1000);
  30.     $stop;
  31. end

  32. always  #(10)       sclk        =           ~sclk;

  33. test test_inst(
  34.     //System Interfaces
  35.     .sclk                   (sclk                   ),
  36.     .rst_n                  (rst_n                  ),
  37.     //Communication Interfaces
  38.     .a                      (a                      ),
  39.     .b                      (b                      ),
  40.     .add                    (add                    ),
  41.     .subtract               (subtract               )
  42. );

  43. endmodule

运行结果:


评论

赞一个  发表于 2023-5-29 16:56
cashrwood 发表于 2023-5-29 16:52 来自手机 | 显示全部楼层
楼主好人,资料很好。谢谢楼主!                                 

评论

赞一个  发表于 2023-5-29 16:57
mnynt121 发表于 2023-5-29 16:52 来自手机 | 显示全部楼层
资料的确是很全面                                 

评论

赞一个  发表于 2023-5-29 16:57
yeates333 发表于 2023-5-29 16:52 来自手机 | 显示全部楼层
感谢分享,提供的例程很实用                                 

评论

赞一个  发表于 2023-5-29 16:57
kmzuaz 发表于 2023-5-29 16:52 来自手机 | 显示全部楼层
感觉今后应该用的人很多                                   

评论

赞一个  发表于 2023-5-29 16:57
plsbackup 发表于 2023-5-29 16:52 来自手机 | 显示全部楼层
共享的资料比较详细  谢谢                                 

评论

赞一个  发表于 2023-5-29 16:57
jimmhu 发表于 2023-5-29 16:52 来自手机 | 显示全部楼层
内容还是非常丰富的                                 

评论

赞一个  发表于 2023-5-29 16:57
mattlincoln 发表于 2023-5-29 16:53 来自手机 | 显示全部楼层
内容还是非常丰富的                                 

评论

赞一个  发表于 2023-5-29 16:58
sdCAD 发表于 2023-5-29 16:53 来自手机 | 显示全部楼层
资料很实用,谢谢楼主!                                 

评论

赞一个  发表于 2023-5-29 16:58
ingramward 发表于 2023-5-29 16:53 来自手机 | 显示全部楼层
谢谢你共享的资料                                 

评论

赞一个  发表于 2023-5-29 16:58
wangdezhi 发表于 2023-5-29 16:53 来自手机 | 显示全部楼层
感觉今后应该用的人很多                                   

评论

赞一个  发表于 2023-5-29 16:58
backlugin 发表于 2023-5-29 16:53 来自手机 | 显示全部楼层
  应用还是很广泛的                                 

评论

赞一个  发表于 2023-5-29 16:58
timfordlare 发表于 2023-5-29 16:54 来自手机 | 显示全部楼层
以后多交流交流                  

评论

赞一个  发表于 2023-5-29 16:58
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:这个社会混好的两种人:一是有权有势,二是没脸没皮的。

1205

主题

11937

帖子

26

粉丝
快速回复 在线客服 返回列表 返回顶部