个人使用modelsim遇到的问题及解决方法。
下面这个问题针对modelsim已编译完成ise的仿真库,但无法调用库文件的情况进行说明。
出现的问题如下图所示:
由于调用了库文件,会出现在ise可以仿真,但modelsim无法仿真的情况。我们需要在modelsim里面对仿真进行设置。(文末放出代码)
首先,找到文件所调用的库,仿真完成的ise仿真库进行查看。我们调用的是ODDR2和OBUFDS两个模块。在右上角进行文件搜索。
这里我们使用的是verilog HDL语言,所以我们选择.V为后缀的文件。右键打开文件的所在位置。查看文件所在的库。可以看到库名称为unisims。
接下来放回modelsim,对仿真选项进行设置。先创建project项目,添加程序文件和仿真文件,然后编译,通过之后可以点击左下角的library。可以看到界面如下所示。
点击上面的Simulate——State Simulation...进入设置画面。按照以下步骤选择文件,abc为仿真文件。
进入里面选择第二个,点击ok,返回对Libraries进行设置。
这里点击add...,添加前面找到的库文件的位置unisim。然后点击两次ok,就可以生成波形文件。
按照下面步骤进行设置,就可以得到波形图。
波形图如下所示
代码
abc.V
`timescale 1ns / 1ps
module abc;
// Inputs
reg sclk;
// Outputs
wire clk_O_p;
wire clk_O_N;
wire data_O_p;
wire data_O_N;
// Instantiate the Unit Under Test (UUT)
top_datain uut (
.sclk(sclk),
.clk_O_p(clk_O_p),
.clk_O_N(clk_O_N),
.data_O_p(data_O_p),
.data_O_N(data_O_N)
);
// Add stimulus here
parameter clk_period = 10;
initial begin
sclk = 0;
forever
# (clk_period/2) sclk = ~ sclk;
end
endmodule
top_datain.V
`timescale 1ns / 1ps
//
// Company: Han's Laser
// Engineer:quanylw
//
// Create Date: 08:58:57 07/12/2016
// Design Name:
// Module Name: top_datain
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module top_datain(
input wire sclk,//系统时钟
// input wire s_rst_n,//复位
// input wire DATA_IN_FROM_PINS_P,//输入差分数据信号P
// input wire DATA_IN_FROM_PINS_n,//输入差分数据信号N
// input wire CLK_IN_P_serdes_i,//输入查分时钟P
// input wire CLK_IN_n_serdes_i,//输入查分时钟N
output wire clk_O_p,//输出差分时钟P
output wire clk_O_N,//输出差分时钟N
output wire data_O_p,//输出差分数据P
output wire data_O_N//输出差分数据N
//output wire test//测试信号
);
reg outputclk_r=1'b0;
wire outputclk;
reg[2:0] ini_start=3'b0;//开始启动发送数据准备发送的计数器
reg ini_start_flag=1'b0;//启动发送信号
reg[2:0] cnt_data;//数据发送位数计数器
reg[7:0] outputdata_send;//待发送的数据
reg outputdata_r;//发送数据的信号线
wire outputdata;
always @(posedge sclk)//输出时钟
outputclk_r <= ~outputclk_r;
always @(posedge outputclk_r)//开始启动发送数据准备发送的计数器
ini_start <= ini_start+1'b1;
always @(posedge outputclk_r)//启动发送信号
if(ini_start==3'd7)
ini_start_flag <= 1'b1;
else
ini_start_flag <= ini_start_flag;
always @(posedge outputclk_r)//数据发送位数计数器
if(!ini_start_flag)
cnt_data <= 3'd0;
else if(ini_start_flag)
cnt_data <= cnt_data+1'b1;
else
cnt_data <= cnt_data;
always @(posedge outputclk_r)//待发送的数据
if(!ini_start_flag)
outputdata_send <= 7'd0;
else if(cnt_data==3'd7)
outputdata_send <= outputdata_send+1'b1;
else
outputdata_send <= outputdata_send;
always @(posedge outputclk_r)//发送数据的信号线
if(!ini_start_flag)
outputdata_r <= 1'd0;
else
outputdata_r <= outputdata_send[3'd7-cnt_data];
// //差分时钟输入,差分转单端
// IBUFGDS #(
// .DIFF_TERM("FALSE"), // Differential Termination
// .IOSTANDARD("LVDS_25") // Specifies the I/O standard for this buffer
// )
//
// IBUFGDS_inst (
// .O(inputclk), // Clock buffer output
// .I(CLK_IN_P_serdes_i), // Diff_p clock buffer input
// .IB(CLK_IN_n_serdes_i) // Diff_n clock buffer input
// );
//
// //差分数据输入,差分转单端
// IBUFDS #(
// .DIFF_TERM("FALSE"), // Differential Termination
// .IOSTANDARD("LVDS_25") // Specify the input I/O standard
// )
//
// IBUFDS_inst (
// .O(inputdata), // Buffer output
// .I(DATA_IN_FROM_PINS_P), // Diff_p buffer input (connect directly to top-level port)
// .IB(DATA_IN_FROM_PINS_n) // Diff_n buffer input (connect directly to top-level port)
// );
/
差分输出/
/
//差分时钟输出,单端转差分
ODDR2 #(
.DDR_ALIGNMENT("NONE"), // Sets output alignment to "NONE", "C0" or "C1"
.INIT(1'b0), // Sets initial state of the Q output to 1'b0 or 1'b1
.SRTYPE("SYNC") // Specifies "SYNC" or "ASYNC" set/reset
)
ODDR2_inst_0(
.Q(outputclk), // 1-bit DDR output data
.C0(outputclk_r), // 1-bit clock input
.C1(~outputclk_r), // 1-bit clock input
.CE(1'b1), // 1-bit clock enable input
.D0(1'b1), // 1-bit data input (associated with C0)
.D1(1'b0), // 1-bit data input (associated with C1)
.R(1'b0), // 1-bit reset input
.S(1'b0) // 1-bit set input
);
OBUFDS #(
.IOSTANDARD("DEFAULT") // Specify the output I/O standard
)
OBUFDS_inst_0(
.O(clk_O_p), // Diff_p output (connect directly to top-level port)
.OB(clk_O_N), // Diff_n output (connect directly to top-level port)
.I(outputclk) // Buffer input
);
//差分数据输出,单端转差分
ODDR2 #(
.DDR_ALIGNMENT("NONE"), // Sets output alignment to "NONE", "C0" or "C1"
.INIT(1'b0), // Sets initial state of the Q output to 1'b0 or 1'b1
.SRTYPE("SYNC") // Specifies "SYNC" or "ASYNC" set/reset
)
ODDR2_inst_1(
.Q(outputdata), // 1-bit DDR output data
.C0(outputdata_r), // 1-bit clock input
.C1(~outputdata_r), // 1-bit clock input
.CE(1'b1), // 1-bit clock enable input
.D0(1'b1), // 1-bit data input (associated with C0)
.D1(1'b0), // 1-bit data input (associated with C1)
.R(1'b0), // 1-bit reset input
.S(1'b0) // 1-bit set input
);
OBUFDS #(
.IOSTANDARD("DEFAULT") // Specify the output I/O standard
)
OBUFDS_inst_1(
.O(data_O_p), // Diff_p output (connect directly to top-level port)
.OB(data_O_N), // Diff_n output (connect directly to top-level port)
.I(outputdata) // Buffer input
);
//assign test = inputdata&inputclk;
endmodule