提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔
在工程應(yīng)用中,經(jīng)常會(huì)使用不同頻率的時(shí)鐘。
在不同條件下,出現(xiàn)時(shí)序違例。
在出現(xiàn)時(shí)序違例時(shí),導(dǎo)致編譯時(shí)間過(guò)長(zhǎng)。
一、出現(xiàn)時(shí)序違例?
時(shí)序分析的測(cè)試程序:
`timescale 1ns/1ps
module test_top_1 (
input pri_clock, // 50M主時(shí)鐘
input sec_clk,
input A1,
output A2
);
//MMCM生成20M、30M、50M、100M、200M的衍生時(shí)鐘
wire clk20m,clk30m,clk50m,clk100m,clk200m;
wire locked;
clk_wiz_0 gen_clk
(
// Clock out ports
.clk20m(clk20m), // output clk20m
.clk30m(clk30m), // output clk30m
.clk50m(clk50m), // output clk50m
.clk100m(clk100m), // output clk100m
.clk200m(clk200m), // output clk200m
// Status and control signals
.reset(1'b0), // input reset
.locked(locked), // output locked
// Clock in ports
.clk_in1(pri_clock)); // input clk_in1
//使用50M的時(shí)鐘生成邏輯復(fù)位信號(hào)
reg rst_n;
reg [15:0] rstn_cnt=0;
always @(posedge clk50m) begin : proc_logic_rst
if(~locked) begin
rst_n <= 0;
rstn_cnt<=0;
end else if(rstn_cnt>=1000)begin
rst_n <= 1;
rstn_cnt<=rstn_cnt;
end else begin
rst_n<=0;
rstn_cnt<=rstn_cnt+1;
end
end
reg [31:0] cnt_1;
reg [31:0] cnt_2;
reg [31:0] cnt_3;
reg [31:0] cnt_4;
reg [31:0] cnt_5;
//在20M的時(shí)鐘域下,異步復(fù)位同步釋放,計(jì)數(shù)器1增加
always @(posedge clk20m or negedge rst_n) begin : proc_cnt_1
if(~rst_n) begin
cnt_1 <= 0;
end else if(A1)begin
if(cnt_5>=50000)
cnt_1<=0;
else cnt_1 <= cnt_1+1;
end
end
//在30M的時(shí)鐘域下,異步復(fù)位同步釋放,計(jì)數(shù)器2增加
always @(posedge clk30m or negedge rst_n) begin : proc_cnt_2
if(~rst_n) begin
cnt_2 <= 0;
end else if(cnt_1>31'hff)begin
cnt_2 <= cnt_2+1;
end else
cnt_2<=0;
end
//在50M的時(shí)鐘域下,異步復(fù)位同步釋放,計(jì)數(shù)器3增加
always @(posedge clk50m or negedge rst_n) begin : proc_cnt_3
if(~rst_n) begin
cnt_3 <= 0;
end else if(cnt_5>31'hffff)begin
cnt_3 <= cnt_3+1;
end
end
//在100M的時(shí)鐘域下,異步復(fù)位同步釋放,計(jì)數(shù)器4增加
always @(posedge clk100m or negedge rst_n) begin : proc_cnt_4
if(~rst_n) begin
cnt_4 <= 0;
end else if(cnt_3>32'hffffff)begin
cnt_4 <= cnt_4+1;
end
end
//在200M的時(shí)鐘域下,異步復(fù)位同步釋放,計(jì)數(shù)器5增加
always @(posedge clk200m or negedge rst_n) begin : proc_cnt_5
if(~rst_n) begin
cnt_5 <= 0;
end else if(cnt_1>=8933)begin
cnt_5 <= cnt_5+1;
end
end
//使用clk200m分頻,得出40m時(shí)鐘
localparam priod_cnt_40=200/40;
reg [7:0] div_cnt;
reg clk40m;
always @(posedge clk200m or negedge rst_n) begin : proc_div_cnt
if(~rst_n) begin
div_cnt <= 0;
clk40m<=0;
end else if(div_cnt>=(priod_cnt_40>>1)-1)begin
div_cnt<=0;
clk40m<=~clk40m;
end else begin
div_cnt <= div_cnt+1;
clk40m<=clk40m;
end
end
reg [15:0] cnt_6;
always @(posedge clk40m or negedge rst_n) begin : proc_cnt_6
if(~rst_n) begin
cnt_6 <= 0;
end else if(cnt_5==199)begin
cnt_6 <= 0;
end else cnt_6<=cnt_6+1;
end
//另一路輸入時(shí)鐘
//sec_clk
reg [15:0] cntx_1;
always @(posedge sec_clk or negedge rst_n) begin : proc_cntx_1
if(~rst_n) begin
cntx_1<= 0;
end else begin
cntx_1<= cntx_1+1;
end
end
assign A2=cnt_1[31]&cnt_2[31]&cnt_3[31]&cnt_4[31]&cnt_5[31]&cnt_6[15]&cntx_1[15];
endmodule : test_top_1
1.1編譯過(guò)程中2.4節(jié)(布線初始化后)更新時(shí)序信息
1.2編譯過(guò)程中2.4節(jié)中間時(shí)序總結(jié)
1.3編譯過(guò)程中第5節(jié)更新時(shí)序
編譯完成后時(shí)序總結(jié)
導(dǎo)致時(shí)序違例的原因
注:工程編譯時(shí)間過(guò)長(zhǎng),也沒有提示錯(cuò)誤,可以看一下編譯過(guò)程中的時(shí)序信息。如果負(fù)的太多,先分析一下,等的話不知道要等到什么時(shí)候…(千年等一回,啊 。 。 。。)
二、解決方法
1.編譯過(guò)程中
如圖1-圖3所示,在編譯過(guò)程中,出現(xiàn)負(fù)時(shí)序。
修改組合邏輯減小邏輯級(jí)數(shù)與扇出。
編譯結(jié)果如圖:
2.編譯完
查看vavido工具羅列的時(shí)鐘。
下圖顯示的時(shí)鐘是由MMCM分頻倍頻得出(自動(dòng)生成時(shí)序約束),沒有給出程序中105行200M分頻的40M。
對(duì)生成的時(shí)鐘重新命名,并對(duì)40M時(shí)鐘進(jìn)行約束。
#create_clock -name pri_clock -period 20 -waveform {0 10} [get_ports pri_clock]
create_generated_clock -name clk20m [get_pins gen_clk/inst/mmcm_adv_inst/CLKOUT0]
create_generated_clock -name clk30m [get_pins gen_clk/inst/mmcm_adv_inst/CLKOUT1]
create_generated_clock -name clk50m [get_pins gen_clk/inst/mmcm_adv_inst/CLKOUT2]
create_generated_clock -name clk100m [get_pins gen_clk/inst/mmcm_adv_inst/CLKOUT3]
create_generated_clock -name clk200m [get_pins gen_clk/inst/mmcm_adv_inst/CLKOUT4]
create_generated_clock -name clk40m -source [get_pins gen_clk/inst/mmcm_adv_inst/CLKOUT4] -divide_by 5 [get_pins clk40m_reg/Q]
create_clock -name sec_clk -period 100 -waveform {0 50} [get_ports sec_clk]
set_clock_groups -asynchronous -group [get_clocks clk200m] -group [get_clocks sec_clk]
#min = -(保持時(shí)間)
#max = 建立時(shí)間
set_input_delay -clock clk20m -max 2.0 [get_ports A1]
set_input_delay -clock clk20m -min -1.5 [get_ports A1]
set_output_delay -clock clk200m -max -4.167 [get_ports A2]
set_output_delay -clock clk200m -min -0.0 [get_ports A2]
重新編譯后:
上圖包括程序中出現(xiàn)的所有時(shí)鐘。
時(shí)序總結(jié)如下圖。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-740495.html
總結(jié)
從發(fā)現(xiàn)問(wèn)題,到解決問(wèn)題;
從vivado工具的警告和報(bào)錯(cuò),提示需要關(guān)注時(shí)序分析;
從小工程發(fā)展成大工程,時(shí)序分析還是挺重要的一個(gè)環(huán)節(jié)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-740495.html
到了這里,關(guān)于出現(xiàn)時(shí)序違例怎么解決-VIVADO的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!