打印
[Verilog HDL]

VERILOG常见的误区

[复制链接]
10585|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gaochy1126|  楼主 | 2023-5-29 15:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
组合逻辑锁存器的生成
在Verilog语言组合逻辑的书写中,我们经常会写下面语句:
assign      din_x       =       rvalid == 1'b1 ? {{24{din[9]}},din}: din_x;
或者,
always @(*)
    if(ext_valid == 1'b1)
        dout            <=      comb_in3;
    else
        dout            <=      dout;
直接读写的语法,我们以为编译器会生成锁存器,但是上面的语法分别核下面的等效,
assign      din_x       =       {{24{din[9]}},din};
always @(*)
    dout             =      comb_in3;

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

VERILOG语句中SIGNED的作用

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

`timescale 1ns / 1ps
module test(
    //System Interfaces
    input                   sclk            ,
    input                   rst_n           ,
    //Communication Interfaces
    input           [ 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;
    else
        subtract        <=          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 begin
    sclk            =           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;
end

always  #(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








使用特权

评论回复

相关帖子

沙发
gaochy1126|  楼主 | 2023-5-29 15:06 | 只看该作者
运行的结果如下:

我们将使用关键字signed进行如下实验:
test模块:
`timescale 1ns / 1ps
module test(
    //System Interfaces
    input                       sclk            ,
    input                       rst_n           ,
    //Communication Interfaces
    input       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;
    else
        subtract        <=          a - b;

endmodule

`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 begin
    sclk            =           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;
end

always  #(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



使用特权

评论回复
评论
gaochy1126 2023-5-29 16:56 回复TA
赞一个 
板凳
gaochy1126|  楼主 | 2023-5-29 15:07 | 只看该作者
运行结果如下:
在这里插入图片描述
对比以上两组实验,我们可以发现定义signed关键字在加减实验中没有体现应有的作用。

但是关键字在移位操作的时候就得到了体现
test模块:
`timescale 1ns / 1ps
module test(
    //System Interfaces
    input                       sclk            ,
    input                       rst_n           ,
    //Communication Interfaces
    input               [ 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;
    else
        subtract        <=          b >>> 1;

endmodule

`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 begin
    sclk            =           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;
end

always  #(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

运行结果:



使用特权

评论回复
评论
gaochy1126 2023-5-29 16:56 回复TA
赞一个 
地板
gaochy1126|  楼主 | 2023-5-29 15:08 | 只看该作者
下面是加了signed操作的移位,我们可以看出来结果的不一样。
test模块:
`timescale 1ns / 1ps
module test(
    //System Interfaces
    input                       sclk            ,
    input                       rst_n           ,
    //Communication Interfaces
    input       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;
    else
        subtract        <=          b >>> 1;

endmodule

`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 begin
    sclk            =           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;
end

always  #(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

运行结果:


使用特权

评论回复
评论
gaochy1126 2023-5-29 16:56 回复TA
赞一个 
5
cashrwood| | 2023-5-29 16:52 | 只看该作者
楼主好人,资料很好。谢谢楼主!                                 

使用特权

评论回复
评论
gaochy1126 2023-5-29 16:57 回复TA
赞一个 
6
mnynt121| | 2023-5-29 16:52 | 只看该作者
资料的确是很全面                                 

使用特权

评论回复
评论
gaochy1126 2023-5-29 16:57 回复TA
赞一个 
7
yeates333| | 2023-5-29 16:52 | 只看该作者
感谢分享,提供的例程很实用                                 

使用特权

评论回复
评论
gaochy1126 2023-5-29 16:57 回复TA
赞一个 
8
kmzuaz| | 2023-5-29 16:52 | 只看该作者
感觉今后应该用的人很多                                   

使用特权

评论回复
评论
gaochy1126 2023-5-29 16:57 回复TA
赞一个 
9
plsbackup| | 2023-5-29 16:52 | 只看该作者
共享的资料比较详细  谢谢                                 

使用特权

评论回复
评论
gaochy1126 2023-5-29 16:57 回复TA
赞一个 
10
jimmhu| | 2023-5-29 16:52 | 只看该作者
内容还是非常丰富的                                 

使用特权

评论回复
评论
gaochy1126 2023-5-29 16:57 回复TA
赞一个 
11
mattlincoln| | 2023-5-29 16:53 | 只看该作者
内容还是非常丰富的                                 

使用特权

评论回复
评论
gaochy1126 2023-5-29 16:58 回复TA
赞一个 
12
sdCAD| | 2023-5-29 16:53 | 只看该作者
资料很实用,谢谢楼主!                                 

使用特权

评论回复
评论
gaochy1126 2023-5-29 16:58 回复TA
赞一个 
13
ingramward| | 2023-5-29 16:53 | 只看该作者
谢谢你共享的资料                                 

使用特权

评论回复
评论
gaochy1126 2023-5-29 16:58 回复TA
赞一个 
14
wangdezhi| | 2023-5-29 16:53 | 只看该作者
感觉今后应该用的人很多                                   

使用特权

评论回复
评论
gaochy1126 2023-5-29 16:58 回复TA
赞一个 
15
backlugin| | 2023-5-29 16:53 | 只看该作者
  应用还是很广泛的                                 

使用特权

评论回复
评论
gaochy1126 2023-5-29 16:58 回复TA
赞一个 
16
timfordlare| | 2023-5-29 16:54 | 只看该作者
以后多交流交流                  

使用特权

评论回复
评论
gaochy1126 2023-5-29 16:58 回复TA
赞一个 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

1051

主题

11300

帖子

26

粉丝