verilog HDL -模块代码基本结构
1--verilog HDL 语言的预编译指令作用:指示在编译verliog HDL源代码前,需要执行哪些操作。
2--模块内容是嵌在module 和endmodule两个语句之间。每个模块实现特定的功能,模块可进行层次的嵌套,因此可以将大型的数字电路设计分割成大小不一的小模块来实现特定的功能,最
后通过由顶层模块调用子模块来实现整体功能。
3--模块包括接口描述部分和逻辑功能描述部分。这可以把模块与器件相类比。
4-verilog hdl语言支持的并行语句主要有一下四种:
连续赋值语句
模块实例化语句
initial语句
always语句
模块引用方式:
端口定义:
事件:当线网型或寄存器型信号的值发生变化时,对电路来说就是产生了一个事件,就需要进行相应的计算。
事件在代码中以@(时间列表)形式出现,事件列表可以有多个,用or分开,也可以用“,”分开,他们之间是“或”的关系。也就是说只要有一个事件产生,就会执行进程语句。事件分为电平信号和边沿信号两种。(posedge:上升沿事件,negedge:下降沿事件。)
【进程:行为模型的本质是进程。一个进程可以被看做是一个独立的运行单元,它可能很简单,也可能很复杂,我们可以将数字系统的行为看作很多有机结合的进程的集合。
在Verilog HDL中,描述进程的基本语句是always和initial。Always过程反复执行其中的块语句,而initial过程中的语句块只执行一次。除了always和initial过程块外,一个assign赋值语句、一个实例元件的调用都可以看作是一个进程。
进程的特点:
1-进程只有两种状态,即执行态和等待状态。进程是否进入执行态,取决于是否满足特定的条件,如敏感变量是否发生变化。一旦满足条件,进程即进入执行状态。当该进程执行完毕或遇到停止语句后,即停止执行,自动返回到起始语句,进入等待状态。
2-进程一般由敏感信号的变化来启动
3-各个进程之间通过信号线进行通信。多个进程之所以能同步并发运行,一个很重要的原因就是有进程之间的信号线的通信和协议。
4-一个进程中只允许描述对应于一个时钟信号的同步时序逻辑。
5-进程之间是并发执行的。两个或更多个“always”过程块、“assign”持续赋值语句、实例元件调用等操作都是同时执行的。】
always语句:(可综合)
特点:
1-循环执行
2-可综合
【综合:将用行为和功能层表达的电子系统转换成低层次的便于具体实现的模块组合装备的过程。
综合过程将把软件设计的HDL描述与硬件结构挂钩,是将软件转化为硬件电路的关键步骤,是文字描述与硬件相结合的一座桥梁。综合就是将电路的高级语言(如行为描述)转化为低级的,可以FPGA/CPLD的基本结构相映射的网表文件或程序。
当输入的hdl文件在eda工具中检测无误后,首选面临的就是逻辑综合,因此要求hdl源文件中的语句都是可综合的。】
3-必须有时序控制
4-在0时刻开始执行,可以有一条或者多条顺序语句。
使用方法:
语法格式:always
[时序控制]顺序语句;
时序控制可以是以时间刻度为单位的时间延时数字,也可以是信号变化事件条件。
当顺序语句有多条时,可以使用“begin”-“end”字符对进行组织。
【begin -- end就是一个模块 (相当于 C语音的一段程序)的起始和结束的标记。非常类似于 C语言中的 大括号 ({……})。】
注意:在不同的always逻辑块中,对同一个reg变量进行赋值,会冲突导致报错!
赋值操作符:
意义是更新被赋值数据对象的值。
1,赋值操作符 <=:
该操作符在进程块中使用,是非阻塞赋值,由于在进程中使用,所以被赋值的数据对象必须是reg型。
2,赋值操作符=:
该操作符在进程或者assign连续赋值语句中使用。被赋值数据对象可以是reg型或wire型,其中在进程块中的赋值方式是阻塞赋值。
*********************************************************************************************************************************************************
学习了上面的知识点,应该就能看懂下面的代码了。
1 'timescale 1ns/1ps //预编译指令定义了时间单位为1ns,时间精度为1ps 2 3 4 module led_test(clk,rst_n,led); 5 6 input clk; 7 input rst_n; 8 output [3:0] led; 9 10 //寄存器型数据对象的定义 11 reg [31:0] timer; 12 reg [3:0] led; 13 14 always @(posedge clk or negedge rst_n) 15 begin 16 if(~rst_n) 17 timer <=0; 18 else if(timer==32'd199_999_999) 19 timer<=0; 20 else 21 timer<=timer+1'b1; 22 end 23 24 always @(posedge clk or negedge rst_n) 25 begin 26 if(~rst_n) 27 led<=4'b0000; 28 else if(timer==32'd49_999_999) 29 led<=4'b0001; 30 else if(timer==32'd99_999_999) 31 led<=4'b0010; 32 else if(timer==32'149_999_999) 33 led<=4'b0100; 34 else if(timer==32'd199_999_999) 35 led<=4'b1000; 36 end 37 38 endmodule
ok,今天的学习结束!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?