一、文件尾缀含义等常识
-
sof文件时编译(分析、综合、布线、生成、时序)过程中生成的一个文件,可通过Jtag下载到FPGA的SRAM中去执行.
-
pof文件生成过程同上,但不同之处在于不能直接下载到FPGA的SRAM中,需要通过ASP端口直接下载到FPGA的配置芯片中,配置芯片一般时串行FLASH,在上电时,FPGA会主动从配置芯片汇总读取并烧写内部的SRAM数据然后执行。
-
jic文件不是在编译过程中生成的,而是需要使用QuartusII软件的Convert Programing File功能可将sof文件转换得到jic文件,可通过JTAG接口将jic文件通过FPGA作为桥接芯片下载到配置芯片中去。
可以看出来jic文件的性质和pof文件的性质是一样的,都是固化在配置芯片中的,但是下载方式是不一样的,pof文件是直接通过ASP端口直接下载到配置芯片中去的,而jic文件需要通过FPGA作为桥接再下载到配置芯片中去,两种方法各有各的好处,使用jic文件省了一个ASP端口,使用pof文件不需要转换直接就能下载。
-
.xcf 的缩写可能是 xilinx Constrains File,该文件作为设计项目的配置文件,用于保存项目的配置、约束等信息,同时也用于相关的版本控制管理等,且其他人员可通过xcf文件加载项目的设置和约束。
-
adc文件为物理(引脚)约束文件 不同开发环境尾缀不同,
-
lattice Diamond中以.lpf为引脚约束文件"Logical Processing File",即逻辑处理文件
-
sdc文件为时序约束文件
-
当top source文件引用其他source文件中的module时,保存后会自动引用其他模块。
-
Tcl全名Tool Command Language,是一种解释执行的脚本语言(解释执行就是边解释边执。TD 软件支持使用 tcl 脚本运行 Flow,可减少用户界面操作。
-
mif 文件是一个纯文本 (ASCII) 文件,包含一个标题和一个数据部分。数据部分包含一组带有数字坐标的语句,这些语句定义了要可视化的实际图形,而文件头则宣布了格式版本,并包含可选的声明。MIF文件通常与相应的MID文件一起使用,MID文件包含文本数据,是MIF格式的一部分
-
BUFG:全局缓冲,它的输入时IBUFG的输出,BUFG的输出达到FPGA内部的IOB、CLB、选择性块RAM的时钟延迟和抖动最小
-
BUFGMUX:全局时钟选择缓冲:两个输入,一个选择则控制端,一个输出
-
IDDR全称 input double date rate,可以将双沿(时钟的上升沿、下降沿)数据信号转换为单沿数据信号,通常使用在串转并数据设计中
-
综合就是将 HDL 语言设计转化为由与门、或门和非门等基本逻辑单元组成的门级连接。因此,可综合语句就是能够通过 EDA 工具自动转化成硬件逻辑的语句。
-
换句话说任何符合 HDL 语法标准的代码都是对硬件行为的一种描述,但不一定是可直接对应成电路的设计信息
-
0:逻辑 0 或“假”;1:逻辑 1 或“真”;x:未知;z:高阻。
-
Verilog HDL 中的常量分为 3 类:整数型、实数型以及字符串型。下划线符号“_”可以随意用在整数和实数中,没有实际意义,只是为了提高可读性。例如:56 等效于 5_6。
-
根据 Verilog 语言的定义,实数通过四舍五入隐式地转换为最相近的整数。
-
数据类型用来表示数字电路硬件中的数据存储和传送元素。Verilog HDL 中总共有两大类数据类型:线网类型和寄存器类型线网类型主要表示Verilog HDL中结构化元件之间的物理连线,其数值由驱动元件决定;如果没有驱动元件连接到线网上,则其缺省值为高阻'z'。寄存器类型主要表示数据的存储单元,其缺省值为不定'x'。二者最大的区别在于:寄存器类型数据保持最后一次的赋值,而线网型数据则需要持续的驱动
-
线网数据类型包含不同种类的线网子类型,其中只有 wire、tri、supply0 和 supply1是可综合的
-
线网类型变量的赋值(也就是驱动)只能通过数据流“assign”操作来完成,不能用于always 语句中
-
除了“/”和“%”等算术运算受限外,所有的操作符都是可综合的。
二、Verilog关键字含义
`timescale 1ns / 1ps
//含义为:时延单位为1ns,时延精度为1ps。
关键字
module 模块开始定义
input 输入端口定义
output 输出端口定义
inout 双向端口定义
parameter 信号的参数定义
wire wire 信号定义
reg reg 信号定义
always 产生reg信号语句的关键字
assign 产生wire信号语句的关键字
begin 语句的起始标志
end 语句的结束标志
posedge/negedge 时序电路的标志
case 语句起始标记
default 语句的默认分支标志
endcase 语句结束标记
if if/else 语句标记
else if/else 语句标记
for for 语句标记
endmodule 模块结束定义
数字表达方式主要有三个部分:位宽、进制和数字。
位宽指数字常量的二进制宽度,进制表示数字的类型
例如:8'b00101000 //位宽为8的二进制表示,’b表示二进制
数据类型
线网类型和寄存器类型。线网类型主要表示 Verilog HDL 中结构化元件之间的物理连线,其数值由驱动元件决定;如果没有驱动元件连接到线网上,则其缺省值为高阻'z'。寄存器类型主要表示数据的存储单元,其缺省值为不定'x'。
二者最大的区别在于:寄存器类型数据保持最后一次的赋值,而线网型数据则需要持续驱动。
连续赋值只能读线网型变量进行赋值,而不能对寄存器变量进行赋值,且仅需赋值一次,始终有效
assign wire;固定搭配
过程赋值主要用于initial和always中,在过程块中只能使用过程赋值语句,即在always中不可能出现assign wire。
过程赋值
阻塞赋值
阻塞赋值由符号“=”来完成,“阻塞赋值”由其赋值操作行为而得名:“阻塞”即是 说在当前的赋值完成前阻塞其他类型的赋值任务,但是如果右端表达式中含有延时语句,则在延时没结束前不会阻塞其他赋值任务。
非阻塞
适用对象
连续赋值
适用对象
只能用来对线网型变量进行赋值。
三、一些思维思路
1、上升沿和缓存上升沿的区别,上升沿与上升沿之间的间隔为一个时钟周期,上升沿与缓存上升沿的间隔为一个系统时钟周期。
2、上升沿缓存,每次系统脉冲到来时,将新脉冲赋值给缓存,但因为是非阻塞赋值,与此同时,未更新的缓存保留的仍是上一个时钟脉冲到来时的数据,所以,在当次判断中缓存为缓存。
reg sck_p;
if(rst_n)
sck_p <= 0;
else
sck_p <= sck;
3、在Verilog中的上升沿与下降沿的捕获
reg[2:0] sck_in;// 时钟输入
wire postadge;//上升沿
wire negadge;//下降沿
assign postadge = (sck_in[1:0] == 2'b01)? 1'b1:1'b0;
assign negadge= (sck_in[1:0] == 2'b10)? 1'b1:1'b0;
always@*
if(rst_n)
sck_in <= 3'd0;
else
sck_in = {sck_in[1:0],sck};
4、波形图的查看
实际开发过程中需要知晓通讯的时序,否则无法实现通讯,可根据通信端MCU的参考手册进行配置。需要根据代码推理出实际的波形图,且能够根据理论波形与实际波形的差别反推出代码的错误之处。。
5、此外,在 Verilog 语言中还有一种重复操作符{{}},即将一个表达式放入双重花括号中,复制因子放在第一层括号中,为复制一个常量或变量提供一种简便记法。例如,{3{2'b01}}= 6'b010101。
6、在实际运算中,经常通过不同移位数的组合来计算简单的乘法和除法。例如 s1*20,因为 20=16+4,所以可以通过 (s1<<4)+(s1<<2 )来实现。
module amp19(
clk, din, dout
);
input clk;
input [7:0] din;
output [11:0] dout;
reg [11:0] dint16;
reg [11:0] dint2;
reg [11:0] dint;
//将放大倍数 19 分解为 16+2+1
always @(posedge clk) begin
dint16 <= din << 4;
dint2 <= din << 1;
dint <= din;
end
assign dout = dint16 + dint2 + dint;
7、一元约简运算符
约简运算符对单个操作数进行运算,最后返回一位数,其运算过程为:首先将操作数的第一位和第二位进行与、或、非运算;然后再将运算结果和第三位进行与、或、非运算;依次类推直至最后一位。
always @ (a) begin
out1 = & a; //与约简运算
out2 = | a; //或约简运算
out3 = ~& a; //与非约简运算
out4 = ~| a; //或非约简运算
out5 = ^ a; //异或约简运算
out6 = ~^ a; //同或约简运算
end
8、If_else
if 语句指定了一个有优先级的编码逻辑,而 case 语句生成的逻辑是并行的,不具有优先级。if 语句可以包含一系列不同的表达式,而 case 语句比较的是一个公共的控制表达式。通常 if-else 结构速度较慢,但占用的面积小,如果对速度没有特殊要求而对面积有较高要求,则可用 if-else 语句完成编解码。case 结构速度较快,但占用面积较大,所以用 case 语句实现对速度要求较高的编解码电路。嵌套的 if 语句如果使用不当,就会导致设计的更大延时,为了避免较大的路径延时,最好不要使用特别长的嵌套 if 结构。如想利用 if 语句来实现那些对延时要求苛刻的路径时,应将最高优先级给最迟到达的关键信号。
9、对循环的理解
始终要记得Verilog是一门硬件描述语言,所编写的代码最终经过EDA工具被翻译为基本的逻辑门电路组合,而在硬件电路中并没有循环电路的原型,因此在使用循环语句时要十分小心,必须要时刻注意其可综合性。
在硬件系统中,任何RTL级的描述都是需要占用资源的,因此必须确保循环是一个有限循环,否则设计将是不可综合的,因为任何硬件实现平台的资源都是有限的。
描述层次越抽象,将其转化为硬件实现的难度就越大,性能就越差,并且占用资源越多。文章来源:https://www.toymoban.com/news/detail-768810.html
在循环语句中出现的变量都采用了阻塞赋值,这是因为在 always 语句中使用非阻塞赋值“<=”时,只有在 always 结束后才会把右端的值赋给左边的寄存器。如果采用非阻塞赋值,则会造成循环语句只执行一次;硬件设计并不追求代码的短小,而是设计的时序和面积性能等特征。文章来源地址https://www.toymoban.com/news/detail-768810.html
到了这里,关于FPGA基础概念_Verilog的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!