【FPGA教程1】Verilog基础语法

Verilog基础语法

  • 1. 常用关键字/保留字
    • 模块 module endmodule
    • 输入输出信号 input output inout
    • 变量 wire reg
    • 参数 parameter localparam
    • 常数
    • 赋值
    • always
    • assign
  • 运算符
    • 归约运算符、按位运算符
    • 逻辑运算符
    • 关系运算符
    • 移位运算符
    • 位拼接运算符
    • 条件运算符
    • 优先级
  • 分支控制语句
    • if-else
    • case
  • 系统函数

1. 常用关键字/保留字

.main文件速览

module example //模块开始 模块名
{input wire sys_clk   , //输入信号input wire sys_rst_n , //输入信号inout wire sda       , //输入输出信号output wire po_flag    //输出信号
}//线网型变量
wire [0:0] flag ;//寄存器型变量
reg [7:0] cnt;//参数
parameter CNT_MAX = 100;
localparam CNT_MAX = 100;//模块实例化
example
#(.CNT_MAX  (8'd100) //实例化时参数可修改
)//always
always (posedge sys_clk or negedge sys_rst_n)if(sys_res_n == 1'b0)cnt <= 8'd0;else if (cnt == CNT_MAX)cnt <= CNT_MAX;else cnt <= cnt + 8'd1;//assign
assign po_flag = (cnt == CNT_MAX) ? 1'b1 : 1'b0;endmodule

模块 module endmodule

  1. module表示模块的开始,模块有开始就有结束。
  2. endmodule表示模块的结束。
  3. 模块开始后需要写入模块名,模块名一般与.main文件一致

输入输出信号 input output inout

  1. 输入信号:input
  2. 输出信号:output
  3. 既可以做输入信号也可以做输出信号:inout

变量 wire reg

输入信号需要不能直接变成输出数据,需要经过变量之间的操作修改。

  1. 线网型变量
    1. wire申明
    2. 可以看成实际的连接,在物理实验中会看成一条真实的连线
  2. 寄存器型变量
    1. reg申明
    2. 具有对某一数据保留的功能
    3. 会被映射成为一个真实的物理寄存器

参数 parameter localparam

有两个关键字可以用来定义参数。

  1. parameter
    可以在顶层文件通过实例化对此功能模块中的参数进行修改
  2. localparam
    只能在模块内部使用,不能实例化。

常数

  1. 使用基数表示法
  2. 格式 :[换算为二进制后位宽的总长度]['][数值进制符号][与数值进制符号对应的数值]eg. 8'd171 //位宽为8bit,十进制的171
    1. [数值进制符号] :[h]十六进制、[o]八进制、[b]二进制
    8'hab //8bit的十六进制数ab
    8'o253 //8bit的八进制数253
    8'b1010_1011 //8bit的二进制数1010_1011,'-'增强可读性
    
    1. [换算为二进制后的位宽总长度]:可有可无,verilog会自动匹配合适的位宽。当总位宽大于实际位宽,自动在左边补0;总位宽小于实际位宽,自动截断左边超出的位数。
    'd7与 8'd7:表示相同数值
    8'd7 换算为二进制为8'b0000_0111,前补50;
    2'd7 换算为二进制为2'b11,超过2位宽的部分被截断
    如果直接写参数,例如100,表示位宽32bit的十进制数100
    

赋值

  1. 阻塞赋值 = //串行
a = 1;
b = 2;
c = 3;
begin a = b;c = a;
end

因为是阻塞串行执行,最终得到的结果为

a = 2;
b = 2;
c = 2;
  1. 非阻塞赋值 <=//并行
a = 1;
b = 2;
c = 3;
begin a <= b;c <= a;
end

因为是并行执行,a、c被赋值是同时执行的,最终得到的结果为

a = 2;
b = 2;
c = 1;

always

always (posedge sys_clk or negedge sys_rst_n)if(sys_res_n == 1'b0) //当复位信号有效时cnt <= 8'd0; //cnt初值设置为0else if (cnt == CNT_MAX) //如果计数到最大值cnt <= CNT_MAX; //cnt保持在最大值else cnt <= cnt + 8'd1;//否则每一个时钟周期cnt++

assign

assign po_flag = (cnt == CNT_MAX) ? 1'b1 : 1'b0;
//如果满足括号内条件,则将1'b1赋值给po_flag,反之将1'b0赋值给po_flag;

运算符

归约运算符、按位运算符

以’'&"为例:

  1. 作为一元运算符
    表示归约&m表示将m中所有比特相与,最终的结果为1bit。
    &4'b1111 = 1&1&1&1 = 1'b1
    &4'b1101 = 1&1&0&1 = 1'b0
    
  2. 作为二元运算符
    表示按位与,m&n将m的每个比特与n的相应比特相与,运算的时候需要保证m和n的比特数相等,最后的结果和m(n)的比特数相同。
    4'b1010 & 4'b0101 = 4'b0000
    4'b1101 & 4'b1111 = 4'b1101
    

逻辑运算符

"&&“逻辑与、”||“逻辑或、”==“逻辑相等、”!="逻辑不等

关系运算符

<、>、<=、>=,一般用于条件判断语句

移位运算符

  1. 左移"<<",将运算符左边的操作数左移指定的位数,用0补充空闲位。
    b <= a<<1 a左移1位,结果赋值给b
  2. 右移">>",将运算符右边的操作数右移指定的位数,用0补充空闲位。
    b <= a>>2 a右移2位,结果赋值给b
  3. 注意:因为会用0填充,一个二进制数一直移位最终全部会变成0
  4. 可以代替乘除法使用,<<1看成*2,>>1 看成/2,但需要注意位宽的扩展

位拼接运算符

格式:{ ,}拼接不同的数据之间用"," 隔开。bit
eg.将8bit的a、3bit的b、5bit的c 按顺序拼接成一个16bit的d d = { a, b, c} ;

条件运算符

  1. ? :是一个三元运算符,格式:表达式1 ? 表达式2 : 表达式3
  2. 执行过程:if(表达式1) 表达式2作为条件表达式的值,else 表达式3作为条件表达式的值。
    eg. a = 6, b = 7, c = ( a > b ) ? a : b 最终得到c=7

优先级

归约运算符 > 算术运算符 > 移位运算符 > 关系运算符 > “==” “!=” > 按位运算符 > “&&” “||” > 条件运算符
一元运算符 > 二元运算符 > 三元运算符

分支控制语句

if-else

与C++相同

case

case分支语句有"case"、“casez”、"casex"三种

case (<控制表达式>)<分支语句1> : 语句块1 ;……<分支语句n> : 语句块n ;default : 语句块 n+1 ;
endcase

注意与c语言不同的是,最后要有endcase

系统函数

Verilog中预先定义的任务和函数大多数只能在仿真中使用,方便进行验证
常用系统函数

$display //打印信息,自动换行
$write   //打印信息
$strobe //打印信息,自动换行,最后执行
$monitor  //监测变量
$stop     //暂停仿真
$finish	  //结束仿真
$time     //时间函数
$random   //随机函数
$readmemb //读文件函数
  1. 时间参数
    1. timescale 1ns/1ns //时间尺度预编译指令 时间单位/时间精度
    2. 时间单位和时间精度由值1、10、100和单位s、ms、us、ns、ps和fs组成。
    3. 时间单位:定义仿真过程中所有与时间相关量的单位
      仿真过程中使用"#数字" 表示延时相应时间单位的时间,例 #10 表示延时10个单位的时间,即10ns。
    4. 时间精度:决定时间相关量的精度及仿真显示的最小刻度
      timescale 1ns/10ps 精度0.01,#10.11 表示延时’10110ps’
    5. 错误写法timesace 100ps/1ns 单位时间不能比时间精度小

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/129975.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytorh模型训练、测试

目录 1 导入数据集 2 使用tensorboard展示经过各个层的图片数据 3 完整的模型训练测试流程 使用Gpu训练的两种方式 使用tensorboard显示模型 模型训练测试 L1Loss函数 保存未训练模型或者已经训练完的模型 4 加载训练好的模型进行测试 1 导入数据集 import torch from torch.u…

【3D图像分割】基于 Pytorch 的 VNet 3D 图像分割3(3D UNet 模型篇)

在本文中&#xff0c;主要是对3D UNet 进行一个学习和梳理。对于3D UNet 网上的资料和GitHub直接获取的代码很多&#xff0c;不需要自己从0开始。那么本文的目的是啥呢&#xff1f; 本文就是想拆解下其中的结构&#xff0c;看看对于一个3D的UNet&#xff0c;和2D的UNet&#x…

python实现MC协议(SLMP 3E帧)的TCP服务端(篇二)

python实现MC协议&#xff08;SLMP 3E帧&#xff09;的TCP服务端是一件稍微麻烦点的事情。它不像modbusTCP那样&#xff0c;可以使用现成的pymodbus模块去实现。但是&#xff0c;我们可以根据协议帧进行组包&#xff0c;自己去实现帧的格式&#xff0c;而这一切可以基于socket模…

Zephyr-7B-β :类GPT的高速推理LLM

Zephyr 是一系列语言模型&#xff0c;经过训练可以充当有用的助手。 Zephyr-7B-β 是该系列中的第二个模型&#xff0c;是 Mistralai/Mistral-7B-v0.1 的微调版本&#xff0c;使用直接偏好优化 (DPO) 在公开可用的合成数据集上进行训练 。 我们发现&#xff0c;删除这些数据集的…

系列五、映射文件xxxMapper.xml

一、概述 mapper映射文件是mybatis中最重要的部分&#xff0c;涉及到的细节也非常多。 1.1、parameterType 表示输入参数的类型。例如&#xff1a; <select id"getUserById" parameterType"integer" resultType"org.star.entity.model.UserDO&…

python自动化测试模板

1:准备html模版 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>接口自动化…

网络协议的基本概念

网络协议的基本概念 随处可见的协议 在计算机网络与信息通信领域里&#xff0c;人们经常提及“协议”一词。互联网中常用的具有代表性的协议有IP、TCP、HTTP等。 “计算机网络体系结构”将这些网络协议进行了系统归纳。TCP/IP就是IP、TCP、HTTP等协议的集合。现在&#xff0…

为什么路由器属于网络层

1. 路由器所属阶段 路由器属于 OSI 模型的网络层&#xff0c;因为它们负责根据网络层信息&#xff08;第 3 层&#xff09;做出路由决策。网络层是 OSI 模型中的第三层&#xff0c;主要负责将数据包从网络中的源路由到目的地。 Here’s a formal and precise explanation of …

DI93a HESG440355R3 通过其Achilles级认证提供网络安全

DI93a HESG440355R3 通过其Achilles级认证提供网络安全 施耐德电气宣布推出Modicon M580以太网PAC (ePAC)自动化控制器&#xff0c;该控制器采用开放式以太网标准&#xff0c;通过其Achilles级认证提供网络安全。M580 ePAC使工厂操作员能够设计、实施和运行一个积极利用开放网…

(免费领源码)java#springboot#mysql网上商城系统的设计与实现08789-计算机毕业设计项目选题推荐

摘 要 随着互联网趋势的到来&#xff0c;各行各业都在考虑利用互联网将自己推广出去&#xff0c;最好方式就是建立自己的互联网系统&#xff0c;并对其进行维护和管理。在现实运用中&#xff0c;应用软件的工作规则和开发步骤&#xff0c;采用Java技术建设网上商城系统。 本设…

GOM引擎搭建时需要注意哪些问题以及需要准备哪些东西

如何选择合适的gom引擎版本 首先&#xff0c;您需要了解自己的需求和预算。市面上的gom引擎版本琳琅满目&#xff0c;价格也各不相同。在选择版本时&#xff0c;建议您根据自己的实际情况进行选择&#xff0c;切勿盲目追求高级版本。同时&#xff0c;建议在购买前先查看该版本…

c#局部类

partial是局部类型的意思。允许我们将一个类、结构或接口分成几个部分&#xff0c;分别实现在几个不同的.cs文件中。C#编译器在编译的时候仍会将各个部分的局部类型合并成一个完整的类 使用事项 关键字partial是一个上下文关键字&#xff0c;只有和 class、struct、interface…

PCL点云处理(007)-Ransac

随机抽样一致性算法RANSAC(Random sample consensus)是一种迭代的方法来从一系列包含有离异值的数据中计算数学模型参数的方法。 RANSAC算法本质上由两步组成&#xff0c;不断进行循环&#xff1a; 从输入数据中随机选出能组成数学模型的最小数目的元素&#xff0c;使用这些元素…

SpringMVC与JavaConfig笔记整理

实战笔记 编写Mvc配置类Configuration EnableWebMvc ComponentScan("com.yicj.study.webmvc.controller") public class WebConfig { }编写App配置类Configuration ComponentScan("com.yicj.study.webmvc.service") public class AppConfig { }编写Java注…

Ubuntu上安装 Chrome 浏览器

1. 命令行下载安装包&#xff1a; wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb 2. 安装 sudo apt install ./google-chrome-stable_current_amd64.deb 之后即使有更新也不用重新手动下载安装了&#xff0c;因为安装包会在 源里添加相应…

【C++】红黑树模拟实现STL中的map与set

红黑树里面具体存的是什么类型的元素&#xff0c;是由模板参数 T 来决定&#xff1a; 如果 T 是 Key 那么就是 set。 如果 T 是 pair<const Key, V>&#xff0c;那么就是 map。 1、定义红黑树的节点结构 // 定义红黑颜色 enum Colour {RED,BLACK };template<class …

C/C++数据结构之时间复杂度和空间复杂度详细解析以及力扣刷题

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 1.前言 2.算法的…

智能井盖传感器推荐,万宾科技助力城市信息化建设

随着科技产品更新换代进程加快&#xff0c;人工智能在人们日常生活之中逐渐普及开来&#xff0c;深入人们生活的方方面面&#xff0c;影响城市基础设施建设工程。例如在大街小巷之中的井盖作为城市基础建设的一个重要部分&#xff0c;一旦出现松动倾斜或凸起等异常问题&#xf…

掌握Maven和SpringBoot的灵活性:定制化lib目录和依赖范围

前言 在开发基于Maven和SpringBoot的项目时&#xff0c;我们经常会使用第三方库来满足需求。然而&#xff0c;有时候我们需要更灵活地控制这些库的依赖范围和加载方式。本文将介绍如何使用Maven和SpringBoot实现定制化的lib目录和依赖范围。经过如下定制化后&#xff0c;打包执…

MySQL - Zero date value prohibited

问题: timestamp字段报Caused by: com.mysql.cj.exceptions.DataReadException: Zero date value prohibited 原因: timestamp字段存入了0值, 超出了最小值1900-01-01 00:00:00, 转Java对象的时候报错 解决: 1.修复或删除原数据 2. mysqlurl 中添加zeroDateTimeBehaviorconve…