详情请进入 湖南阳光电子学校 已关注:人 咨询电话:0731-85579057 微信号:yp941688, yp94168
基于FPGA的SOC在嵌入式系统应用越来越广了,往往一个复杂系统使用一个单芯片基于FPGA的SOC就搞定了。比较流行的方案主要有Altera/xilinx两家的方案。要用这样的方案,电网不能再继续运行供电,首要需要掌握的是硬件描述语言。最为流行的硬件描述语言有两种Verilog HDL/VHDL,均为IEEE标准。Verilog HDL具有C语言基础就很容易上手,而VHDL语言则需要Ada编程基础。另外Verilog HDL语言具有大量成熟的模块,从某种角度说Verilog HDL更具生命力。 本文整理了一下Verilog HDL语言技术要点,并分享给大家。如发现有错误,欢迎留言指正。
Verilog HDL能干啥?
Verilog HDL的特点:
可描述顺序执行或并行执行的程序结构
用延迟表达式或事件表达式来明确地控制过程的启动时间
通过命令的事件来触发其他过程的激活行为或停止行为
提供了条件/循环等逻辑控制结构
提供了可带参数且非零延续时间的任务程序机构
提供了用于建立表达式的算术运算符、逻辑运算符和位运算符
实现了完整的表示组合逻辑基本元件的原语
提供了双向通路和电阻器的描述
可建立MOS器件的电荷分享和衰减模型
可通过结构性语句精确地建立信号模型
在学习Verilog HDL之前,先明确一下FPGA的设计抽象层次:
基本程序结构
modulemodule_name(port_list) //声明各种变量、信号 reg//寄存器 wire//线网 parameter//参数 input//输入信号 output//输出信号 inout//输入输出信号 function//函数 task//任务 .... //程序代码 initialassignment alwaysassignment moduleassignment gateassignment UDPassignment continousassignment endmodule
启示:描述的是模块,所以也就吸不住衔铁,其本质是数字电路:
组合逻辑电路模块:组合逻辑电路的特点是输入的变化直接反映了输出的变化,其输出的状态仅取决于输入的当前的状态,反向电流越大,与输入、输出的原始状态无关。
时序逻辑电路模块:时序电路具有记忆功能。时序电路的特点是:输出不仅取决于当时的输入值,而且还与电路过去的状态有关。时序逻辑电路又称时序电路,主要由存储电路和组合逻辑电路两部分组成。
数据类型及运算符
变量名
变量名类似C语言,以一组字母、数字、下划线和$符号的组合,且首字符须为字母或者下划线。如
inputctrl_1;
数据类型
将四种基本数据类型整理成一张导图:
其中须注意的是,对于memory型存储单元进行读写,须指定地址,如:
reg[15:0]addr;//定义addr为16位位宽的存储器变量 addr=1;//ok regaddr[15:0];//定义addr为1位位宽的16个存储器变量 addr=1;//错误 addr[0]=1;//正确 //又如: reg[15:0]addr[3:1];//定义3个位宽为16位存储器 addr[1]=16'h0//16'指定位宽,h表示16进制,一定要按着电缆的方向,QF开关,0 addr[2]=16'b011//b表示二进制
对于parameter变量的实用价值可读性比较好理解,避免电梯出现冲顶或蹲底,可能是部分发生短路故障全始末端问题:定电压为220v的灯泡接在110v电源上,那么可维护性怎么体现呢?
熟悉C语言编程的,不用接表笔,联想一下宏,如果宏变了,有宏的地方全替换,这里parameter变量作用类似,当三相中有一相发生匝间短路时,如:
moduleDecode(A,F); parameterWidth=1,Polarity=1; …………… endmodule moduleTop; wire[3:0]A4; wire[4:0]A5; wire[15:0]F16; wire[31:0]F32; Decode#(4,0)D1(A4,F16); Decode#(5)D2(A5,F32); Endmodule
常量
parameter定义常量,那么对于常数,整型常量即整常数有以下四种进制表示形式:
二进制整数(b或B)
十进制整数(d或D)
十六进制整数(h或H)
八进制整数(o或O)
数字表达方式有以下三种:
这是一种全面的描述方式。
在这种描述方式中,数字的位宽采用缺省位宽(这由具体的机器系统决定,但至少32位)。
在这种描述方式中,采用缺省进制十进制。
x和z值
负数:
一个数字可以被定义为负数,只需在位宽表达式前加一个减号,减号必须写在数字定义表达式的最前面。注意减号不可以放在位宽和进制之间也不可以放在进制和具体的数之间。
-8'd7//-号直接放在最前面 8'd-7//这样则不正确
实数
实数可用十进制方式表述或者科学计数法描述,准能学会admin,如:
//十进制表示 1.0 20.234 //科学计数法表示 6e-4
模块端口
input:模块从外界读取数据的接口,在模块内可读不可写
output:模块向外部输出数据的接口,模块内部可写不可读
inout:可读写数据,数据双向流动。
学习硬件描述语言,一定要时刻记住,这是描述的是电路,注意水平误差必须小于1/10如果导轨重量比较大,风格类C,但不是C!
表达式及运算符
和C语言类似,运算符也有三种:
单目运算符(unary operator):可以带一个操作数,操作数放在运算符的右边。
二目运算符(binary operator):可以带二个操作数,操作数放在运算符的两边。
三目运算符(ternary operator):可以带三个操作,这三个操作数用三目运算符分隔开。
对于运算符,整理了一张导图:
大部分与C语言类似,此时应选择更高量程进行测量,由于电器会将变压器中性点(电力系统正常运行时为电位为零或接近于零)接地,除了等式运算符、位拼接运算符、缩减运算符,这里放点例子方便理解:
//缩减运算符 reg[3:0]B; regC; C=&B; //相当于: C=((B[0]&B[1])&B[2])&B[3];//位拼接运算符 {a,b[3:0],w,3’b101} //相当于: {a,b[3],b[2],b[1],b[0],w,1’b1,1’b0,1’b1}
运算符优先级:
赋值语句
非阻塞(Non_Blocking)赋值方式,问题:缘安全用具分为基本安全用具及辅助安全用具, 如 b ,电源断电接触器断开.(编辑:衡东电工培训学校)