为什么选择用Verilog HDL开发FPGA???
硬件描述语言(Hardware Descriptipon Lagnuage,HDL)通过硬件的方式来产生与之对应的真实的硬件电路,最终实现所设计的预期功能,其设计方法与软件不同,因此也就意味着描述的各个功能之间可以和硬件一样实现真正的并行互动。将这种语言成为硬件描述语言而非硬件语言的原因是:这种语言是用来描述我们设计的硬件所要实现的功能,而不是直接对硬件进行设计。
目前常用的语言是 verilog HDL 和 VHDL。对比而言,
VHDL和Verilog 相比,VHDL语法比Verilog严谨。VHDL语法比Verilog冗长,所以建议学习Verilog做为FPGA开发语言。
Verilog inout端口
module test
(
input wire sel ,
input wire data_out ,
inout wire data_bus ,
input wire data_in
);
assign data_in = data_bus ;
assign data_bus = (sel == 1'b1)?data_out:1'bz;
endmodule
Verilog中的系统任务和系统函数
verilog语言中定义了一些任务和函数,用于完成一些特殊功能,它们称为系统任务和系统函数,这些函数大多数只能在TB仿真中使用,使我们更方便验证。
·timescale 1ns/1ns //`timescale 表示时间尺度预编译指令 1ns/1ns 表示 时间单位 时间精度
时间单位和时间精度由值1、10和100以及单位s、ms、us、ns、ps、fs组成。
时间单位定义了仿真过程与时间相关量的单位。仿真中使用“#数字” 表示延时 #10 表示延时10ns
主要函数如下:
1、 $display("%b + %b = %d",a,b,c);
`timescale 1ns/1ns
module tb_test();
reg [3:0] a ;
reg [3:0] b ;
reg [3:0] c ;
initial
begin
$display("hello");
$display("Embedfire");
a = 4'd5 ;
b = 4'd6 ;
c = a + b ;
#100;
$display("%b + %b = %d",a,b,c);
end
endmodule
2 $write输出信息
`timescale 1ns/1ns
module tb_test();
reg [3:0] a ;
reg [3:0] b ;
reg [3:0] c ;
initial
begin
$write("hello") ;
$write("Embedfire") ;
a = 4'd5 ;
b = 4'd6 ;
c = a + b ;
#100;
$write("%b + %b = %d\n",a,b,c);
end
endmodule
3 $strobe输出信息
`timescale 1ns/1ns
module tb_test();
reg [3:0] a ;
reg [3:0] b ;
reg [3:0] c ;
initial
begin
$strobe("strobe:%b + %b = %d",a,b,c);
a = 4'd5 ;
#display("display:%b + %b = %d",a,,b,c);
b = 4'd6 ;
c = a + b ;
end
endmodule
4 $monitor用于持续监测变量
`timescale 1ns/1ns
module tb_test();
reg [3:0] a ;
reg [3:0] b ;
reg [3:0] c ;
initial
begin
a = 4'd5 ;
#100 ;
b = 4'd6 ;
#100 ;
c = a + b ;
end
initial
begin
$monitor("%b + %b = %d ",a,b,c) ;
end
endmodule
5 $stop用于暂停仿真,$finish用于仿真结束
`timescale 1ns/1ns
module tb_test();
initial
begin
$display("hello") ;
$display("Embedfire") ;
#100 ;
#display("Stop Simulation") ;
$stop ;
$display("Continue Simulation") ;
#100 ;
$display("Finish Simulation") ;
#finish ;
end
endmodule
6 $time为时间函数,返回64位当前仿真时间;$random用与产生随机函数,返回随机数。
`timescale 1ns/1ns
module tb_test();
reg [3:0] a ;
always # 10 a = $random ;
initial
begin
$monitor("a = %d,time :%d",a,$time) ;
end
endmodule