Verilog语法误区总结
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语法误区总结相关推荐
- [转]verilog语法学习心得
verilog语法学习心得 1.数字电路基础知识: 布尔代数.门级电路的内部晶体管结构.组合逻辑电路分析与设计.触发器.时序逻辑电路分析与设计 2.数字系统的构成: 传感器 AD 数字处理器 D ...
- Verilog 语法入门知识
Verilog 语法入门知识 一.变量类型 ①数值 数值表示采用 <二进制位数>'<数值表示的进制><数值>的结构. 其中进制可以为b.o.d.h分别代表二.八.十 ...
- Verilog语法-005—宏定义
Verilog语法-005-宏定义 1.Verilog宏定义-`ifdef `ifndef `ifdef FOR_FPGA //如果定义了FOR_FPGA宏,则会执行如下 语句/或者没有语句 `els ...
- 【系统设计】Verilog语法及示例(2)
参考Verilog语法 | 教程 (ustc.edu.cn) 1.7 D触发器 D触发器是一个具有记忆功能.具有两个稳定状态的信息存储器件,是构成时序逻辑的最基本逻辑单元.其具有两个稳定状态,即&qu ...
- verilog语法学习目录
verilog语法实例学习(1) Verilog中注释 Verilog代码中的信号 标识符 信号的值 Verilog中的数字 Verilog中的参数 verilog语法实例学习(2) 线网类型 变量类 ...
- Verilog语法之运算符
本文转自知乎罗成的文章Verilog语法之四:运算符 总的文章小白如何快速入门Verilog Verilog HDL语言的运算符范围很广,其运算符按其功能可分为以下几类: 算术运算符(+,-,×,/, ...
- Verilog语法和典型电路
这里写目录标题 Verilog语法知识 Q:锁存器 Q:D触发器 Q:消除毛刺 Q:同步复位和异步复位 Q:边沿检测 Q:握手信号 Q:脉冲展宽(单bit慢采快) Q:二进制与格雷码的转换 Q:二进制 ...
- Verilog语法之变量
本文转自知乎罗成的Verilog语法之三:变量 总的文章链接地址小白如何快速入门Verilog 本文首发于微信公众号"花蚂蚁",想要学习FPGA及Verilog的同学可以关注一下. ...
- verilog语法中+:和-:用法
verilog语法中+:和-:主要用来进行位选择. 位选择从向量net.向量 reg.整数变量或时间变量中提取特定位.可以使用表达式寻址该位.如果位选择超出地址边界或位选择为 x 或 z,则引用返回的 ...
- Verilog 语法(二)···············简单入门
经过数字逻辑电路课程的学习,大家已对多路选择器(数据选择器)有了一定的认识.本节将通过建模2选1的数据选择器,简单介绍Verilog的各级建模语言. 一.行为级建模 使用always块来对数据选择器进 ...
最新文章
- Rancher-创建自己的应用商店教程
- 无法使用BIPublisher开发报表
- JS合并数组的几种方法及优劣比较
- python流程控制语法_005 Python语法之流程控制
- 如何删除一个员工编号及其全部主数据和事务数据?
- Spring JdbcTemplate查询实例
- MySQL-TCL语言
- pow()函数的应用
- 阿里云负载均衡器(SLB)的配置方法
- 使用canvas制作一个移动端画板
- mysql中date与datetime类型的区别
- 将多个excel文件合并为:一个excel文件的多个sheet页【方法技巧】
- 深度学习之跟学霹雳吧啦Wz笔记
- SourceInsight4.0黑色背景主题
- vue2.0 实现页面导航提示引导
- matlab外推预测函数,时间序列模型 (五): 趋势外推预测方法
- 【Python 百炼成钢】进制转换、特殊回文数、水仙花数、杨辉三角、字母图形、01字符串、回形取数、排他方数、世纪末的星期日、约瑟夫环
- Oracle中修改表列名(SQL语句)
- AOD452场效应管MOS管
- python判断正确的是_Python输入数据类型判断正确与否的函数大全(非常全)