首页 > 其他分享 >verilog

verilog

时间:2025-01-01 15:29:50浏览次数:5  
标签:语句 always verilog 信号 out assign 赋值

参考:Verilog 语法 - 数字电路教程

wire类型在每次赋值前要加assign,而reg类型在每次赋值前不需要加任何东西。

在 always 块内被赋值的信号应定义成 reg 型,用 assign 语句赋值的信号应定义成 wire 型。

操作符

~按位取反、& 按位与、| 按位或。

||逻辑或

img

wire:

在Verilog中,线网型信号(wire)是一种主要的数据类型,用于表示连接信号。它类似于实际电路中的导线,用于传输信号。wire类型的信号通常用于组合逻辑电路中,表示信号的传递和连接。

wire类型信号的主要特点是它们不能存储值,只能传递值。因此,它们通常用于组合逻辑电路,而不是时序逻辑电路。wire类型的信号在assign语句中被赋值,但不能在always块中被赋值。

assign:

实现组合逻辑操作的一种主要描述方式。只能给wire赋值

assign out={b,a}把b,a拼接到out上面去

reg:

除 wire 类型外,另外一种常用的数据类型,一般表示寄存器类型数据,不过并不绝对,记住一条原则:在 always 块内被赋值的信号应定义成 reg 型,用 assign 语句赋值的信号应定义成 wire 型。

always:

除 assign 外,另外一种实现赋值操作的关键字,两者都不可嵌套,区别在于,assign 语句只能实现组合逻辑赋值,且一个 assign 语句后面只能跟一条赋值表达式。而 always 即能实现组合逻辑赋值,又能实现时序逻辑赋值操作,且可以包含多条赋值表达式,多条赋值表达式,则应位于 begin/end 对中间。

img

img

USTC VLab Verilog OJ | YAVG Group Presents

所有的数字电路都是由逻辑门和连线构成的,因此理论上来说都可以通过模块的连接和assign语句进行描述,然而在很多情况下这并不是最方便的一种方式,过程块提供了一种更加方便的描述方式,always过程块便是其中最常用的一种。
对于可综合电路(即能转化成实际电路的verilog描述方式,与之相对的是不可综合电路,多用于电路仿真,不能转换成实际电路),有两种always块的语法形式:
-组合逻辑电路:always@()
-时序逻辑电路:always@(posedge clk)
组合逻辑电路的always块与assign语句等效,用户描述组合逻辑电路时,可根据便利性选择其中一种方式使用。两者生成的硬件电路一般是等效的,但在语法规则上稍有不同:
-assign语句只能对一个信号进行赋值,always块内可对多个信号进行赋值
-assign语句中被赋值信号为wire类型,always块内被赋值信号需定义为reg类型
-always块内支持更加丰富的语法,如使用if…else..、case等适合实现交复杂的组合逻辑
例如下述两条语句是等效的(out1需定义为wire类型,out2需定义为reg类型,但这仅仅是语法上的要求,生成的电路并没有区别):
assign out1 = a & b | c ^ d;
always @(
) out2 = a & b | c ^ d;
其对应的电路图如下所示:
image-20250101152942896
always语句后的括号内放的是敏感变量列表,对于上例来说,可以写成always @(a,b,c,d) out2 = a & b | c ^ d,但为了简单起见,我们一般都用符号*代替。

posedge/negedge:

posedge是Verilog 关键字,表示上升沿的意思。always @(posedge clk) 表示在 clk 信号的上升沿的时刻,执行 always 块内部的语句,与此相对应的,是表示下降沿的关键字 negedge。凡是带有 posedge 或 negedge 的 always 块,都会被综合成时序逻辑电路。
在同一个always进程块中,同一触发信号只能使用一种边沿,即上升沿和下降沿不可同时使用。(例如:always@(posedge clk or negedge clk),这种写法是错误的)

阻塞/非阻塞赋值:

采用 <= 进行赋值的语句,称为“非阻塞赋值”,采用 = 进行赋值的语句,称为“阻塞赋值”。在 always 块中,阻塞式赋值方式语句执行有先后顺序,而非阻塞赋值语句则是同时执行。因此,在时序逻辑电路中,两种赋值方式可能或综合出不同的电路结构。

按位或\与

按位与、归并与操作,如该操作符只有一个操作数时,则将该操作数的所有位进行相与操作

向量拼接

part_selection用于选择向量信号中的一部分,而向量拼接算子{a,b,c}用于将多个信号组合成一个位宽更大的向量信号,如:
{3'b111, 3'b000} 等同于 6'b111000
{1'b1, 1'b0, 3'b101} 等同于5'b10101
{4'ha, 4'd10} 等同于 8'b10101010 // 4'ha and 4'd10 are both 4'b1010 in binary
向量拼接时,每个信号都需要有明确的位宽,这样拼接后的信号才会有明确的位宽。例如,{1,2,3}就是非法的,因为无法确定各信号的位宽,语法检查时会报错。
向量拼接算子既可以用于赋值语句的左侧,也可用于右侧,如下所示:

 input [15:0] in;
 output [23:0] out;
 assign {out[7:0], out[15:8]} = in;
 assign out[15:0] = {in[7:0], in[15:8]};
 assign out = {in[7:0], in[15:8]};  

复制算子

复制算子是拼接算子的一种特殊情况,如a={b,b,b,b,b,b}便可以写成a={6{b}}的形式。复制算子的格式为:{num{vector}},其中num必须为常量。如下所示:

{5{1'b1}} // 5'b11111 (or 5'd31 or 5'h1f)
{2{a,b,c}} // The same as {a,b,c,a,b,c}
{3'd5, {2{3'd6}}} // 9'b101_110_110

parameter

定义常量的关键字。它允许你在模块中定义一些固定的值,这些值可以在模块实例化时进行参数化,从而使模块更加灵活和可重用。

case/casez

casez的用途:它将值为z的位在比较中视为无关紧要。

//四输入优先编码器
always @(*) begin
    casez (in[3:0])
        4'bzzz1: out = 0;   // in[3:1] can be anything
        4'bzz1z: out = 1;
        4'bz1zz: out = 2;
        4'b1zzz: out = 3;
        default: out = 0;
    endcase
end

标签:语句,always,verilog,信号,out,assign,赋值
From: https://www.cnblogs.com/r0xy/p/18646009

相关文章

  • 基于FPGA的信号发生器verilog实现,可以输出方波,脉冲波,m序列以及正弦波,可调整输出信
    1.算法运行效果图预览(完整程序运行后无水印) 输出方波   输出脉冲波 输出m随机序列   输出正弦波   2.算法运行软件版本vivado2019.2 3.部分核心程序(完整版代码包含详细中文注释和操作步骤视频)//themoduleofjuxinsignalsignal_juxs......
  • 使用verilog生成各种CRC校验码
    一、功能介绍在FPGA进行各种接口通信时,经常会出现对方发来的数据带有CRC校验码,如CRC5、CRC8、CRC16、CRC32等,为了适应不同的情况,我们使用Verilog实现了一个比较通用的CRC计算模块,可生成CRC5/CRC8/CRC16/CRC32等各种宽度的CRC校验码,满足不同场景下的CRC校验需求。二、模块调用示......
  • 基于FPGA的数字电子秤设计(verilog)
    目录一、功能描述二、顶层设计分析2.1I2c_ctrl模块2.2PCF8591_ad模块 2.3v_weigh电压转质量模块2.4weighing_pre去皮模块2.5mcx计价模块2.6money价格输出模块2.7chose数码管选择显示模块2.8sign_give信号提供模块2.9buffer报警模块2.10顶层设计......
  • HDLBits-Verilog:Clock
    Youareprovidedamodulewiththefollowingdeclaration:moduledut(inputclk);Writeatestbenchthatcreatesoneinstanceofmoduledut(withanyinstancename),andcreateaclocksignaltodrivethemodule'sclkinput.Theclockhasaperi......
  • 【Verilog HDL】如何正确地进行移位操作?逻辑移位、算数移位
    【VerilogHDL】如何正确地进行移位操作?逻辑移位、算数移位为什么要移位操作移位操作逼近常数乘除法如何正确移位为什么要移位操作在FPGA中,数据的存储、逻辑运算、算数运算等都是以二进制的形式完成的,这就表明移位操作所需要的时间和占用的资源会非常少。举例:移......
  • 基于CPLD/FPGA的呼吸灯效果实现(附全部verilog源码)
    一、功能介绍此设计可以让你的FPGA板子上那颗LED具有呼吸效果,像智能手机上的呼吸灯一样。以下源码已上板验证通过,大家可直接使用。二、呼吸灯Verilog源码ps1.带★号处可根据需要进行修改.ps2.有需要的话可自行添加rst复位信号. /**************************************......
  • Verilog概述
    Verilog概述        VerilogHDL是在用途最广泛的C语言的基础上发展起来的一种硬件描述语言,具有灵活性高、易学易用等特点。VerilogHDL能在短时间内学习和掌握,目前已经在FPGA开发/IC设计领域占据绝对的低位。1、Verilog简介        VerilogHDL是一种硬件......
  • 使用Verilog设计分频模块(2Hz)
         在数字电路设计中,分频器是一种常见的电路,用于将一个高频的时钟信号分频到一个较低频率的时钟信号。本次将通过一个实际的例子,讲解如何使用Verilog语言设计一个分频器,将系统时钟信号分频到2Hz。        在数字电路系统的设计中,分频器是一种应用十分广泛......
  • 理解 Verilog HDL 的抽象层次
    VerilogHDL组合逻辑的编码可以从三个不同抽象层实现,这些抽象层是描述同一种硬件的不同方式。从具体到抽象的程度,可以分为gate、dataflow、behavior三种,其中gate级描述了硬件实际搭建的过程,dataflow级描述实际的逻辑门控数据的流动方式,behavior描述的是电路实际行为方式。可......
  • FPGA Verilog HDL代码如何debug?
    Q:Verilog代码如何debug?最近学习fpga,写了不少verilog,开始思考如何debug的问题!c语言是顺序执行,而verilog是并行执行,想请教如何debug自己的verilog代码,我以前一直都是对照着modelsim上的方针波形来看看哪里有逻辑错误!A:以下是一些常见的Verilog代码调试方法:1.仿真工具:正如......