我在维瓦多做一个设计。我的顶层设计是一个框图。该框图有IP块和我的Verilog RTL模块。每当我更改我的主模块和Verilog更新方框图时,它总是错误地推断我的模块的时钟频率。,我怎样才能解决这个问题?
这个问题令人恼火,问它破坏了我的设计。设计中的所有其他AXI总线都正确地使用了10 the,但是每当我更改main
并更新框图时,Vivado决定main
的AXI总线位于100 the。只要时钟不匹配,我就无法构建。我可以手动更新方框图中块属性中的频率,但是每次我更新main
(因为它是我的主模块)时,这些更改都会被删除。
我尝试为每个AXI总线添加一个专用时钟和重置(尽管它们都连接到同一个网络)。我和X_INTERFACE_PARAMETER
混过了(这里有文档记录吗?)一切都没有结果。
此外,M_AXIS_CMD
是一个主AXI接口,应该位于main
块的输出端。不知道怎么回事。但与时钟相比,这是一个很小的问题。
来源:https://gitlab.com/tessera/pcd8544-tests
模块接口:
module main #(
CLK_FREQ = 50000000// : CLK_FREQ > 0 // clock frequency
)(
(* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME core_clk, ASSOCIATED_RESET core_rst, FREQ_HZ 10000000" *)
(* X_INTERFACE_INFO = "xilinx.com:signal:clock:1.0 core_clk CLK" *)
input clk,
(* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME core_rst, POLARITY ACTIVE_HIGH" *)
(* X_INTERFACE_INFO = "xilinx.com:signal:reset:1.0 core_rst RST" *)
input rst,
(* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME axi_rst, POLARITY ACTIVE_LOW" *)
(* X_INTERFACE_INFO = "xilinx.com:signal:reset:1.0 axi_rst RST" *)
input axi_rst,
(* X_INTERFACE_INFO = "xilinx.com:interface:fifo_write:1.0 DOUT FULL" *)
input wr_full,
(* X_INTERFACE_INFO = "xilinx.com:interface:fifo_write:1.0 DOUT WR_DATA" *)
output reg [8:0] wr_data,
(* X_INTERFACE_INFO = "xilinx.com:interface:fifo_write:1.0 DOUT WR_EN" *)
output reg wr_valid,
// slave AXI-Lite write channel FROM PS
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG AWADDR" *) input wire [4:0] s_axi_reg_awaddr, // address
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG AWPROT" *) input wire [2:0] s_axi_reg_awprot, // channel protection type
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG AWVALID" *) input wire s_axi_reg_awvalid, // address valid
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG AWREADY" *) output wire s_axi_reg_awready, // address ready
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG WDATA" *) input wire [31:0] s_axi_reg_wdata, // data
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG WSTRB" *) input wire [3:0] s_axi_reg_wstrb, // strobes - one bit per byte of data
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG WVALID" *) input wire s_axi_reg_wvalid, // data/strobes valid
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG WREADY" *) output wire s_axi_reg_wready, // data/strobes ready
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG BRESP" *) output wire [1:0] s_axi_reg_bresp, // response
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG BVALID" *) output wire s_axi_reg_bvalid, // response valid
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG BREADY" *) input wire s_axi_reg_bready, // response ready
// slave AXI-Lite read channel FROM PS
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG ARADDR" *) input wire [4:0] s_axi_reg_araddr, // address
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG ARPROT" *) input wire [2:0] s_axi_reg_arprot, // channel protection type
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG ARVALID" *) input wire s_axi_reg_arvalid, // address valid
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG ARREADY" *) output wire s_axi_reg_arready, // address ready
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG RDATA" *) output wire [31:0] s_axi_reg_rdata, // data
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG RRESP" *) output wire [1:0] s_axi_reg_rresp, // response
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG RVALID" *) output wire s_axi_reg_rvalid, // data/response valid
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm_rtl:1.0 S_AXI_REG RREADY" *) input wire s_axi_reg_rready, // data/response ready
// master AXI-Stream command channel TO DataMover
(* X_INTERFACE_INFO = "xilinx.com:interface:axis_rtl:1.0 M_AXIS_CMD TDATA" *) output reg [71:0] m_axis_cmd_data,
(* X_INTERFACE_INFO = "xilinx.com:interface:axis_rtl:1.0 M_AXIS_CMD TREADY" *) output reg m_axis_cmd_valid,
(* X_INTERFACE_INFO = "xilinx.com:interface:axis_rtl:1.0 M_AXIS_CMD TVALID" *) input wire m_axis_cmd_ready,
// slave AXI-Stream status channel FROM DataMover
(* X_INTERFACE_INFO = "xilinx.com:interface:axis_rtl:1.0 S_AXIS_STS TDATA" *) input wire [7:0] s_axis_status_data,
(* X_INTERFACE_INFO = "xilinx.com:interface:axis_rtl:1.0 S_AXIS_STS TKEEP" *) input wire [0:0] s_axis_status_keep,
(* X_INTERFACE_INFO = "xilinx.com:interface:axis_rtl:1.0 S_AXIS_STS TLAST" *) input wire s_axis_status_last,
(* X_INTERFACE_INFO = "xilinx.com:interface:axis_rtl:1.0 S_AXIS_STS TREADY" *) input wire s_axis_status_valid,
(* X_INTERFACE_INFO = "xilinx.com:interface:axis_rtl:1.0 S_AXIS_STS TVALID" *) output reg s_axis_status_ready,
// slave AXI-Stream data channel FROM DataMover
(* X_INTERFACE_INFO = "xilinx.com:interface:axis_rtl:1.0 S_AXIS_DATA TDATA" *) input wire [31:0] s_axis_stream_data,
(* X_INTERFACE_INFO = "xilinx.com:interface:axis_rtl:1.0 S_AXIS_DATA TKEEP" *) input wire [3:0] s_axis_stream_keep,
(* X_INTERFACE_INFO = "xilinx.com:interface:axis_rtl:1.0 S_AXIS_DATA TLAST" *) input wire s_axis_stream_last,
(* X_INTERFACE_INFO = "xilinx.com:interface:axis_rtl:1.0 S_AXIS_DATA TREADY" *) input wire s_axis_stream_valid,
(* X_INTERFACE_INFO = "xilinx.com:interface:axis_rtl:1.0 S_AXIS_DATA TVALID" *) output reg s_axis_stream_ready,
// DataMover memory-mapped to stream error
input wire datamover_mm2s_err
);
发布于 2018-02-26 22:09:35
它总是错误地推断出我的模块的时钟频率。我怎么才能解决这个问题?
我从你的git中提取,它在Vivado 2017.4中运行得很好。你可能把几件不同的事情混为一谈,而且很可能是在期待一些不该发生的事情发生。这是完全可以理解的,因为缺乏适当的(但有用的) Vivado IP包和框图工具的文档。
FREQ_HZ
从(* X_INTERFACE_PARAMETER ... *)
中删除了。这可能导致了你提到的时钟错配,但即使我把它放回去,它现在对我也没问题。但是,FREQ_HZ
只应用于输出(生成)时钟;见下文。
,
CLK_FREQ
Verilog参数能够根据引脚神奇地更新。只要模块是新的,GUI中的参数就会采用默认值。他们可以编辑,应该停留在一个更新周期,但有可能,他们将不得不重置,因为主要的编辑。--这取决于您是否设置这些参数来匹配。/opt/Xilinx/Vivado/2017.4/data/ip/xilinx/axi_uartlite_v2_0/bd/bd.tcl
文件中,您可以看到这是如何完成的。这里有记录吗?
有一些关于在UG994中使用HDL模块的文档,“在RTL模块中推断控制信号”,但它不是很完整。这方面最好的文档是在"Lite灯泡“的家伙(克利皮的远亲)中,您可以通过按编辑器工具栏中的小灯泡来达到这个目的。
write_bd_tcl
和write_project_tcl
的命令。如果(经常)需要在项目损坏时重新生成该项目,这将允许完全一致的结果。(* X_INTERFACE... *)
内容的头的一个片段。如果时钟运行AXI总线,也添加ASSOCIATED_BUSIF
标志:
(* X_INTERFACE_INFO = "xilinx.com:signal:clock:1.0 core_clk CLK“*) (* X_INTERFACE_PARAMETER = "ASSOCIATED_RESET reset”*)输入clk,(* X_INTERFACE_INFO =“xilinx.com:信号:reset:1.0 core_rst RST”*) (* X_INTERFACE_PARAMETER =“极性ACTIVE_HIGH”*)输入rst,https://stackoverflow.com/questions/48983355
复制相似问题