网站重新上线,多谢朋友们的关心
Sep
12
问题:在一个Spartan 3E的设计中例化了DCM_SP。用XST综合没问题,用Synplify 8.6.2报告Error。
Illegal defparam. parameter CLK_FEEDBACK cannot be found in module DCM_SP
原因:
查找Synplify安装目录的lib/xilinx/unisims.v。其中没有对dcm_sp的描述,也就是说此版本不支持dcm_sp。
解决:
1、查到Synplify 8.8以上版本的unisims.v中均有dcm_sp,也就是说可以使用dcm_sp在synplify中综合。
2、查到ISE 8.1以前的unisim库中也没有dcm_sp,但是ISE 8.1已经支持spartan 3E。于是查看用Coregen生成的DCM模板,其.v文件调用了DCM模块,而不是DCM_SP。也就是说直接例化DCM应该也是可以的
Illegal defparam. parameter CLK_FEEDBACK cannot be found in module DCM_SP
原因:
查找Synplify安装目录的lib/xilinx/unisims.v。其中没有对dcm_sp的描述,也就是说此版本不支持dcm_sp。
解决:
1、查到Synplify 8.8以上版本的unisims.v中均有dcm_sp,也就是说可以使用dcm_sp在synplify中综合。
2、查到ISE 8.1以前的unisim库中也没有dcm_sp,但是ISE 8.1已经支持spartan 3E。于是查看用Coregen生成的DCM模板,其.v文件调用了DCM模块,而不是DCM_SP。也就是说直接例化DCM应该也是可以的
Aug
20
Aug
13
1. 确定要delay的信号是时钟信号还是数据信号。
如果是free running的时钟信号,频率在DCM操作范围之内,要记得使用DCM做Phase Shift。
2. 如果是V5,可以用ODELAY
3. 如果有一个快速的时钟,而要做一个大于一个时钟的delay,那么可以用shift register。SRL16可以将一个LUT当16个Shift register使。
4. 如果以上条件都不满足,就只好用LUT搭延时链了。
如果不要求动态改变延时长度,那么就多次使用这样的LUT:
如果要求能动态改变延时长度,可以用这个代码
下载文件
如果是free running的时钟信号,频率在DCM操作范围之内,要记得使用DCM做Phase Shift。
2. 如果是V5,可以用ODELAY
3. 如果有一个快速的时钟,而要做一个大于一个时钟的delay,那么可以用shift register。SRL16可以将一个LUT当16个Shift register使。
4. 如果以上条件都不满足,就只好用LUT搭延时链了。
如果不要求动态改变延时长度,那么就多次使用这样的LUT:
引用
LUT4 delay( .I0(1'b1), .I1(1'b1), .I2(1'b1), .I3(clk_in), .O(delay1) );
defparam delay.INIT = 16'hff00;
// synthesis attribute INIT of delay is "ff00";
defparam delay.INIT = 16'hff00;
// synthesis attribute INIT of delay is "ff00";
引用
LUT4_u0 : LUT4
generic map (
INIT => X"ff00")
port map (
O => delay_out, -- LUT general output
I0 => '0', -- LUT input
I1 => '0', -- LUT input
I2 => '0', -- LUT input
I3 => delay_in -- LUT input
);
generic map (
INIT => X"ff00")
port map (
O => delay_out, -- LUT general output
I0 => '0', -- LUT input
I1 => '0', -- LUT input
I2 => '0', -- LUT input
I3 => delay_in -- LUT input
);
如果要求能动态改变延时长度,可以用这个代码
下载文件
Jul
16
和Kingbeful同学讨论了infer memory的问题。
Infer ROM/RAM,一般使用Language Template --> Verilog --> Synthesis Constructs --> Coding Examples --> RAM/ROM。
要对ROM/RAM做初始化,可以用readmemb/readmemh这两个system task。功能都是读取外部的文件来初始化内存。
XST, ISIM, ModelSim都支持readmemh/readmemb。
readmemb的基本格式是:
initial begin
$readmemh("mem.data", my_memory, start_address, end_address);
end
其中,start_address和end_address都是可选项。
不写start_address的时候,默认从高位地址写起。
如果要从低位写起,start address = 0。
例子工程:
下载文件
参考资料:
asic-world - 不过XST不支持数据文件中有任何其他字符,包括注释和下划线。
XST User Guide
Infer ROM/RAM,一般使用Language Template --> Verilog --> Synthesis Constructs --> Coding Examples --> RAM/ROM。
要对ROM/RAM做初始化,可以用readmemb/readmemh这两个system task。功能都是读取外部的文件来初始化内存。
XST, ISIM, ModelSim都支持readmemh/readmemb。
readmemb的基本格式是:
initial begin
$readmemh("mem.data", my_memory, start_address, end_address);
end
其中,start_address和end_address都是可选项。
不写start_address的时候,默认从高位地址写起。
如果要从低位写起,start address = 0。
例子工程:
下载文件 参考资料:
asic-world - 不过XST不支持数据文件中有任何其他字符,包括注释和下划线。
XST User Guide
Jul
10
在Verilog中,可以使用`ifdef很方便地控制程序的结构,比如:
但是如果使用了这种结构,XST是不能自动认出工程的层次结构的,因此综合的时候有可能会报告某个文件找不到的错误。
解决方法是,手动编辑XST生成的xx.prj文件,把漏编译的文件名添加到xx.prj的头上就可以了。
引用
`ifdef FPGA_IMP
module_A_instantiate (
..
..
);
`else
module_B_instantiate (
..
..
);
`endif
module_A_instantiate (
..
..
);
`else
module_B_instantiate (
..
..
);
`endif
但是如果使用了这种结构,XST是不能自动认出工程的层次结构的,因此综合的时候有可能会报告某个文件找不到的错误。
解决方法是,手动编辑XST生成的xx.prj文件,把漏编译的文件名添加到xx.prj的头上就可以了。











