|
50资产
主工程模块的程序如下所示。其实就是一个简单的数据通路。前端以24M的时钟接收数据。然后将收到的数据写入到FIFO中,再以198M的时钟从FIFO中读出数据,然后再输出。
由于时序约束这方面一直都没有弄明白。那位大神帮忙,写一个完整的时序约束。我以后也好照猫画虎的去做。
module Test(
iClk,
iDval,
iData_2,
oDval,
oData_2
);
input iClk;
input iDval;
input [1:0] iData_2;
output reg oDval;
output reg [1:0] oData_2;
wire Clk198M;
//该模块内部就是简单的调用了PLL_BASE原语
PLL_Cfg pll0(
.iClk(iClk), //24M
.oClk1(Clk198M), //198M
.oClk2(),
.oClk3(),
.oClk4(),
.oClk5(),
.oClk6(),
.oPllLocked()
);
reg Dval0;
reg [1:0] Data0;
always @ (posedge iClk)
begin
Dval0 <= iDval;
Data0 <= iData_2;
end
wire prog_empty;
reg RdFifoEn;
wire [1:0] FifoOut;
//XILINX FIFO的IP核
TsetFifo fof0(
.rst (1'b0),
.wr_clk (iClk), //24M的频率下,将输入端口的数据写入到FIFO中
.wr_en (iDval),
.din (iData_2),
.rd_clk (Clk198M), //以198M的频率,从FIFO中读出数据
.rd_en (RdFifoEn),
.dout (FifoOut),
.full (),
.empty (),
.prog_empty (prog_empty)
);
always @ (posedge Clk198M)
begin
if(!prog_empty)
RdFifoEn <= 1'b1;
else
RdFifoEn <= 1'b0;
end
//将从FIFO中读出的数据输出
always @ (posedge Clk198M)
begin
oData_2 <= FifoOut;
oDval <= RdFifoEn;
end
endmodule
我自己参考一些资料,写了几句相应的约束:
//时钟约束
NET "iClk" TNM_NET = iClk;
TIMESPEC TS_iClk = PERIOD "iClk" 41.667 ns HIGH 50%;
//输入信号约束
INST "iData_2<0>" TNM = group_in;
INST "iData_2<1>" TNM = group_in;
INST "iDval" TNM = group_in;
TIMEGRP "group_in" OFFSET = IN 10 ns VALID 5 ns BEFORE "iClk" RISING;
也不知道是否正确,若有不对的地方,请指正。另外,输出端口的约束,我则完全不知道从哪下手了。请大神一定指教啊。 |
最佳答案
查看完整内容
楼主好,我也在学习中,时序分时钟、输入输出、虚拟路径。
其中时钟24m约束了,198m时钟也需要约束,但是是经过pll不知道是否默认也约束的。
其次,group_in里数据怎么会是10ns更新一次呢?那用iclk采样会漏掉很多,而且应该是IN 5 ns valid 10ns 的语法。
|