有了上述的代码我们尝试攒在一起,进行仿真一下。这里直接将接受和发送都放在一起进行测试。写代码如下:
`timescale 1ns/1ns
module tb ;
initial
begin
$dumpfile("tb.vcd");
$dumpvars( 0 , tb );
$display("hello tb");
#3600_100;
$finish;
end
reg clk=0;
always #5 clk = !clk ;
reg bit_in=0;
wire bit_out;
wire [11:0]sin,cos ;
reg [15:0]c =0;
wire c_of = c==(3600-1) ;
always@(posedge clk )c <= ( c_of )? 0: c+1;
always@(posedge clk ) if (c_of )bit_in <=!bit_in ;
FSK_modulator FSK_modulator (
.bb_clk(clk),
.bit_in(bit_in) ,
.cnt0( 0 ),
.cnt1( 0 ),
.step0( 4 ),
.step1( 9 ),
.sin(sin) ,
.cos(cos)
);
wire flag_bit = sin[11] ;
FSK_DEmodulator #(.SHORT_VALUE (1) )FSK_DEmodulator (
.bb_clk(clk ),
.bit_out( bit_out ) ,
.v_short( 50) ,
.v_long( 80 ) ,
.flag_bit( flag_bit)
);
endmodule
这里是使用ICAROUS VERILOG 进行仿真的,因为有多个文件,编写命令脚本不需要一一列举文件,只需要用通配符*就好。
:start
del a.out
del *.vcd
iverilog *.v
vvp -n a.out
pause
goto start
这个脚本允许我们不断的修改代码,之后再编译。生成的VCD文件可以在每次编译之后被RELOAD。
之后我们进行查看仿真波形。
当然这个过程不可能是一帆风顺的,代码也不可能是一口气写好的,这里对代码也经理多次修改。有两点总结:
1,ICAROUS VERILOG 调试新写成的多个文件的代码,我遇到不报错的情况,但是也不正常运行。无奈之下,只好放在VIVADO仿真环境下排错.VIVADO可以仿真了之后,再回到VERILOG环境下进行仿真和拍错。
2,VIVADO也能很好执行下面的脚本,生成VCD文件。这个VCD文件同样可以用GTKWAVE查看,并且结果跟ICARUS VERILOG一样。
initial
begin
$dumpfile("tb.vcd");
$dumpvars( 0 , tb );
$display("hello tb");
#3600_100;
$finish;
end