- FPGA编程语言
Verilog HDL(Hardware Description Language)是在用途最广泛的在C语言的基础上发展起来的一种硬件描述语言,具有灵活性高、易学易用等特点。 Verilog HDL可以在较短的时间内学习和掌握,目前已经在FPGA开发/IC设计领域占据绝对的领导地位。这里以一个简单的案例开始,请仔细看代码结构。
该案例,包含了可综合的verliog语言的主要语法,明白后,即可开始基本的FPGA编程。
- 简单的编程案例
为快速入门Verilog语言,先从简单的编程案例开始。以LED流水灯程序为例来给大家展示Verilog的程序框架,代码如下所示。
module led(
input sys_clk , //系统时钟
input sys_rst_n, //系统复位,低电平有效
output reg [3:0] led //4位LED灯
);
//parameter define
parameter WIDTH = 25 ;
parameter COUNT_MAX = 25_000_000; //板载50M时钟=20ns,0.5s/20ns=25000000,需要25bit
//位宽
//reg define
reg [WIDTH-1:0] counter ;
reg [1:0] led_ctrl_cnt;
//wire define
wire counter_en ;
//***********************************************************************************
//** main code
//***********************************************************************************
//计数到最大值时产生高电平使能信号
assign counter_en = (counter == (COUNT_MAX - 1'b1)) ? 1'b1 : 1'b0;
//用于产生0.5秒使能信号的计数器
always @(posedge sys_clk)
begin
if (sys_rst_n == 1'b0)
counter <= 1'b0;
else if (counter_en)
counter <= 1'b0;
else
counter <= counter + 1'b1;
end
//led流水控制计数器
always @(posedge sys_clk)
begin
if (sys_rst_n == 1'b0)
led_ctrl_cnt <= 2'b0;
else if (counter_en)
led_ctrl_cnt <= led_ctrl_cnt + 2'b1;
end
//通过控制IO口的高低电平实现发光二极管的亮灭
always @(posedge sys_clk)
begin
if (sys_rst_n == 1'b0)
led <= 4'b0;
else begin
case (led_ctrl_cnt)
2'd0 : led <= 4'b0001;
2'd1 : led <= 4'b0010;
2'd2 : led <= 4'b0100;
2'd3 : led <= 4'b1000;
default : led <= 4'b1111;
endcase
end
end
endmodule
Verilog最主要的语法如下:
- 注释:两种方式,一种是以“/*”符号开始,“*/”结束,在两个符号之间的语句都是注释语句,因此可扩展到多行。另一种是以//开头的语句,它表示以//开始到本行结束都属于注释语句。
- 模块定义:以module开始,endmodule结束;
- 端口定义:input output
- 数据类型的定义:reg 、wire、parameter
- assign语句:条件成立选择1,否则选择0
- always语句:语句中的posedge代表在时钟上升沿进行信号触发。begin/end代表语句的开始和结束。
- If-else语句:和C语言是比较类似的。
- Case语句:需要一个case关键字开始,endcase关键字结束,default作为默认分支,和C语言也是类似的。
- 问号语句:与if-else类似。