02-初识Verilog
1.开发环境搭建
需要使用的软件:
- QuartusII
- ModelSim
- Visio
- Notepad++
2.初识Verilog
2.1 Verilog HDL简介
- Verilog HDL是一种硬件描述语言,以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图\逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能
- Verilog语法自由,易学易用,适用于算法级,门级设计,代码简介,发展较快
- Verilog从C语言发展而来的
2.2 逻辑值
- 0 -- 逻辑低电平,条件为假
- 1 -- 逻辑高电平,条件为真
- z -- 高阻态,无驱动
- x -- 未知逻辑电平
- 实际电路中存在0,1,z,亚稳态
2.3 关键字
module example(
input wire sys_rst_n,//输入信号
inout wire sda,//输入输出信号,基本不用
output wire po_flag // 输出信号
);
// 只有输入信号是不能直接得到输出信号的
// 需要通过一些数据和参数对输入信号进行处理,得到输出信号
// 一般需要对输入信号进行处理之后得到输出信号
// 线网型变量 -- wire可以被看作是物理连接 -- 被综合成物理连线
wire [0:0] flag;
// 寄存器型变量 -- 具有对某一时间点的状态进行保持的功能
// 可综合电路中被综合成寄存器
reg [7:0] cnt;
// 参数的定义
// parameter 可以在顶层模块通过实例化对参数进行修改
parameter CNT_MAX = 100;
//localparam -- 只用在模块内部,不能在实例化的时候进行修改
localparam CNT_MAX = 100;
// 模块的实例化
example
#(
.CNT_MAX (8'd100) // 实例化时参数可以修改
)
example_inst
(
.sys_clk (sys_clk),
.sys_rst_n (sys_rst_n),
.po_flag (po_flag)
);
/*
常量
表示方法: [换算为二进制数之后的位宽]'[进制符号][与数值对应的进制数]
8'd171
d -- 十进制
b -- 二进制
h -- 十六进制
不写位宽 -- verilog会自动进行匹配
总位宽大于实际位宽,自动补0,总位宽小于实际位宽,则自动截断左边超出的位数
d'7 8'd7 -- 8'b0000_0111 前面补5个0
2'd7 换算位二进制是 2'b11 (7换成二进制是111),总长度位2位,所以截掉左侧的部分
直接写参数 100 ,表示位宽为32bit的十进制数100
*/
// 赋值方式
// 阻塞赋值 =
// 阻塞赋值可以看作是顺序执行,每条语句执行完成之后才能执行下一条语句
a = 1;
b = 2;
c = 3;
begin
a = b;
c = a;
end
a = 2;
b = 2;
c = 2;
// 非阻塞赋值 <= 并行执行
a = 1;
b = 2;
c = 3;
begin
a <= b; // 同一时刻,这两条语句是同时执行的
c <= a;
end
a = 2;
b = 2;
c = 1;
// always语句
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
cnt <= 8'b0; // 进行寄存器复位
else if (cnt == CNT_MAX) // 寄存器中的值记到最大的时候,维持最大值
cnt <= CNT_MAX;
else
cnt <= cnt + 8'd1; // 每个周期都加1
// assign语句
assign po_flag = (cnt == CNT_MAX) ? 1'b1 : 1'b0;
endmoudle
2.4 算术运算符
+
-
* -- 一般不用
/ -- 一般不用
% -- 求余数,两边都为整型数据
2.5 归约运算符\按位运算符
- & -- 既可以作为单目运算符又可以作为双目运算符
// & 作为单目运算符,&m,将m的所有bit相与,得到结果是1bit
4'b1111 = 1&1&1&1 = 1'b1
4'b1101 = 1&1&0&1 = 1'b0
// & 作为双目运算符表示按位与,m&n,是将m的每个bit与n的每个bit相与,在运算的时候保证m和n的bit数相等,最后结果位数和m(n)的bit数相等
4'b1010&4'b0101 = 4'b0000
- &,^,^,|,~| -- 这些运算符都有相同的看法
2.6 逻辑运算符
- &&/||/! -- 与或非三种逻辑运算,返回值为0或者是1
- 逻辑运算符两边非0位真,0为假
a = 4'ha
b = 4'd0
c = a && b // c的值为0
2.7 关系运算符
a < b
a > b
a <= b
a >= b
2.8 移位运算符
- 移位运算符是二元运算符,<<和>>,将运算符左边的数左移或者是右移指定的位数,用0来补充空闲位
b <= a << 1; // a的每一位都左移一位,结果赋值给b
b <= a >> 1; // a的没一位都右移一位,结果赋值给b
- 在应用移位运算符的时候一定要注意他的特性:就是空闲位使用0来补充,也就是说,一个二进制数不管原来的数值是多少,只要一直移位,最终都会变为0
4'b1000 >> 3; // 4'b0001
4'b1000 >> 4; // 4'b0000
- 移位运算符可以代替乘法和除法,左移一位可以看成是乘2,右移一位可以看成是除2,但是要注意位拓展
2.9 拼接运算符
- {,} -- 位拼接运算符
a = 8'b1011_1111;
b = 3'b011;
c = 5'b11011;
{a,b,c} ; // 拼接成16bit
2.10 三元运算符
[表达式1]?表达式2:表达式3
a = 6;
b = 7;
c = (a>b)?a:b;
2.11 优先级
- 一元运算符>二元运算符>三元运算符
- != > 按位运算 > && > || > 条件运算
- 归约运算符 > 算术运算符 > 移位运算符 > 关系运算符 > == 和 !=
- 使用()提升优先级
2.12 if-else语句
if(表达式) // 这种写法在always语句块产生组合逻辑的时候中会产生latch,不推荐使用
语句块;
if(表达式)
语句块1;
else if(表达式2)
语句块2;
....
else
语句; // 这种是最常用的写法
2.12 case语句
switch(表达式)
case value1 : 语句1;
case value2 : 语句2;
....
default: 语句;
2.13 系统函数
`timescale 1ns/1ns // 时间尺度预编译指令 时间单位/时间精度
时间单位和时间精度有由1,10及100以及s,ms,ns,us,ps,fs组成
时间单位:定义仿真过程中所有与时间相关量的单位
仿真中使用#数字表示延迟相应的时间单位的时间,例如#10表示延时10个时间单位,即10ns
时间精度:决定时间相关量的精度及仿真显示的最小单位
`timescale 1ns/10ps // 精度0.01, #10.11 表示延迟10110ps
`timescale 100ps/1ns // 错误,时间单位不能比时间精度小
// 主要的函数,在支持verilog语法的编译器中都会显示为高亮的关键字
$display //打印信息,自动换行
$write //打印信息
$strobe //打印信息,自动换行,最后执行
$monitor //检测变量
$stop //暂停仿真
$finish //结束仿真
$time //时间函数
$random //随机函数
$readmemb //读取文件的函数
$display()
$display(); // 输出,打印信息
$display("%b+%b = %d",a,b,c);
// %d %D -- 十进制
// %o %O -- 八进制
// %b %B -- 二进制
// %d %D -- 十六进制
// 不指定进制,默认为十进制数
`timescale 1ns/1ns
module tb_test();
reg [3:0] a;
reg [3:0] b;
reg [3:0] c;
// initial只在仿真中使用,是不可综合的
// 仿真开始,只执行一次
initial begin
$display("Hello");
$display("EmbedFire");
a = 4'd5;
b = 4'd6;
c = a + b;
#100;
$display("%b + %b = %d",a,b,c);
end
endmodule
result:
Hello
EmbedFire
010 + 0110 = 11
$write()
- write() -- 输出打印信息 -- 函数不会自动进行换行
`timescale 1ns/1ns
module tb_test();
reg [3:0] a;
reg [3:0] b;
reg [3:0] c;
// initial只在仿真中使用,是不可综合的
// 仿真开始,只执行一次
initial begin
$write("Hello");
$write("EmbedFire");
a = 4'd5;
b = 4'd6;
c = a + b;
#100;
$write("%b + %b = %d",a,b,c);
end
endmodule
$strobe()
- 输出打印函数 -- 在最后进行执行
`timescale 1ns/1ns
module tb_test();
reg [3:0] a;
reg [3:0] b;
reg [3:0] c;
// initial只在仿真中使用,是不可综合的
// 仿真开始,只执行一次
initial begin
$strobe("strobe:Hello"); // 写在最前面,但是执行在最后
a = 4'd5;
$display("EmbedFire");
$display("display:%b + %b = %d",a,b,c); // 在执行这条语句的时候b,c都没有进行赋值
// 所以b,c未知的x
b = 4'd6;
c = a + b;
#100;
end
endmodule
$monitor()
- 检测变量,只要打印的变量发生了变化,就会执行一次
`timescale 1ns/1ns
module tb_test();
reg [3:0] a;
reg [3:0] b;
reg [3:0] c;
initial begin
a = 4'd5;
#100;
b = 4'd6;
#100;
c = a + b;
end
initial begin
$monitor("%b + %b = %d",a,b,c);
end
endmodule
$stop
- 暂停执行仿真
`timescale 1ns/1ns
module tb_test();
initial begin
$display("hello");
$display("EmbedFire");
#100;
$display("Stop Simulation");
$stop;
#100;
$display("Finish Simulation");
$finish; // 结束仿真
end
endmodule
$time
`timescale 1ns/1ns
module tb_test();
reg [3:0] a;
always #10 a = $random;
initial $monitor("a = %d @time %d",a,$time);
endmodule
$readmemb 和 $readmemh
- $readmemb -- 用于读取二进制文件函数
- $readmemh -- 用于读取十六进制文件函数
$readmemb("数据文件名",存储器名);
$readmemh("数据文件名",存储器名);
`timescale 1ns/1ns
module tb_test();
integer i;
reg [7:0] a [20:0]; // a 为宽度为8bit,深度为21bit的存储器
initial begin
$readmemb("EmbedFire.txt",a);
for(i = 0;i<=20;i=i+1) begin
#10;
$write("%s",a[i]); // Welcome to EmbedFire!
end
end
endmodule
读取的文件

02-初识Verilog的更多相关文章
- 前端知识(一)02 初识 Node.js-谷粒学院
目录 初识Node.js 一.Node.js的概念 1.JavaScript引擎 2.什么是Node.js 3.Node.js有什么用 二.BFF 1.BFF 解决什么问题 2.BFF是什么 三.安装 ...
- SpringBoot 02: 初识SpringBoot
1. SpringBoot 产生原因 spring, springmvc框架使用上的一些缺点: 需要使用的大量的配置文件 还需要配置各种对象 需要把使用的对象放入到spring容器中才能使用对象 需要 ...
- 8.3 mysql 表操作
库操作 一 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等 performance_sch ...
- 081 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 06 new关键字
081 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 06 new关键字 本文知识点:new关键字 说明:因为时间紧张,本人写博客过程中只是 ...
- 080 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 05 单一职责原则
080 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 05 单一职责原则 本文知识点:单一职责原则 说明:因为时间紧张,本人写博客过程中只是 ...
- 079 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 04 实例化对象
079 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 04 实例化对象 本文知识点:实例化对象 说明:因为时间紧张,本人写博客过程中只是对知 ...
- 078 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 03 创建类
078 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 03 创建类 本文知识点:创建类 说明:因为时间紧张,本人写博客过程中只是对知识点的关 ...
- 077 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 02 类和对象
077 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 02 类和对象 本文知识点:类和对象 说明:因为时间紧张,本人写博客过程中只是对知识点 ...
- 076 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 01 Java面向对象导学
076 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 01 Java面向对象导学 本文知识点:Java面向对象导学 说明:因为时间紧张,本人 ...
- 002 01 Android 零基础入门 01 Java基础语法 01 Java初识 02 Java简介
002 01 Android 零基础入门 01 Java基础语法 01 Java初识 02 Java简介 学习Java的基础语法 Java是一门编程语言,学习的逻辑其实和现实世界的语言是一样的,需要了 ...
随机推荐
- 11.3 shtctl的指定省略(harib08c)
ps:能力有限,若有错误及纰漏欢迎指正.交流 11.3 shtctl的指定省略(harib08c) 对bootpack.h做了如下改动 struct SHEET { unsigned char *bu ...
- 原来还能这样看Java线程的状态及转换
作者:小牛呼噜噜 | https://xiaoniuhululu.com 计算机内功.JAVA底层.面试.职业成长相关资料等更多精彩文章在公众号「小牛呼噜噜」 大家好,我是呼噜噜,最近一直在梳理Jav ...
- 保持唯一性,请停止使用【python3 内置hash() 函数】
问题: 如图,用hash() 筛重时竟然出现了重复. 如下图: hash字符串时,同一窗口的是一致的,不同窗口结果竟然不同. 原因: python的字符串hash算法并不是直接遍历字符串每个字符去计算 ...
- ACM-刷题记录-14届NEFU校赛
P2031凯撒密码 #include<bits/stdc++.h> using namespace std; int main(){ string s; int d; while(cin& ...
- StampedLock:JDK1.8中新增,比ReadWriteLock还快的锁
摘要:StampedLock是一种在读取共享变量的过程中,允许后面的一个线程获取写锁对共享变量进行写操作,使用乐观读避免数据不一致的问题,并且在读多写少的高并发环境下,比ReadWriteLock更快 ...
- [数据库]MYSQL之存储过程
一 存储过程的特点 MySQL 5.0 版本开始支持存储过程 1.1 定义 存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象. 存储过程是为了 ...
- 教程 - 在 Vue3+Ts 中引入 CesiumJS 的最佳实践@2023
目录 1. 本篇适用范围与目的 1.1. 适用范围 1.2. 目的 2. 牛刀小试 - 先看到地球 2.1. 创建 Vue3 - TypeScript 工程并安装 cesium 2.2. 清理不必要的 ...
- 1.封装PageHelper实现分页
前言 这几天想着动手将一些技术融合到项目中,昨天思考了会儿,想起了我与亲戚的对话:我说:"我想将若依项目完整的实现一遍",亲戚给我反馈到"你没必要完整复现若依项目,而且你 ...
- 好奇心驱使下试验了 chatGPT 的 js 代码的能力
手边的项目中有个函数,主要实现图片分片裁剪功能.可以优化一下. 也想看看 chatGPT 的代码理解能力,优化能力,实现能力,用例能力. 于是有了这篇文章. 实验结果总结: chatGPT 确实强大, ...
- Java:如何加密或解密PDF文档?
在工作中,我们会将重要的文档进行加密,并且设置用户的访问权限,其他外部人员均无法打开,只有获取该权限的用户才有资格打开文档.此外,限制用户的使用权限,极大程度上阻止了那些有意要篡改.拷贝其中内容的人, ...