Verilog基础语法总结
去年小学期写的,push到博客上好了
Verilog 的基本声明类型
wire w1; // 线路类型
reg [-3:4] r1; // 八位寄存器
integer mem[0:2047]; // 2048 个整数的阵列
reg [31:0] cache[0:63]; // 32 位数据的64个存储单元
//通常称为内存或记忆体
//更多阵列类型的声明
reg [7:0] array [0:1023];
reg [7:0] array [0:1023][0:511];
module里的声明类型
parameter 参数声明
port 脚位声明
基本语法
`define 常数名 数字
//定义一个宏常量,引用方法是:`常数名
//其中数字的格式为:x’(b/h/d)x位数
//b是二进制,h是16进制,d是10进制
#10 <item>
//经过10个时延单位执行后面的程式
`timescale 1ns/10ns
//定义时延单位
`include”<name>.v”
//将工作目录下的该文件的内容扩充到本文件中
//注意是工作目录,include其他路径下的文件是不行的
module <模组名>(参数列表);
endmodule
//声明一个模块
assign
//主要用来描述组合逻辑
//与always语句块相比较不必强制使等号左边的数必须为寄存器类型
//等号左边可以是wire或reg或output
//两种 Assign :Blocking v.s. Nonblocking
//a = b ; // Blocking assignment : 执行顺序不一定,
//a <= b; // Nonblocking assignment : 所有可同时执行的东西都执行完一次后,才会前进到下//一个时间点。
Always
//声明一个语句块
//用法一 always #时延 语句
//用法二 always @(posedge clk)
//当clk信号处于上升沿的时候要执行的语句块
//这里posedge代表信号的上升沿
//negedge代表信号的下降沿
举例说明阻塞式赋值(Blocking)与非阻塞式(Non-Blocking)赋值的区别
下面是阻塞式赋值的例子
reg d1, d2, d3, d4;
always @(posedge clk) d2 = d1;
always @(posedge clk) d3 = d2;
always @(posedge clk) d4 = d3;
由于这是一门硬件描述语言,语句的声明顺序与执行顺序无关,这样的写法我们是无法得知
这三条语句的执行顺序的,所以,d2,d3,d4的结果都将是不固定的
下面是非阻塞式赋值的例子
reg d1, d2, d3, d4;
always @(posedge clk) d2 <= d1;
always @(posedge clk) d3 <= d2;
always @(posedge clk) d4 <= d3;
因为可以同时执行的事件都执行完一次之后才会执行下一时间点的事件,所以d2,d3,d4会得到上一轮的d1,d2,d3
下面仍然是一个阻塞式赋值的例子
a = 1;
b = a;
c = b;
执行结果相当于a=1,b=1,c=1;
下面是一个非阻塞式赋值的例子
a <= 1;
b <= a;
c <= b;
执行结果相当于a=1;b=上一轮a的值;c=上一轮b的值
//
initial语句块:常用于testbench实时赋值
initial
begin
// 程序
end
//当模拟一开始会被执行
//到end会结束
系统函数与常量
$readmemh("cpu0s.hex", m);
将对应的文件写到m这个阵列里面
$time是显示执行时间的常量,其单位是ns
$display(“printf的格式控制符”,输出参数列表);
$monitor的语法完全类似
verilog中所有变量都是全局变量,例如
module top;
integer myglobalvar;
endmodule
module any;
initial $display(top.myglobalvar);
Endmodule
关于模组内模块的合法性说明
module <module name> (<port list>);
<declares>
<module items>
endmodule
其中的 <module items> 可能是以下类型的语句:
1. initial
2. always
3. assign
4. module 实例
基本语句说明-分支语句
1.简易分支
f = sel ? a : b; // 右邊的任何改變都會引發左邊的重新計算
2.IF分支
if (s == 1'b0)
y = 0;
else
y = 1;
if (select == 1) y = a;
else y = b;
3.case分支
case ({a,b})
2'b00: t = 1;
2'b01: t = 2;
2'b10: t = 3;
2'b11: t = 4;
default: t = 0;
endcase
case (op)
2'b00: y = a + b;
2'b01: y = a - b;
2'b10: y = a ˆ b;
default: y = ’hxxxx;
endcase
4.casez : 将z当做无关项处理
casez (f)
2'b00: y=a+b;
2'b01: y=a-b;
2'b10: y=a&b;
2'b11: y=a^b;
default: y=0;
Endcase
语句说明-循环语句
1.for
for (i=0; i<16; i=i+1)
m[i] = i;
reg [3:0] i, output;
for ( i = 0 ; i <= 15 ; i = i + 1 ) begin
output = i;
#10;
End
2.while
i=0
while (i<16) begin
m[i] = i;
i = i + 1;
end
reg [3:0] i, output;
i = 0;
while (i <= 15) begin
output = i;
#10 i = i + 1;
end
运算式与反运算符
运算符:~代表取反位运算,!代表取非,^代表异或,+,-
合并运算:
reg [2:0] a;
reg [4:0] b;
{a, b} = 8'b10011110 // 此时会把100给a,111110给b
reg [15:0] c;
c = {a, b, {2{a}}, 2'b11} // 此时 c 会是 {a, b, a, a, 11} 衔接后的结果。
额外的语法说明:{a, 2{b,c}, 3{d}} 相当于 {a, b, c, b, c, d, d, d}。
最后:原则上一通电所有的module都将同时开始工作
Verilog基础语法总结的更多相关文章
- Verilog HDL基础语法讲解之模块代码基本结构
Verilog HDL基础语法讲解之模块代码基本结构 本章主要讲解Verilog基础语法的内容,文章以一个最简单的例子"二选一多路器"来引入一个最简单的Verilog设计文件的 ...
- 【第一季】CH04_FPGA设计Verilog基础(一)Enter a post title
[第一季]CH04_FPGA设计Verilog基础(一) 4.1 Verilog HDL 代码规范 u 项目构架设计 项目的构架用于团队的沟通,以及项目设计的全局把控 u 接口时序设计规范 模块和模块 ...
- Swift与C#的基础语法比较
背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...
- iOS-----正则表达式的基础语法
正则表达式简单语法总结 一.什么是正则表达式 从概念上来说,正则表达式也是一门小巧而精炼的语言,它可以用来简化检索特定的字符串,替换特定字符等功能,有许多开发语言工具,都内嵌支持正则表达式.那么一个正 ...
- python之最强王者(2)——python基础语法
背景介绍:由于本人一直做java开发,也是从txt开始写hello,world,使用javac命令编译,一直到使用myeclipse,其中的道理和辛酸都懂(请容许我擦干眼角的泪水),所以对于pytho ...
- emmet 系列(1)基础语法
emmet 系列(1)基础语法 emmet 是一个能显著提升开发html和css开发效率的web开发者工具 emmet基本上目前已知的编辑器都有相应的插件,各个编辑器的emmet插件的下载地址:点我下 ...
- Scala基础语法 (一)
如果你之前是一名 Java 程序员,并了解 Java 语言的基础知识,那么你能很快学会 Scala 的基础语法. Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ; 是可选的. 我 ...
- Java基础语法
java基础学习总结——基础语法1 一.标识符
- javascript中正则表达式的基础语法
× 目录 [1]定义 [2]特点 [3]元字符[4]转义字符[5]字符组[6]量词[7]括号[8]选择[9]断言[10]模式[11]优先级[12]局限性 前面的话 正则表达式在人们的印象中可能是一堆无 ...
随机推荐
- [Usaco2008 Mar]牛跑步
题目描述 BESSIE准备用从牛棚跑到池塘的方法来锻炼. 但是因为她懒,她只准备沿着下坡的路跑到池塘, 然后走回牛棚. BESSIE也不想跑得太远,所以她想走最短的路经. 农场上一共有M (1 < ...
- STM32驱动LCD实战
前段时间写了<STM32驱动LCD原理>和<STM32的FSMC外设简介>两篇文章,本文将对STM32驱动LCD进行实战应用.LCD是深圳市拓普微科技开发有限公司的LMT028 ...
- 使用 .NETCore自带框架快速实现依赖注入
Startup 在Startup的ConfigureServices()中配置DI的接口与其实现 public void ConfigureServices(IServiceCollection se ...
- [阿里DIEN] 深度兴趣进化网络源码分析 之 Keras版本
[阿里DIEN] 深度兴趣进化网络源码分析 之 Keras版本 目录 [阿里DIEN] 深度兴趣进化网络源码分析 之 Keras版本 0x00 摘要 0x01 背景 1.1 代码进化 1.2 Deep ...
- ovsdb-client命令
ovsdb-server 的命令行接口. 查看有哪些数据库: ovsdb-client list-dbs [server] 查看数据库 schema: ovsdb-client get-schema ...
- Linux性能监测(系统监测统计命令详解)
通过这个命令,可以最简便的看出系统当前基本状态信息,这里面最有用是负载指标,如果你还想查看当前系统的CPU/内存以及相关的进程状态,可以使用TOP命令. TOP 通过TOP命令可以详细看出当前系统的C ...
- trust an HTTPS connection 安全协议 随机数 运输层安全协议 应用层安全协议 安全证书
小结: 1.HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间) HTTPS(全称:Hyper Text Transfer Protocol over Secure ...
- (转载)微软数据挖掘算法:Microsoft Naive Bayes 算法(3)
介绍: Microsoft Naive Bayes 算法是一种基于贝叶斯定理的分类算法,可用于探索性和预测性建模. Naïve Bayes 名称中的 Naïve 一词派生自这样一个事实:该算法使用贝叶 ...
- 五:Spring Security 中的角色继承问题
Spring Security 中的角色继承问题 以前的写法 现在的写法 源码分析 SpringSecurity 在角色继承上有两种不同的写法,在 Spring Boot2.0.8(对应 Spring ...
- 7.DHCP的相关命令
1.Get-DhcpServerv4Scope :查看所有作用域状态 PS C:\Users\xinghen> Get-DhcpServerv4Scope ScopeId SubnetMask ...