FPGA——Verilog基础语法

本文详细介绍了Verilog语言的基础知识,包括模块的命名和端口信号声明,assign语句在组合逻辑中的应用,各种运算符的使用,如算术、等价和移位运算符,以及always语句块在时序逻辑中的作用。此外,还讲解了底层模块的调用方法,包括顺序法和命名法。这些内容是理解FPGA设计和Verilog编程的基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Verilog模块结构

在这里插入图片描述

  • 一般端口列表与端口信号说明写到一起,即模块名(端口信号说明);

1.1 模块名

  • 模块名是指电路的名字,由用户指定,需要与文件名一致(特别是在
    Quartus II软件中调试时);

1.2 端口信号

  • 端口信号声明是要说明端口信号的输入输出属性、信号的数据类型,以及信号的位宽;输入输出属性有input,output,inout三种,信号的数据类型常用的有wire和reg两种;信号的位宽用[n1:n2]表示;同一类信号之间用逗号隔开;
  • 例:
module full_adder (
input         		 cin,
input  [3:0]   		 a,
input  [3:0]   		 b,

output				 cout,
output  reg [3:0]    s
);
  • 位宽如果不做说明的话,默认是1位;
    数据类型不做说明的话,默认是wire型的。

二、assign语句

assign语句称作连续赋值语句
基本格式:

assign 赋值目标 = 表达式;
  • 之所以称为连续赋值语句是指其总是处于激活状态,只要表达式中的操作数有变化,立即进行计算和赋值。(与连续赋值语句对应的另一种语句称为过程赋值语句)
  • 赋值目标必须是wire型的,wire表示电路间的连线
  • 一般在组合逻辑中使用

三、运算符

(这里只给出一些不常见的)

  1. 算术运算符
    ** 求幂
  2. 等价运算符
    == 等于
    != 不等于
    === case等于
    !== case不等于
  • 例:
    Y=(1’b1 ==1’bx); 结果为x
    Y=(1’bx ==1’bx); 结果为x
    Y=(1’b1 ===1’bx); 结果为0
    Y=(1’bx ===1’bx); 结果为1
  • case等和case不等的结果只能是1或0,对于x、z认为是确定的值,参
    加比较;
  1. 移位运算符
    >> 右移
    >>> 算数右移
  • 例:
    Y= 4’b1001 >> 1; 结果为0100
    Y= 4’sb1001 >>> 1; 结果为1100
  1. 拼接运复制算符
    {} 拼接
    {{}} 复制拼接
  • 例:
    Y= {4’b1001, 2’b11}; 结果为100111
    Y= {4{2’b01}}; 结果为01010101
    Y= {{4{2’b01}}, 2’b11};

四、always语句块

always语句块又称过程块,过程块中的赋值语句称为过程赋值语句
基本格式:

always @(敏感信号条件表)
	各类顺序语句;
  • 该语句块不是总处于激活状态,当满足激活条件时才能被执行,否则被挂起,挂起时即使操作数有变化,也不执行赋值,赋值目标值保持不变
  • 赋值目标必须是reg型的
  • 一般在时序逻辑中使用

激活条件:敏感信号条件表决定,当敏感条件满足时,过程块被激活
敏感条件:一种是边沿敏感(posedge上升沿/negedge下降沿),适用于时序逻辑;一种是电平敏感,适用于组合逻辑

关于阻塞赋值与非阻塞赋值
设计组合电路时常用阻塞赋值
设计时序电路时常用非阻塞赋值

五、底层模块的调用

底层模块是要在顶层模块中调用的
底层模块调用格式:

底层模块名 例化名 (端口映射);
  • 端口调用有两种方法
  • 顺序法
DFF dff1(
clk,
d1,
q1
);
  • 命名法
DFF dff1(
.CLK	(clk),
.D		(d1),
.Q		(q1)
);
Quartus II是 Altera 公司的一款 FPGA 软件开发工具套件,它包含了一个名为 "Altera System Designer" 的图形用户界面以及用于高级综合、布局和布线的命令行工具 "quartus.sh" 或 "quartus.cmd"。其中,`always @(posedge clk)` 是 Verilog 或 VHDL 中的一种同步时序逻辑描述符,表示某个任务在时钟信号上升沿发生时执行。 `always @(posedge clk)` 通常用于编写状态机(State Machine)或者触发器,这里的 `clk` 表示系统时钟输入,`posedge` 表示只有当时钟从低电平变为高电平时(上升沿),该任务才会被执行一次。这是一种典型的事件触发行为,适用于需要对系统时钟周期精确响应的情况。 使用方法步骤大致如下: 1. **声明变量**:首先,在 `always` 块中声明需要处理的信号,如时钟 `clk` 和触发条件。 ```verilog reg [7:0] counter; input wire clk; ``` 2. **编写过程**:接着编写 `always @(posedge clk)` 的主体部分,定义任务逻辑。 ```verilog always @(posedge clk) begin if (counter == 16'hFF) begin // 当计数满时执行某些操作 counter <= 0; // 将计数器清零 else begin counter <= counter + 1; // 普通计数 end end ``` 3. **连接硬件**:最后,在设计文件中将时钟和其他信号连接到相应的模块上,并配置好编译流程。 在实际使用时,记得要遵循Verilog或VHDL的设计规则,确保时钟管理得当,并注意同步和异步电路的区别。如果你有更具体的问题,例如遇到语法错误或者设计问题,可以提问相关的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值