Verilog/VHDL基础知识
长弓的坚持
这个作者很懒,什么都没留下…
展开
-
Verilog中`define和parameter有什么区别
Verilog中使用`define和parameter有什么区别?`define和parameter都可以在设计中用来指定常量。 例如:以下是使用`define和parameter的一些区别:什么是派生parameters?当一个或多个parameters用于定义另一个parameters时,则结果是派生parameters。 派生parameters可以是parameter或localparam。 在以下示例中,有两个parameter,width和 depth,,用于定义第三.转载 2020-12-26 17:15:43 · 4316 阅读 · 0 评论 -
Verilog之delay的两种用法(inter/intra)
verilog语言中有两种延迟方式:inter-delay和intra-delay,关于inter和intra。这两个英文前缀都有“内部,之间”的意思,但又有所不同。inter表达不同事物之间,intra表达同类事物之间,两者具体的含义请细细体会:)。以阻塞式赋值为例(block assignment):1.inter-delay的表达式为:#delay-value a=b+c;先说说阻塞式赋值语句执行的一般过程:block assignment方程的RHS先估值(evalu...转载 2020-12-20 20:52:50 · 5961 阅读 · 0 评论 -
Verilog随机数生成$random
每次调用系统函数$random(seed),都可以产生一个新的32位随机数。如果不设置seed,每次取得的随机数是相同的。也就是说,$random所产生的随机数,其实对于系统而言,不过是提前预设好的32位数据数组而已。我们使用$random产生的随机数,在seed一致的情况下(如果不设置seed就是一致),都是调用了系统中预设的同一套数据数组,因此它们的值总是一致的。【语法结构】:$random(seed);【实例1】:实例1:reg[23:0]rand; r...转载 2020-12-20 20:48:18 · 11423 阅读 · 0 评论 -
Verilog赋值间延迟语句与赋值内延迟语句比较
module full_adder(a,b,sum);input a,b;output reg sum;always @(a,b) #13 sum = (a & b) ; 或者 always @(a,b) sum =#13(a & b) ;endmodule注意到两个always语句的延迟语句的位置不同,后一个语句称为内部指定延迟。第一个always语句说明在a或b变化后,先阻塞运行,延迟13ns,再根据当前的a,b的值,计算sum的值。这就导致计算得到的...转载 2020-08-16 18:43:55 · 2245 阅读 · 0 评论 -
Verilog 中signed和$signed()的用法
1、在verilog中有时会用signed修饰符来修饰定义的数据,运算的时候也会用$signed()任务来强制转换数据,那么signed的修饰是为什么呢,是为了区分有符号数和无符号数的加法和乘法吗?其实不是的,因为有符号数和无符号数据的加法强结果和乘法器结构是一样的,signed的真正作用是决定如何对操作数扩位的问题。2、verilog中的加法和乘法操作前,会先对操作数据扩位成结果相同的位宽,然后进行加法或者乘法处理。比如a/b都为4位数据,c为5位数据,c = a + b,这个运算的时候会先把a和b扩转载 2020-08-16 17:51:10 · 24756 阅读 · 6 评论 -
Verilog中关于case语句的优先级
对于这样的组合逻辑电路 always@(X) case(X) X1: X2: …… endcase 如果分支项包含变量X的所有取值情况,并且互相不重复,那么这样的情况,其实没有必要使用综合指令。(一)“//synthesis parallel_case” 有一些书在介绍case语句时(例如《verilog HDL综合实用教程》)说“case语句的verilog HDL语义表明了选取case分支...转载 2020-01-05 21:16:18 · 8072 阅读 · 0 评论 -
Verilog中case,casex,casez的区别
在case语句中,敏感表达式中与各项值之间的比较是一种全等比较,每一位都相同才认为匹配。Note: casez与casex语句是case语句的两种变体, 在写testbench时用到,属于不可综合的语句。在casez语句中,如果分支表达式某些位的值为高阻z,那么对这些位的比较就会忽略,不予考虑,而只关注其他位的比较结果。 在casex语句中,则把这种处理方式进一步扩展到对x的处理,即如...转载 2020-01-05 21:04:47 · 2535 阅读 · 0 评论 -
Verilog HDL基础之:条件语句
if语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。Verilog HDL语言提供了3种形式的if语句。(1)无分支。语法形式:if (表达式) 语句;例如:if (a > b) out1 = int1; //若a大于b,将int1赋予out1(2)单级分支。语法形式:if(表达式)语句1;e...转载 2020-01-05 20:58:00 · 15486 阅读 · 0 评论 -
Verilog中基本的数据类型
Verilog中共有19种数据类型。基本的四种类型: reg型、wire型、integer型、parameter型。其他类型:large型、medium型、small型、scalared型、time型、tri型、trio型、tril型、triand型、trior型、trireg型、vectored型、wand型和wor型。这14中数据类型除time外都与基本逻辑单元建库有关。...转载 2020-01-01 14:33:58 · 16295 阅读 · 0 评论 -
always@( )列表里不能同时有电平敏感事件和边沿触发事件
always@( )列表里面不能同时有电平敏感事件和边沿触发事件原因:1:这是硬件不可实现的2:这是综合工具不允许的代码例子:always@(posedge clk or rstn) data <= data +1;逻辑上有两种情况会执行data <= data +11:clk上升沿来了2:rstn的值发生了变化这样的触发器是不存...转载 2019-11-16 11:21:44 · 3816 阅读 · 0 评论 -
verilog中的三目运算符
(1)assign c=(sel)?a:b;(2)always @(sel or a or b) begin if(sel) c = a; else c = b;end 这两段代码,我用quartus综合出来的结果都是一个选择器,但是我私以为,这样两种风格的代码,我们都会偏向使用第一种,除了...转载 2019-10-19 17:45:48 · 14184 阅读 · 0 评论 -
verilog 里面,always,assign和always@(*)区别
1.always@后面内容是敏感变量,always@(*)里面的敏感变量为*,意思是说敏感变量由综合器根据always里面的输入变量自动添加,也就是所有变量都是敏感列表,不用自己考虑。 2.如果没有@,那就是不会满足特定条件才执行,而是执行完一次后立马执行下一次,一直重复执行,比如testbench里面产生50Mhz的时钟就(假设时间尺度是1ns)可以写成 always #25 CLK_50Mh...转载 2019-09-21 19:02:47 · 29604 阅读 · 4 评论 -
VHDL操作符
VHDL操作符按照算数优先级排序:混合运算符 (miscellaneous operators): 乘方 ** 取绝对值 abs 非 not 求积运算符(multiplying operators): 乘 * 除 / 取模 mod 取余 rem 符号运算符(sign operators): 正 + 负 - 加法运算符(adding opera...转载 2018-08-25 15:36:47 · 10934 阅读 · 1 评论 -
Vivado和Quartus ii 中工程存档(Archive project)及打开
下面介绍下在Quartus ii 中进行工程存档(Archive project)以及打开存档工程的操作方法,当需要把工程发给其它电脑时,用工程存档比较方便,空间占用小,而且不会出现文件丢失的情况。我在实际中有遇到直接拷贝整个工程文件夹到别人电脑上,打开后,signaltap ii 文件丢失的情况,当我生成qar后再发到别人电脑上,就正常了。工程存档有点像把工程进行压缩一样,存档后的文件后缀是qa...转载 2018-08-12 13:48:39 · 4620 阅读 · 0 评论 -
如何解决VHDL中参数化赋值:赋全0、全1、全z
VHDL中可将参数定义在generic语句中,一般是将位宽定义在此,其他参数可定义在package中。这里不做讨论。VHDL中一个很好的语句others,对于参数化或者大位宽赋值全0、全1、全X、全Z很方便(这里X、Z为大写),以如下的方式: cnt <= (others=>'0'); --赋全0 cnt <= (others=>'1');--赋全1...转载 2018-07-08 21:39:49 · 11339 阅读 · 1 评论 -
锁存器、触发器、寄存器和缓冲器的区别
一、锁存器锁存器(latch)---对脉冲电平敏感,在时钟脉冲的电平作用下改变状态锁存器是电平触发的存储单元,数据存储的动作取决于输入时钟(或者使能)信号的电平值,仅当锁存器处于使能状态时,输出才会随着数据输入发生变化。锁存器不同于触发器,它不在锁存数据时,输出端的信号随输入信号变化,就像信号通...转载 2018-04-05 21:52:30 · 2053 阅读 · 0 评论 -
Verilog中for 语句怎么用
类似C的环路结构如for-loop可能对学过C语言的人存在陷阱。其原因是在硬件语言中并没有隐含的寄存器这个条件,所以一般这些环路不可以在可综合代码中用来做算法迭代。在Verilog中,for循环一般用作输入多次有一定规律的赋值语句,以提高设计效率。 软件设计者可能利用for循环获得X的N次幂,代...转载 2018-04-05 20:50:44 · 28930 阅读 · 0 评论 -
三分频的Verilog实现
原创 2018-04-17 13:09:33 · 9414 阅读 · 2 评论 -
Verilog语言中如何将memory型变量转换为普通变量
Verilog 2001和Verilog2005 能够将memory转换成为vector型变量,综合工具可以选择synplify pro 9.6.2module memory2vector( mem,vec); parameter vectorsize = 4; parameter arraysize = 3; input [vectorsize-1:0] mem [a转载 2016-12-18 23:33:14 · 2625 阅读 · 0 评论 -
Verilog中生成语句(generate)的用法
一:generateVerilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多个variable,net,task,function,continous assignment,initial和always。在generate语句中可以引入if-else和case语句,根据条件不同产生不同的实例化。用法:1. generat转载 2016-12-18 23:36:50 · 34034 阅读 · 4 评论 -
Verilog中for语句的使用
在C语言中,经常用到for循环语句,但在硬件描述语言中for语句的使用较C语言等软件描述语言有较大的区别。 在Verilog中除了在Testbench(仿真测试激励)中使用for循环语句外,在Testbench中for语句在生成激励信号等方面使用较普遍,但在RTL级编码中却很少使用for循环语句。主要原因就是for循环会被综合器展开为所有变量情况的执行语句,每个变量独立占用寄存器资转载 2016-12-17 23:36:27 · 28481 阅读 · 0 评论 -
Verilog中可综合与不可综合的语句
础知识:verilog 不可综合语句 (1)所有综合工具都支持的结构:always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,inpu转载 2016-12-17 23:38:30 · 33930 阅读 · 0 评论 -
Verilog中memory数据类型
存储器是一个寄存器数组。存储器使用如下方式说明: reg [ msb: 1sb] memory1 [ upper1: lower1], memory2 [upper2: lower2],. . . ; 例如: reg [0:3 ] MyMem [0:63] //MyMem为64个4位寄存器的数组。 reg Bog [1:5转载 2016-12-17 23:41:02 · 28850 阅读 · 3 评论 -
Verilog 中 wire 和 reg 数据类型区别
两者差别很大,完全不能取消。在Verilog中,wire永远是wire,就是相当于一条连线,用来连接电路,不能存储数据,无驱动能力,是组合逻辑,只能在assign左侧赋值,不能在always @ 中赋值;但reg可以综合成register,latch,甚至wire(当其只是中间变量的时候),可以用于组合逻辑或者时序逻辑,能存储数据,有驱动能力,在always @模块表达式左侧被赋值。两转载 2016-12-17 23:44:35 · 20275 阅读 · 0 评论 -
verilog中有符号数运算
verilog中的有符号数运算 有符号数的计算:若有需要关于有号数的计算,应当利用Verilog 2001所提供的signed及$signed()机制。 Ex: input signed [7:0] a, b; output signed [15:0] o; assign o = a * b; or input [7:0] a, b;转载 2017-01-07 12:35:36 · 18204 阅读 · 1 评论 -
Verilog组合逻辑和时序逻辑的比较
VerilogHDL语言分为面向综合和面向仿真两大类语句,且可综合语句远少于仿真语句,读者可能会有可综合设计相对简单的感觉。然而事实刚好与此相反,这是因为:首先,可综合设计是用来构建硬件平台的,因此对设计的指标要求很高,包括资源、频率和功耗,这都需要通过代码来体现;其次,在实际开发中要利用基本VerilogHDL语句完成种类繁多的硬件开发,给设计人员带来了很大的挑战。所有的仿真语句只是为了可综合设转载 2017-07-02 09:54:53 · 19333 阅读 · 4 评论 -
Verilog语言设计增加延时的正确方法
在设计仿真激励文件时,为了满足和外部芯片接口的时序要求,经常会用到延时赋值语句,由于不同的延时赋值语句在仿真过程中行为不同,会产生不同的激励输 出,如果不认真区分不同表达式引起的差异,就可能产生错误的激励,无法保证仿真结果的正确,本文就是区分各种延时赋值语句的差异,并给出比较结果。1:阻塞式左延时赋值语句举例说明如下module adder_t1 (co, sum, a, b,转载 2017-07-02 10:31:02 · 40169 阅读 · 2 评论 -
Verilog中inout端口的使用方法
Verilog中inout端口的使用方法(本文中所有Verilog描述仅为展示inout端口的用法,实际描述则需要更丰富的功能描述)Inout端口的使用在芯片中为了管脚复用,很多管脚都是双向的,既可以输入也可以输出。在Verilog中即为inout型端口。Inout端口的实现是使用三态门,如FPGA中的管脚复用部分:三态门的第三个状态是高阻态Z。在实际电路中高阻态意味着响应的管转载 2017-09-24 10:56:16 · 28315 阅读 · 3 评论 -
verilog中对inout信号的处理
1、inout端口不能被赋值为reg型,因此,不能用于always语句中。2、if等条件语句只能用于initial语句及always语句。3、因此,对于inout端口的逻辑判断,要用到?:条件表达式,来控制高阻的赋值4、需要有一个中转的寄存器,这样,在always语句中,才可以将输入的信号赋给输出(用inout代替纯output)5、高阻态不要用于芯片内部,应该用逻辑引到引脚处,然转载 2017-09-24 11:05:07 · 5961 阅读 · 0 评论 -
Verilog中inout的用法(二)
芯片外部引脚很多都使用 inout 类型的,为的是节省管腿。一般信号线用做总线等双向数据传输的时候就要用到 INOUT类型了。就是一个端口同时做输入和 输出。 inout 在具体实现上一般用三态门来实现。三态门的第三个状态就是高阻'Z'。当 inout 端口不输出时,将三态门置高阻。这样信号就不会因为两端同时 输出而出错了,更详细的内容可以搜索一下三态门 tri-state 的资料转载 2017-09-24 12:13:41 · 56799 阅读 · 1 评论 -
Verilog中testbench的设计,文件读取和写入操作
1. 激励的产生对于 testbench 而言,端口应当和被测试的 module 一一对应。端口分为 input,output 和 inout 类型产生激励信号的时候,input 对应的端口应当申明为 reg,output 对应的端口申明为 wire,inout 端口比较特殊,下面专门讲解。1)直接赋值一般用 initial 块给信号赋初值,initial转载 2017-09-24 12:02:33 · 20063 阅读 · 0 评论 -
verilog编译指令
编译指令 以`(反引号)开始的某些标识符是编译器指令。在Verilog 语言编译时,特定的编译器指令在整个编译过程中有效(编译过程可跨越多个文件),直到遇到其它的不同编译程序指令。完整的标准编译器指令如下:* `define, `undef* `ifdef, `else, `endif* `default_nettype* `include* `resetall* `t转载 2017-11-11 22:29:14 · 9385 阅读 · 0 评论 -
localparam和parameter的区别
Verilog代码可移植性设计1. 参数定义localparam,实例代码如下:module tm1( clk,rst_n, pout );input clk;input rst_n;output[M:0] pout; localpara转载 2016-09-29 23:46:04 · 17312 阅读 · 0 评论