verilog语法学习心得
1.数字电路基础知识: 布尔代数、门级电路的内部晶体管结构、组合逻辑电路分析与设计、触发器、时序逻辑电路分析与设计
2.数字系统的构成: 传感器 AD 数字处理器 DA 执行部件
3.程序通在硬件上的执行过程:
C语言(经过编译)--该处理器的机器语言(放入存储器)--按时钟的节拍,逐条取出指令、分析指令、执行指令
4.DSP处理是个广泛概念,统指在数字系统中做的变换(DFT)、滤波、编码解码、加密解密、压缩解压等处理
5.数字处理器包括两部分:高速数据通道接口逻辑、高速算法电路逻辑
6.当前,IC产业包括IC制造和IC设计两部分,IC设计技术发展速度高于IC设计
7.FPGA设计的前续课程:数值分析、DSP、C语言、算法与数据结构、数字电路、HDL语言 计算机微体系结构
8.数字处理器处理性能的提高:软件算法的优化、微体系结构的优化
9.数字系统的实现方式:
编写C程序,然后用编译工具得到通用微处理器的机器指令代码,在通用微处理器上运行(如8051/ARM/PENTUIM)
专用DSP硬件处理器
用FPGA硬件逻辑实现算法,但性能不如ASIC
用ASIC实现,经费充足、大批量的情况下使用,因为投片成本高、周期长
10.FPGA设计方法: IP核重用、并行设计、层次化模块化设计、top-down思想
FPGA设计分工:前端逻辑设计、后端电路实现、仿真验证
11.matlab的应用:
matlab中有许多现成的数学函数可以利用,节省了复杂函数的编写时间
matlab可以与C程序接口
做算法仿真和验证时能很快生成有用的数据文件和表格
DSP builder可以直接将simulink模型转换成HDL代码,跳过了中间的C语言改写步骤
12.常规从算法到硬件电路的开发过程:
算法的开发
C语言的功能描述
并行结构的C语言改写
verilog的改写
仿真、验证、修正
综合、布局布线、投入实用
13.C语言改写成verilog代码的困难点:
并行C语言的改写,因为C本身是顺序执行,而不是并行执行
不使用C语言中的复杂数据结构,如指针
目前有将C语言转换成verilog的工具?
14.HDL
HDL描述方法是从电路图描述方法演化来的,相比来说更容易修改
符合IEEE标准的有verilog HDL和VHDL
VHDL由美国国防部开发,有1987和1993两个版本
verilog由cadence持有,有1995、2001、2005三个版本
verilog较VHDL更有前景:具有模拟电路描述能力、不仅可以开发电路还可以验证电路、门级以下描述比VHDL强
RTL级和门级的综合已经成熟,主要是注意行为级的综合结果,使用可综合的编程风格
SYSTEM VERILOG是VERILOG的一种延伸
15.IP核的应用:
软核soft core: 功能经过验证的、可综合的、实现后门数在5K以上的HDL代码
固核firm core: 功能经过验证的、可综合的、实现后门数在5K以上的电路结构编码文件,如edif,不可更改
硬核hard core: 功能经过验证的、可综合的、实现后门数在5K以上的电路结构版图,已带工艺参数,不可更改
16.HDL语言综合后得到EDIF,这是一种标准电路网表
EDIF经过具体工艺库匹配、布局布线、延时计算后得到网表
EDIF不可更改,作为固核存在
17.verilog特点:
区分大小写,所有关键字都要求小写
不是强类型语言,不同类型数据之间可以赋值和运算
//是单行注释 可以跨行注释
描述风格有系统级描述、行为级描述、RTL级描述、门级描述,其中RTL级和门级别与具体电路结构有关,行为级描述要遵守可综合原则
门级描述使用门级模型或者用户自定义模型UDP来代替具体基本元件,在IDE中针对不同FPGA器件已经有对应的基本元件原语
18.verlog语法要点:
module endmodule之间由两部分构成:接口描述和逻辑功能描述
IO端口种类: input output inout
相同位宽的输入输出信号可以一起声明, input[3:0] a,b; 不同位宽的必须分开写
内部信号为reg类型,内部信号信号的状态: 0 1 x z, 3'bx1=3'bxx1 x/z会往左扩展 3'b1=3'b001 数字不往左扩展
逻辑功能描述中常用assign描述组合逻辑电路,always既可以描述组合逻辑电路又可以描述时序逻辑电路,还可以用元件调用方法描述逻辑功能
always之间、assign之间、实例引用之间以及它们之间都是并行执行,always内部是顺序执行
常量格式: :
默认进制为10进制
默认位宽为32位
位宽是从二进制宽度角度而言的
由位宽决定从低位截取二进制数2'hFF=2'b11,通常由被赋值的reg变量位宽决定
parameter常用于定义延迟和变量位宽,可用常量或常量表达式定义
变量种类: wire reg memory
IO信号默认为wire类型,除非指定为reg类型
wire可以用作任何输入输出端口
wire包括input output inout
wire不带寄存功能
assign赋值语句中,被赋值的信号都是wire类型
assign之所以称为连续赋值,是因为不断检测表达式的变化
reg类型可以被赋值后再使用,而不是像wire一样只能输出,类似VHDL中的buffer端口
reg类型变量初始值为x (VHDL中初始值为本类型最小值,通常是0)
always模块里被赋值的信号都必须定义为reg类型,因为always可以反复执行,而reg表示信号的寄存,可以保留上次执行的值
reg类型变量与integer变量不同,即使赋负值,实质上也是按二进制无符号数存储的,integer是有符号数
verilog中所有内部信号都是静态变量,因为它们的值都在reg中存储起来了
memory型只有一维数组,由reg型变量组成
memory初始化只能按地址赋值,不能一次性赋值
1*256的memory写法: reg mema[255:0] mema[3]=0;
不同位宽的变量之间赋值,处理之前都以被赋值的变量位宽为准扩展或截取
A[a:b] 无论a b谁大,a总是实际电路的信号高位,b总是实际电路的信号低位
算术运算中如果有X值则结果为X
for循环中的变量另外定义成integer,因为它不是实际信号,有正负;reg则以无符号数存在
== 和!=只比较0、1,遇到z或x时结果都为x (x在if中算做假条件),结果可能是1、0、x
===和!==比较更加苛刻,包括x和z的精确比较,结果可能是0、1
&&的结果只有1'b1或1'b0两种, A&A的结果位宽则是与A相同的
{1,0}为 64'h100000000,所以拼接运算中各信号一定要指定位宽
移位运算左移将保留 4'b1000K*(组合逻辑延迟+触发器的建立保持时间/触发时间),即时间片段要长于最大路径延迟
体现了面积换速度的思想,在综合时考虑的是以面积小为主还是以速度为主
本质上是一种同步逻辑
同步时序逻辑和异步时序逻辑:
同步时序逻辑指所有寄存器组由唯一时钟触发 always@(posedge clk) 或always@(negedage clk)
异步时序逻辑指触发条件不唯一,任意一个条件都会引起触发 always@(posedge clk or posedage reset)
目前的综合器是以同步时序逻辑综合的,因为同步时序逻辑较异步时序逻辑可靠
严格的同步要求时钟信号传递速度远远大于各部分的延迟,实际中clk要单独用线,而不要经过反相器等部件
always @(posedge.. ) begin ...
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。