FPGA教程:Verilog常用代码逻辑介绍与注意事项

1 always块语句逻辑介绍

always是Verilog中最常用的关键词,在Verilog中绝大多数的功能都是放在always块中实现的下面,我放一个代码示例来介绍一下always的逻辑规则。
下面展示一个 时钟分频模块

module clkdiv(
	clk,
	clr,
	clkout);

	//以上是模块端口定义
	input clk;
	input clr;
	output clkout;

	wire clk;
	wire clr;
	wire clkout;

	//以上是端口类型定义
	reg [1:0] q; 
	//   25-bit counter 
	always @(posedge clk or posedge clr) 
	  begin 
	    if(clr == 1) 
	  q <= 0; 
	else  
	  q <= q + 1; 
	  end 
	assign clkout = q[1];   // 3 Hz
endmodule    //clkdiv

在这个时钟分频模块中 always @(posedge clk or posedge clr)
begin …end 便是always最基本的语法规则,在always的@括号里面写的是always的敏感信号,表示当有括号内的敏感信号产生那个变化时,则always执行内部复合语句。下面我放一些注意事项。
注意:1、always是结构快在FPGA中等效的运行结果是并行运行,而always内的语句体则是串行自上而下执行的。
2、在always块中如果有if(表达式)语句存在的话就要有else语句存在否则的话在生成电路时会在FPGA中产生锁存器,这是很麻烦的。
3、always块语句在一个程序中不是只能有一个而是可以有很多。

2 assign逻辑介绍

关于assign我就不在引用示例代码了,直接引用 时钟分频模块的代码。我们可以看到这一句:assign clkout = q[1]; // 3 Hz
assign其实并不需要敏感信号,因为它是一直执行的,我们可以以为 assign ==always(*),也可以这么加深理解。关于assign还有一条注意:1、assign的左侧必须是线网型变量,否则的话就会编译错误。

3 线网性变量与寄存器型变量

线网型变量:wire
下面我来写两个示例类型。

// wire线网型变量示例
wire               sys_clk;
wire     [1:0]     state  ; 

这两个都是线网型变量的定义方法,其中需要注意的点就是在第二个线网型变量定义的时候有[1:0]这个是线网的位宽定义在这里[1:0]的意义是2位位宽在没有位宽定义的时候系统默认位宽1位。
寄存器型变量:reg
下面我写几个寄存器型示例。

// reg 寄存器型变量
reg                rese;
reg      [7:0]     text;
reg [7:0] reg_g [0:5];
reg [1:0] adc [0:7] [0:3];

其中第一个就是正常的寄存器的定义其未定义位宽默认位1位第二个定义了位宽[7:0]表示text位一个8位的寄存器。而在最后的寄存器定义表示的是定义了一个8位宽的6个寄存器组reg_g[0]reg_g[1]reg_g[2]reg_g[3]reg_g[4]reg_g[5],第三个多维寄存器的定义我就不在介绍啦。

4 定义常量parameter

在了解parameter之前我想知道大家如果有c语言基础,或者做过嵌入式产品的话都会清楚define,我们为了好理解可简单认为 parameter == define,下面我写一句示例

// parameter的定义示例
parameter  SIZE = 8;
reg   [SIZE-1:0]  text;

我们可以看到其实parameter常用在块中,大多数时候 是为了去定义在程序中会经常用的常量,所以我们可以理解为difine,在Verilog中是有define语句存在的,以及它的调用方式。

//`define+name+参数  
    `define   STATE_INIT     4‘b1010;
    state <= `STATE_INIT;

下面做一些补充介绍:define 与localparam和parameter最大的区别就是define 可以跨文件传递参数;parameter只能在模块间传递参数;而localparam只能在其所在的module中起作用,不能参与参数传递。

5 可综合与不可综合关键词

可综合关键词:
always,assign,begin,end,case,wire,tri,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,not,if,inout,input,module,negedge,posedge,output,parameter等等
不可综合关键词:其余你所看到的大多数都属于不可综合语句。
关于可综合与不可综合其实质上就是,你所写的程序是否可以在FPGA中生成电路,因为Verilog中不是所有关键词都为设计电路所设计的有一部分是为仿真激励设计的。

6 注意事项与心得

学习Verilog有c语言基础还是比较简单的但是并不代表没有c基础会学不会,相反不会被思维定式限制,有c的基础的话难点在于要转变串行的思维去设计代码。但是学号Verilog只是第一步,要从深度去理解电路与各种资源的使用才是学好FPGA的重点,当然最好的老师是实践:纸上得来终觉浅,觉知此事要躬行。所以最好的办法就是多敲多看多练。

技术水平有限,如有错误欢迎批评指正:779163410@qq.com(本人会在闲暇时在嵌入式,集成电路,物联网互联网发布自己的经验与心得,喜欢可以关注。谢谢。)

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木林学长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值