共计 2286 个字符,预计需要花费 6 分钟才能阅读完成。
⭐本专栏针对 FPGA 进行入门学习,从数电中常见的逻辑代数讲起,联合 Verilog HDL 语言学习与仿真,次要对组合逻辑电路与时序逻辑电路进行剖析与设计,对状态机 FSM 进行分析与建模。
🔥文章和代码已归档至【Github 仓库:hardware-tutorial】,须要的敌人们自取。或者关注公众号【AIShareLab】,回复 FPGA 也可获取。
零碎工作(System Tasks)
1.显示工作(Display Task)
$display 是 Verilog 中最有用的工作之一,用于将指定信息(被援用的字符串、变量值或者表达式)以及结束符显示到规范输出设备上。其格局如下:
2.$monitor 工作的参数格局与 $display 的雷同.
3. 仿真的停止 (Stopping) 和 实现 (Finishing) 工作
- $stop;// 在仿真期间,进行执行,未退出仿真环境。
- $finish;// 仿真实现,退出仿真环境,并将控制权返回给操作系统。
- 零碎工作 $stop 使得仿真进入交互模式,而后设计者能够进行调试。当设计者心愿查看信号的值时,就能够应用 $stop 使仿真器被挂起。而后能够发送交互命令给仿真器持续仿真。
编译指令(Compiler Directives)
以 `(反撇号)结尾的标识符就是编译指令,用来控制代码的整个过程。在 Verilog 代码编译的整个过程中,编译指令始终无效(编译过程可能逾越多个文件),直至遇到其余不同的编译指令为止。
`timescale time_unit/time_precision
`include "../../header.v"
`define WORD_SIZE 32 // 定义文本宏
`undef
`ifdef
`ifndef
`else
`elseif
`endif
时间尺度 `timescale
\`timescale 命令用于在文件中指明工夫单位和工夫精度,通常在对文件进行仿真时体现。EDA 工具能够反对在一个设计中可依据仿真须要在不同模块外面指定不同的工夫单位。如模块 A 仿真的工夫单位为皮秒(ps),模块 B 仿真的工夫单位为纳秒(ns)。
应用 \`timescale 命令语句格局如下:
- \`timescale < 工夫单位 > / < 工夫精度 >
- 应用时留神: < 工夫单位 > 和 < 工夫精度 > 必须是整数,且工夫精度不能大于工夫单位值。
- 例如:\`timescale 1ns / 1ns
工夫单位是定义仿真工夫和延迟时间的基准单位;工夫精度是定义模块仿真工夫的准确水平的,又被称为取整精度(在仿真前,被用来对提早的工夫值进行取整操作)。如果在同一个设计中,呈现多个 \`timescale 命令,工具会采纳最小的工夫精度值来决定仿真的工夫单位。
\`timescale 1ns / 1ps:此命令已定义模块中的工夫单位为 1ns,即仿真模块中所有的延迟时间单位都是 1ns 的整数倍;定义了模块的工夫精度为 1ps,即仿真模块中提早单位能够指定到小数点后 3 位,小数超过 3 位会进行取小数点后 3 位的操作。
宏定义 \`define
在设计中,为了进步程序可读性和简化程序形容,能够应用指定的标识符来代替一个长的字符串,或者应用一个简略的名字来代替没有含意的数字或者符号,此时需应用到宏定义命令 \`define。
应用 \`define 命令格局如下:
- \`define signal(宏名)string(宏内容)
- 在设计中进行了以上申明后,在预编译解决时,在此命令后程序中所有的 signal 都替换成 string,此过程称为“宏开展”。
// 例 1:`define LENGTH 16
reg [`LENGTH–1 : 0] writedata;
// 即定义 reg[15:0] writedata;
// 例 2:`define expression a+b+c
assign data = `expression + d ; // 经宏开展之后
//assign data = a+b+c+d;
// 例 3:`define A a+b
`define B c+`A
assign data = `B ; // 即 data = c + a + b;
文件蕴含指令 \`include
和 C 语言中申明头文件很相似。其个别模式为:
`include“文件名”
例:文件 para.v 中有一个宏定义 \`define A 2+3, 在 test.v 文件中能够间接调用。
`timescale 1ns/1ps
`include "para.v"
`module test(
input wire clk,
output reg [7:0] result
);
always@(posedge clk)
begin
result <= `A + 10;
end
endmodule
对于文件蕴含的几点阐明:
- 一个 \`include 只能指定一个蕴含文件;
- \`include 中的文件名能够是相对路径,也能够是绝对路径(ISE 中调用 Modelsim 仿真的时候得用绝对路径,否则 Modelsim 会报错);
-
如果文件 1 蕴含文件 2,而文件 2 要用到文件 3 的内容,那么在文
例:para.v 中:\`define A 2+3 para2.v 中:\`define B \`A+2 test.v 中:
`timescale 1ns/1ps
`include "para.v"
`include "para2.v"
module test(
input wire clk,
output reg [7:0] result
);
always@(posedge clk)
begin
result <= `B+ 10;
end
endmodule
欢送关注公众号【AIShareLab】,一起交换更多相干常识,前沿算法,Paper 解读,我的项目源码,面经总结。