FPGA学习笔记(2)——Verilog语法及ModelSim使用

1.1 语法

1、赋值语句 = 和 <=
= 为阻塞赋值,当该语句结束时,下一个语句才开始执行,串行执行
<= 为非阻塞幅值,该语句和整个语句块同时执行,并行执行

1.2 ModelSim使用

1、修改源文件路径:File -> Source Directory/Change Directory

2、查看窗口:View -> Transcript/Project/Library

3、新建工程:File->New->Project ,添加文件夹名称

4、添加源文件和TB文件:Project 右键-> Add to Project. Existing File

5、编译:Project 右键 -> Compile All
如果出现黄色三角形的警告,查看相关文件并修改,重新编译
双击红色的警告,可以看到.v文件哪里出现问题

6、仿真:Simulate -> Start Simulate -> Design -> work
- 选择TB文件,关闭Enable optimization

7、Libraries、SDF(标准延迟文件)

8、添加信号到波形图内:sim-Default 右键添加Add Wave
某些信号看不到(no data)就重新仿真,最好先添加信号,再进行仿真。
修改Run Length 到适合的时长(例如1us),run运行设置时长
左侧Restart,重置信号。

9、命令行操作:
.main clear 清空命令行
run 1us 波形运行1us

10、ctrl+A:全选信号
ctrl+G:信号排序

1.3 Verilog

1、逻辑值:

  • 0
  • 1
  • X(未知,可能是1/0)
  • Z(高阻态,外部没有激励信号,是一个悬空状态)

2、进制:二进制(d)、八进制(o)、十进制(d)和十六进制(h)

3、数值表示:[数据位宽]'[进制][数]
例子:1’b0 8’d255 16b’1001_1010_0000_1111(下划线不影响程序读取)

4、标识符:定义模块名、端口名、信号名
任意一组字母、数字、$符号和_(下划线)
标识符第一个字符必须是字母或下划线,区分大小写。
不建议大小写混合使用,普通信号建议全部小写,信号命名最好体现信号的含义,简洁清晰易懂
例子:sum、cpu_addr、clk_50、clk_cpu

5、数据类型:寄存器、线网、参数,前两个是真正在数字电路中起作用的
(1)寄存器类型:reg,默认初始值为X
例子:
reg [31:0] delay_cnt;
reg key_reg;
注:reg类型只能在always和initial语句中被幅值。
时序逻辑:always语句带有时钟信号,则该寄存器变量对应为触发器;
组合逻辑:always语句不带有时钟信号,则该寄存器变量对应为硬件连线;
(2)线网类型:表示结构实体之间的物理连线,此变量不能存储值,它的值由驱动它的元件所决定。
驱动线网类型变量的元件有门、连续幅值语句、assign。
如果没有驱动元件连接到线网上,线网为高阻态z。
例子:
wire key_flag;
(3)参数类型:常量,用parameter定义常量。
例子:
parameter H_SYNC = 11’d41; //行同步
parameter H_BACK = 11’b2; //行显示后沿
parameter H_DISP = 11’d480; //行有效数据
parameter H_FRONT = 11’d2; //行显示前沿
parameter H_TOTAL = 11’d525; //行扫描周期

参数型数据常用于定义状态机的状态、数据的位宽和延迟大小。
标识符、参数传递

6、运算符:算数运算符(+ - * / %)、关系运算符(> < >= <= == !=)、逻辑运算符(! && ||)、
条件运算符(? : ,例子:a?b:c,a为真,选择b,否则选择c)、位运算符(~ & | ^)、
移位运算符(<< >> ,例子:8’b11110000 >>2 = 2’b00111100,0填充)、拼接运算符({})
有优先级,用括号!

7、注释方式: // 和 /* */

8、关键字
变量名不能与关键字同名

9、框架:
(1)模块block(包括接口和逻辑功能)
例子:

module block(a,b,c,d);input a,b;output c,d;assign c = a | b;assign d = a & b;
endmodule

每个verilog程序包括:端口定义、IO说明、内部信号声明、功能定义。

注意:有可以综合的语句和不可综合的语句(仿真)

(2)可综合的语句:
assign、always、例化实例元件,这三种逻辑功能是并行的。
(2-1)在always块中,逻辑是顺序执行的。
而多个always块之间是并行的。
(2-2)模块调用:信号通过模块端口在模块之间传递。
例子:
文件seg_led_static_top.v:

module seg_led_static_top(input		sys_clk,input		sys_rst_n,output	[5:0]	sel,output	[7:0]	seg_led
);parameter	TIME_SHOW = 25'd25000_000;wire		add_flag;//模块调用1:time_count #(.MAX_NUM	(TIME_SHOW)		//参数传递) u_time_count(.clk		(sys_clk),.rst_n		(sys_rst_n),.flag		(add_flag));//模块调用2:必须按照模块定义顺序列写(不推荐)time_count #(.MAX_NUM	(TIME_SHOW)		//参数传递) u_time_count(sys_clk,sys_rst_n,add_flag);
endmodule

其他文件 time_cout.v:

module time_count(input		clk,input		rst_n,output	reg	flag
);parameter	MAX_NUM = 50000_00;
reg	[24:0]	cnt;

10、结构语句:
(1)initial:在模块中只执行一次。常用来写测试文件,产生仿真测试信号(激励信号)和对存储器赋初始值。
例子:

initial beginsys_clk		<= 1'b0;sys_rst_n 	<= 1'b0;touch_key 	<= 1'b0;#20 sys_rst_n <= 1'b0;
end

(2)always:不断重复活动,但是只有和一定的时间控制结合在一起才有作用。
例子:

always #10 sys_clk = ~sys_clk;

always的时间控制有:边沿触发,电平触发
可以是单个信号,也可以是多个信号(用or连接)
例子:

always @(posedge sys_clk or negedge sys_rst_n) begin		//敏感列表if (!sys_rst_n)counter <= 24'd0;else if(counter < 24'd1000_0000)counter <= counter + 1'b1;elsecounter <= 24'd0;
end

边沿触发(posedge,negedge)的always常常描述时序逻辑行为。使用非阻塞幅值<=
电平触达的always常常描述组合逻辑行为。使用阻塞幅值=
例子:

always @(a or b or c or d or e) beginout = a ?(b+c):(d + e);
end

可以用*代表所有变量,@(*)对后面语句块所有输入变量的变化都是敏感的!

always @(*) beginout = a ?(b+c):(d + e);
end

组合逻辑没有CLK信号,时序逻辑有CLK信号,具备记忆功能。
注意:
(1)不允许在多各always块中对同一个变量进行幅值
(2)在同一个always块中不要既用非阻塞幅值又用阻塞赋值

11、条件语句:
(1)if

if (a > b)out = data_1;

(2)if else

if (a > b)out = data_1;
elseout = data_2;

(3)if else嵌套:

if (fx1)out = data_1;
else if(fx2)out = data_2;
else if(fx3)out = data_3;
elseout = data_4;

(4)使用begin和end包含多个语句:

if (a) begin语句1;语句2;
end
else begin语句1;语句2;
end

判断表达式的值:若为0,x,z,按照假进行处理,若为1,按照真处理。

(5)case语句:
casez:比较时,不考虑表达式中的高阻态z。
casex:比较时,不考虑高阻态z和不定值x
例子:

case(num)4'h0	:	seg_led <= 8'b1111_0000;4'h1	:	seg_led <= 8'b0000_0000;default	:	seg_led <= 8'b1111_1111;
endcase

注意:num和n’hx必须位宽相等。

casex(sel)8'b1100_zzzz	:	语句1;8'b1100_xxzz	:	语句2;
endcase

1.4 状态机

例子:利用FPGA实现电子门锁。
序列检测器
1、状态机(FSM):在有限个状态之间按一定规律转换的时序电路

2、模型:
(1)mealy状态机:输出与输入信号和当前状态有关。
组合逻辑F->状态寄存器->组合逻辑G
(2)moore状态机:输出只与当前状态有关。

3、状态机设计:
(1)步骤:状态空间定义,状态跳转,下个状态判断,各个状态下的动作。
例子:

/*   part1:状态空间定义    */
//define state space
parameter	SLEEP	=	2'b00;
parameter	STUDY	=	2'b01;
parameter	EAT		=	2'b10;
parameter	AMUSE	=	2'b11;
//internal variable
reg	[1:0]	current_state;
reg	[1:0]	next_state;//独热码:每个状态只有一个寄存器置位,译码逻辑简单,生成的电路简单。
parameter	SLEEP	=	4'b0001;
parameter	STUDY	=	4'b0010;
parameter	EAT		=	4'b0100;
parameter	AMUSE	=	4'b1000;
//internal variable
reg	[3:0]	current_state;
reg	[3:0]	next_state;/*   part2:状态跳转   */
//transition
always @(posedge clk or negedge rst_n) begin		//敏感列表:时钟信号以及复位信号边沿的组合if(!rst_n)current_state <= SLEEP;elsecurrent_state <= next_state;				//使用非阻塞赋值
end/*   part3:下个状态判断(组合逻辑)   */
//next state decision
always @(current_state or input_signals) begincase (current_state)SLEEP	:beginif (clock_alarm)next_state = STUDY;elsenext_state = SLEEP;endSTUDY	:beginif (lunch_time)next_state = EAT;elsenext_state = STUDY;endEAT		:beginif (lunch_time)next_state = EAT;elsenext_state = STUDY;endAMUSE	:beginif (lunch_time)next_state = EAT;elsenext_state = STUDY;enddefault:beginif (lunch_time)next_state = EAT;elsenext_state = STUDY;endendcase
end

注意:
(1)组合逻辑使用阻塞赋值
(2)if/else要配对以免产生latch(锁存器),case的状态如果没有给完全,必须要给default,否则也会生成latch

/*   part4:各个状态下的动作(组合逻辑)   */
//action
wire read_book;
assign read_book = (current_state == STUDY) ? 1'b1 : 1'b0;always @(current_state) beginif(current_state == STUDY)read_book = 1'b1;elseread_book = 1'b0;
end

注意:组合逻辑使用阻塞赋值

一个三段式状态机例子:divider7_fsm.v
三段式可以在组合逻辑后再增加一级寄存器(时序逻辑,有clk信号输入)来实现时序逻辑输出:
(1)可以有效滤除组合逻辑输出的毛刺;
(2)可以有效地进行时序计算和约束;
(3)对总线形式的输出信号来说,容易使总线数据对齐,从而减小总线数据间的偏移,减小接收端数据采样出错的频率。

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

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

相关文章

[1702]java旅游资源网上填报系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java旅游资源网上填报系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql…

ES6入门知识

**************************************************************************************************************************************************************************** 0、ES6学习目标 【1】整体目标 ES6的模块化语法 *************************************…

模式识别作业:颜色算子的三种阈值分割算法

一、引言&#xff1a; 在图像处理中&#xff0c;我们往往需要提取图像的一些关键信息&#xff0c;比如本篇文章的内容——提取颜色&#xff0c;然而当我们需要提取某一种颜色时&#xff0c;无论图像余下的部分如何“丰富多彩”&#xff0c;他们都不再重要&#xff0c;需要被忽…

如何使用SSH密钥克隆仓库

1.创建SSH Key 在用户目录下查看有没有.ssh目录。如果有且该.ssh目录下有id_rsa&#xff08;私钥&#xff09;&#xff0c;和id_rse_pub(公钥)这俩文件&#xff0c;那么这一步就可以跳过。否则使用以下指令创建SSH Key ssh-keygen -t rsa -C "xxxqq.com" "xx…

8.k8s中网络资源service

目录 一、service资源概述 二、service资源类型 1.ClusterIP类型 2.service的nodeport类型 3.service的loadbalancer类型&#xff08;了解即可&#xff09; 4.service的externalname类型&#xff08;了解即可&#xff09; 三、nodeport的端口范围设置和svc的endpoint列表 1.修…

AJAX概述和基本使用

01 【AJAX概述和基本使用】 1.AJAX简介 AJAX 全称为Asynchronous JavaScript And XML&#xff0c;就是异步的JS 和XML 通过AJAX 可以在浏览器中向服务器发送异步请求&#xff0c;最大的优势&#xff1a;无刷新获取数据 AJAX 不是新的编程语言&#xff0c;而是一种将现有的标准…

刷代码随想录有感(53):合并二叉树

题干&#xff1a; 代码&#xff08;递归实现&#xff09;&#xff1a; TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {//前序好理解&#xff0c;直接将树覆盖到另一个上面if(root1 NULL)return root2;//当前遍历节点为空的话就让另一个的值覆盖过来if(root2 NUL…

对命令模式的理解

目录 一、场景1、文本编辑器并不是一个好的例子&#xff0c;设备控制器才是2、设备控制器的demo 二、不用命令模式1、代码2、问题 三、使用命令模式1、代码2、当需求变化时2.1 新增代码2.2 优点 四、进一步思考1、省略对Command的建模可以吗&#xff1f;2、命令模式的价值 一、…

GDPU unity游戏开发 碰撞器与触发器

砰砰叫&#xff0c;谁动了她的奶酪让你的小鹿乱撞了。基于此&#xff0c;亦即碰撞与触发的过程。 碰撞器与触发器的区别 通俗点讲&#xff0c;碰撞器检测碰撞&#xff0c;触发器检测触发&#xff0c;讲了跟没讲似的。碰撞器是用来检测碰撞事件的&#xff0c;在unity中&#xff…

gateway中对返回的数据进行处理

gateway中对返回的数据进行处理 背景1.项目层次 背景 最近公司有个需求是对返回数据进行处理&#xff0c;比如进行数据脱敏。最后在gateway中进行处理。 1.项目层次 根据项目的结构&#xff0c;原本在菜单功能处有对于权限设计的url判断&#xff0c;所以在url后面加了一个正…

CGAL 网格测地线距离计算

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 网格测地线距离是指在三维网格模型中计算两点之间的最短路径距离,考虑了网格的拓扑结构和几何形状。与传统的欧几里德距离不同,测地线距离考虑了网格的曲面形状,因此更适用于描述三维空间中的距离。 二、实现代码…

docker常用容器启动命令

docker常用容器启动命令 mysql启动redis启动nginx配置文件&启动 mysql启动 docker run -itd --name mysql-test --restartalways -p 3306:3306 -e MYSQL_ROOT_PASSWORD123456 mysqlredis启动 docker run -itd --name redis-test --restartalways -p 6379:6379 redisnginx…

蓝桥杯练习系统(算法训练)ALGO-949 勇士和地雷阵

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 勇士们不小心进入了敌人的地雷阵&#xff08;用n行n列的矩阵表示&#xff0c;*表示某个位置埋有地雷&#xff0c;-表示某个…

yolov5-pytorch-Ultralytics训练+预测+报错处理记录

一、前言 玩一段时间大模型&#xff0c;也该回归一下图像识别。本项目用于记录使用基于Ultralytics的yolov5进行目标检测测试。为什么用Ultralytics呢&#xff1f;答案有3 1、其良好的生态&#xff0c;方便我们部署到其它语言和设备上。因此本次测试结论&#xff1a;大坑没有&…

技术周总结 2024.04.29-05.05

一、python的数据表处理 """ 删除 Doris库中某些表中无效的数据 """ import mysql.connector import socket import socks import pandas as pd import pymysql from sqlalchemy import create_engine, text import csv from datetime import da…

UE5 蓝图入门

基础节点创建&#xff1a; 常量&#xff1a; 按住 1 &#xff0c;点击鼠标左键&#xff0c;创建常量 二维向量&#xff1a; 按住 2 &#xff0c;点击鼠标左键&#xff0c;创建二维向量 三维向量&#xff1a; 按住 3 &#xff0c;点击鼠标左键 乘法&#xff1a; 按住 m 键…

基于node.js+css+html+mysql博客系统

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、Php、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

【C++风云录】图形和动作捕捉库全面解析:从OpenPose到OpenCV

深入浅出&#xff1a;六大计算机视觉和动作捕捉库的教程和比较 前言 本文将为读者详细介绍六种在计算机视觉领域广泛使用的开源软件和SDK&#xff0c;包括OpenPose、Vicon SDK、Intel RealSense SDK、Microsoft Kinect SDK、PCL (Point Cloud Library)和OpenCV。我们会一一解…

Vue进阶之Vue项目实战(一)

Vue项目实战 项目搭建初始化eslint版本约束版本约束eslint配置 stylelintcspellcz-githusky给拦截举个例子 zx 项目搭建 node版本&#xff1a;20.11.1 pnpm版本&#xff1a;9.0.4 初始化 vue3最新的脚手架 pnpm create vite byelide-demo --template vue-ts pnpm i pnpm dev…

MIPS32 指令架构

指令格式 R 类型 说明&#xff1a; 用于寄存器和寄存器操作 参数说明: Op: 指令操作码Rs: 第一个源操作数寄存器号&#xff0c;参与运算使用Rd: 目的操作数寄存器号&#xff0c;保存结果使用Shamt: 位偏移量&#xff0c;仅在位移指令使用&#xff0c;在此直接置0Func: 指令函…