verilog学习 (二)
晚上无聊,接着写第二篇吧.
第一个实用的代码就用D出发器吧.很简单
module d_flip(d,clk,q);
input d,clk;
output q;
wire d,clk;
reg q;
always @ (posedge clk)
begin
q <= d;
end
endmodule
解释如下,always想当于一直在运行,当 clk上升(posedge)时运行下面的语句`q<=d;`
( 对应的VHDL语句是process(clk) begin if (clk'event and clk = '1')q<=d end )
总体看来还是差不多,但是到数据类型时感觉verilog明显好多了.
变量定义部分发现与旧式c语言的样子差不多 o(∩_∩)o.变量类型很重要,因为verilog是硬件语言,脑子里还是得有一些模型的,需要寄存器的变量是reg类型的,如果是从外部引线传过来的话是使用wire类型.
写完模块后需要写测试部分.测试部分也是标准的verilog代码.关于测试代码http://www.asic-world.com/verilog/art_testbench_writing.html这里有专门的一段的`
如下:
module D_te();
reg clk,d;
wire q;
initial
begin
$dumpfile("d_out.vcd");
$dumpvars(0,D_te);
$display("D flip test");
$monitor("time = %g clk= %d d = %d p = %d",
$time,clk,d,q);
clk = 0;
d = 0;
#2 d = 1;
#3 d = 0;
#4 d = 1;
#1 $finish;
end
always
#1 clk = ~clk;
d_flip D0(d,clk,q);
endmodule
编译,运行 结果如下:
gtkwake结果如下:
好了,睡觉 zzzZZZz.