概述
输入
/
输出延迟单元(
IODELAY
)简介
每个
I/O
模块包含一个可编程绝对延迟单元,称为
IODELAY
。
IODELAY
可以连接到
ILOGIC/ISERDES
或
OLOGIC/OSERDES
模块,也可同时连接到这两个模块。
IODELAY
是
具有
64
个
tap
的环绕延迟单元,具有标定的
tap
分辨率(见附图
1
)。
IODELAY
可用于组
合输入通路、寄存输入通路、组合输出通路或寄存输出通路,还可以在内部资源中直接使用。
IODELAY
允许各输入信号有独立的延迟。通过在《
Virtex-5
数据手册》中规定的范围内选
择
IDELAYCTRL
参考时钟,可以改变
tap
延迟分辨率。
IODELAY
资源可用作
IDELAY
、
ODELAY
或组合延迟。
1
、当用作
IDELAY
时,数据从
IBUF
或内部资源输入,然后输出到
ILOGIC/ISERDES
。
有三种可用操作模式:
• 零保持时间延迟模式(
IDELAY_TYPE = DEFAULT
)
这种操作模式允许向后兼容,以使用
Virtex-II
、
Virtex-II Pro
和
Virtex-4
器件中的零保
持时间延迟功能的设计。当在没有
DCM
的情况下使用全局时钟采集数据(引脚到引脚参数)
时,用这种延迟单元提供“非正保持时间”。在这种模式下使用时,不需要例化
IDELAYCTRL
基元。有关更多详情,请见“
IDELAYCTRL
用法及设计指导原则”。
• 固定延迟模式(
IDELAY_TYPE = FIXED
)
在固定延迟模式下,配置时将延迟值预设置成由属性
IDELAY_VALUE
确定的
tap
数。
此值配置后不可更改。在这种模式下使用时,必须例化
IDELAYCTRL
基元。有关更多详情,
请见“
IDELAYCTRL
用法及设计指导原则”。
• 可变延迟模式(
IDELAY_TYPE = VARIABLE
)
在可变延迟模式下,可以在配置后通过操控控制信号
CE
和
INC
来改变延迟值。在这
种模式下使用时,必须例化
IDELAYCTRL
基元。有关更多详情,请见“
IDELAYCTRL
用法及设计指导原则”。
2
、当用作
ODELAY
时,数据从
OLOGIC/OSERDES
输入,然后输出到
OBUF
。有一种
可用操作模式:
• 固定延迟输出模式
在固定延迟输出模式下,配置时将延迟值预设置成由属性
ODELAY_VALUE
确定的
tap
数。此值配置后不可更改。在这种模式下使用时,必须例化
IDELAYCTRL
基元。有关更多
详情,请见“
IDELAYCTRL
用法及设计指导原则”。
3
、当用作双向延迟时,将
IOB
配置成双向模式。
IODELAY
交替延迟输入通路和输出
通路上的数据。有两种可用操作模式:
• 固定
IDELAY
(
IDELAY_TYPE = FIXED
)和固定
ODELAY
模式
在 这 种 模 式 下 ,
IDELAY
和
ODELAY
的 值 都 是 在 配 置 时 预 设 置 , 分 别 由
IDELAY_VALUE
和
ODELAY_VALUE
属性确定。此值配置后不可更改。在这种模式下使
用时,必须例化
IDELAYCTRL
基元。有关更多详情,请见“
IDELAYCTRL
用法及设
计指导原则”。
• 可变
IDELAY
(
IDELAY_TYPE = VARIABLE
)和固定
ODELAY
模式
在这种模式下,只有
IDELAY
值可以在配置后通过操控控制信号
CE
和
INC
来动态更
改。
IODELAY
基元中
T
引脚的逻辑级别动态确定模块是
IDELAY
模式还是
ODELAY
模式。
在这种模式下使用时,必须例化
IDELAYCTRL
基元。有关更多详情,请见“
IDELAYCTRL
用法及设计指导原则”。
表
1-1
列出了
IODELAY
支持的配置。
表
1-1
:
IODELAY
支持的配置
IODELAY
基元
图
1-1
所示为
IODELAY
基元。
图
1-1
:
IODELAY
基元
表
1-2
列出了
IODELAY
基元中的可用端口。所有端口均为
1
位宽。
表
1-2
:
IODELAY
基元端口
IODELAY
端口
来自
IOB
的数据输入
-IDATAIN
IDATAIN
输入由相应的
IOB
驱动。在
IDELAY
模式下,可以将数据驱动到
ILOGIC/ISERDES
模块或直接驱动到
FPGA
内部资源中,也可以通过
DATAOUT
端口
按照由
IDELAY_VALUE
设置的延迟将数据同时驱动到这二者。
来自
FPGA
内部资源的数据输入
-ODATAIN
ODATAIN
输入由
OLOGIC/OSERDES
驱动。在
ODELAY
模式下,
ODATAIN
按照由
ODELAY_VALUE
设置的延迟驱动连接到
IOB
的
DATAOUT
端口。
来自
FPGA
内部资源的
IODELAY
的数据输入
-DATAIN
DATAIN
输入直接由
FPGA
内部资源驱动,以提供一条可访问内部资源逻辑的延迟线。
数据按照由
IDELAY_VALUE
设置的延迟通过
DATAOUT
端口返回到内部资源中。
DATAIN
可以在芯片内反转。数据不能驱动到
IOB
。
数据输出
-DATAOUT
来自三个数据输入端口的延迟数据。
DATAOUT
连接到内部资源(
IDELAY
模式)或
IOB
(
ODELAY
模式),或同时连接到这二者(双向延迟模式)。如果在双向延迟模
式下使用,则
T
端口在
IDATAIN
和
ODATAIN
通路之间动态切换,根据来自
OLOGIC
模块的三态信号
T
所指示的方向交替提供输入
/
输入延迟。
三态输入
-T
这是三态输入控制端口。对于双向操作,
T
引脚信号还控制
OBUFT
的
T
引脚。
时钟输入
-C
对
IODELAY
基元的所有控制输入(
RST
、
CE
和
INC
)均与时钟输入(
C
)同步。当
I
ODELAY
配置成可变模式时,必须将一个时钟连接到此端口。
C
可以在芯片内反转。
模块复位
-RST
IODELAY
复位信号
RST
将延迟单元复位到由
IDELAY_VALUE
或
ODELAY_VALUE
属性设置的值。如果未指定这些属性,则假定该值为零。
RST
信号是高有效复位,与
输入时钟信号(
C
)同步。
表
1-3
概述了控制引脚的功能。
表
1-3
:控制引脚描述
递增
/
递减信号
– CE
、
INC
递增
/
递减由使能信号(
CE
)控制。当
IDELAY_TYPE = VARIABLE
时,此接口只可用
于
IDELAY
模式。
只要
CE
保持为
High
,
IDELAY
就会每时钟(
C
)周期按
IDELAYRESOLUTION
递增
或递减。
INC
的状态确定
IDELAY
是递增还是递减:
INC = 1
为递增,
INC = 0
为递减,与
时钟(
C
)同步。如果
CE
为
Low
,则通过
IDELAY
的延迟不变,与
INC
的状态无关。
当
CE
转为
High
时,在下一个时钟上升沿上开始递增
/
递减操作。当
CE
转为
Low
时,
在下一个时钟上升沿上停止递增
/
递减操作。
IODELAY
是环绕可编程延迟单元。当达到延迟单元的末尾(
tap 63
)时,随后的递增
功能就会返回到
tap0
。同样的规则也适用于递减功能,即低于零的递减会转到
tap 63
。表
1-4
概述了递增
/
递减操作。
表
1-4
:递增
/
递减操作
IODELAY
属性
表
1-5
列出了
IODELAY
的属性。
表
1-5
:
IODELAY
属性概述
IDELAY_TYPE
属性
IDELAY_TYPE
属性设置所用延迟的类型。此属性的值是
DEFAULT
、
FIXED
和
VARIABLE
。当设置成
DEFAULT
时,选择零保持时间延迟单元。当在没有
DCM
的情况下
使用全局时钟采集数据(引脚到引脚参数)时,用这种延迟单元提供非正保持时间。
当设置成
FIXED
时,
tap
延迟值固定为由
IDELAY_VALUE
属性设置确定的
tap
数。此
值是预设置的,配置后不可更改。
当设置成
VARIABLE
时,选择可变
tap
延迟单元。
Tap
延迟可以通过设置
CE = 1
和
INC
=1
递增,或通过设置
CE = 1
和
INC = 0
递减。递增
/
递减操作与输入时钟信号
C
同步。
IDELAY_VALUE
属性
IDELAY_VALUE
属性指定初始
tap
延迟数。可能的值是
0
到
63
之间的任意整数。默
认值是零。当
tap
延迟复位时,
tap
延迟值恢复到
IDELAY_VALUE
。在可变模式下,此属
性确定延迟线的初始设置。
ODELAY_VALUE
属性
ODELAY_VALUE
指定
tap
延迟数。可能的值是
0
到
63
之间的任意整数。默认值是零。
当
tap
延迟复位时,
tap
延迟值恢复到
ODELAY_VALUE
。
HIGH_PERFORMANCE_MODE
属性
当设置为
TRUE
时,此属性减少输出抖动。输出抖动减少导致
IODELAY
单元的功率
耗散略有上升。
SIGNAL_PATTERN
属性
SIGNAL_PATTERN
属性致使时序分析器计入数据或时钟通路中的相应延迟链抖动量。
IODELAY
时序
表
1-6
为
IODELAY
开关特性。
表
1-6
:
IODELAY
开关特性
图
1-2
所示为
IDELAY
时序图。假设
IDELAY_VALUE = 0
。
图
1-2
:
IDELAY
时序图
时钟事件
1
在
C
的上升沿上检测到复位,致使输出
O
选择
tap 0
为
64 tap
链的输出(假设
IDELAY_VALUE = 0
)。
时钟事件
2
在
C
的上升沿上检测到
CE
和
INC
的脉冲。这说明是递增操作。输出从
tap 0
到
tap 1
无毛刺变化。请见“递增
/
递减操作后的稳定性”。
时钟事件
3
至此,输出已经稳定在
tap 1
,因而完成了递增操作。输出无限期地保持在
tap 1
,直到
RST
、
CE
或
INC
引脚上有进一步活动。
递增
/
递减操作后的稳定性
图
1-2
显示了输出从一个
tap
向另一个变化时的不稳定时段。显然,当
tap 0
处的数据值
与
tap 1
处的数据值不同时,输出必须改变状态。然而,如果
tap 0
和
tap 1
处的数据值相同
(例如两者都是
0
或
1
),则从
tap 0
到
tap 1
的过渡就不会在输出上造成毛刺或混乱。这一
概念可以通过设想
IODELAY
的
tap
链中的接收器数据信号来理解。如果
tap 0
和
tap1
都靠
近接收器数据眼的中心,则在
tap 0
处采样的数据应与在
tap 1
处采样的数据没有区别。在这
种情况下,从
tap 0
到
tap 1
的过渡不会引起输出变化。为了确保这种情况,
IODELAY
的递
增
/
递减操作设计成了无毛刺操作。
在活动用户数据通过
IODELAY
单元时,用户可以实时动态调整
IODELAY
的
tap
设置,
不会扰乱活动用户数据。
当在时钟信号通路中使用
IODELAY
单元时,也适用无毛刺行为。调整
tap
设置不会在
输出上引起毛刺或混乱。可以调整时钟通路中
IODELAY
单元的
tap
设置,不会扰乱可能正
在该时钟上运行的状态机。
IDELAYCTRL
概述
如果用设置为
FIXED
或
VARIABLE
的
IOBDELAY_TYPE
属性例化
IODELAY
或
ISERDES
基元,则必须在代码中例化
IDELAYCTRL
模块。
IDELAYCTRL
模块在其区域内
连续标定各延迟单元(
IODELAY
)(见图
1-5
),以减少随工艺、电压和温度变化的影响。
IDELAYCTRL
模块使用用户提供的
REFCLK
标定
IODELAY
。
IDELAYCTRL
基元
图
1-3
所示为
IDELAYCTRL
基元。
图
1-3
:
IDELYACTRL
基元
IDELAYCTRL
端口
RST-
复位
复位输入引脚(
RST
)是
High
有效异步复位。
IDELAYCTRL
在配置(以及
REFCLK
信 号 稳 定 ) 之 后 必 须 复 位 , 以 确 保
IODELAY
操 作 正 常 。 要 求 复 位 脉 冲 宽 度 为
TIDELAYCTRL_RPW
(详见附图
1
)。
IDELAYCTRL
在配置后必须复位。
REFCLK-
参考时钟
参考时钟(
REFCLK
)提供对
IDELAYCTRL
的时间参考,以标定同区域中的所有
IODELAY
模块。此时钟必须由全局时钟缓冲器(
BUFGCTRL
)驱动。
REFCLK
必须是
FIDELAYCTRL_REF ±
指定的
ppm
容差(
IDELAYCTRL_REF_PRECISION
),以保证指定
的
IODELAY
分辨率
(TIDELAYRESOLUTION)
。
REFCLK
可以由用户提供的信号源、
PLL
或
DCM
直接提供,必须在全局时钟缓冲器上传输。
RDY-
就绪
就绪(
RDY
)信号指示特定区域内的
IODELAY
模块标定完毕。如果
REFCLK
在一个
或几个时钟周期内保持为
High
或
Low
,则
RDY
信号置为无效。如果
RDY
置为
Low
无效,
则
IDELAYCTRL
模块必须复位。实现工具允许不连接
/
忽略
RDY
。图
1-4
所示为
RDY
与
RST
之间的时序关系。
IDELAYCTRL
时序
表
1-7
所示为
IDELAYCTRL
开关特性。
表
1-7
:
IDELAYCTRL
开关特性
如下图
1-4
所示,
Virtex-5 RST
是边沿触发信号。
图
1-4
:
RDY
与
RST
之间的时序关系
IDELAYCTRL
位置
每个时钟区域的每个
I/O
列中都有
IDELAYCTRL
模块。一个
IDELAYCTRL
模块标定
其时钟区域内的所有
IDELAY
模块。图
1-5
所示为各
IDELAYCTRL
模块的相对位置。
图
1-5
:各
IDELAYCTRL
模块相对位置
IDELAYCTRL
用法及设计指导原则
本部分讲述
Virtex-5 IDELAYCTRL
模块的使用、设计指导原则和推荐用法。
例化无
LOC
约束的
IDELAYCTRL
当例化无
LOC
约束的
IDELAYCTRL
时,用户在
HDL
设计代码中必须只例化一个
IDELAYCTRL
实例。实现工具将
IDELAYCTRL
实例自动复制到整个器件,甚至复制到未
使用延迟单元的时钟区域中。这样做资源占用率较高,在每个时钟区域内都要使用一个全局
时钟资源,并且使用布线资源较多,因此功耗较大。
(注:在简单工程中对
IDELAYCTRL
基元是否制定
LOC
约束,通过用
XPOWER
工具对功耗进行估算对比发现,是否制定
LOC
对功耗影响不大或者几乎无影响,但在大规模工程中,会由于
LOC
约束的指定带来功耗的
额外增加)
已例化
IDELAYCTRL
实例的
RST
和
REFCLK
输入端口和所复制
IDELAYCTRL
实例的对应输入端口相连接。
有两个特例:
1
、当忽略
RDY
端口时,所有被复制的
IDELAYCTRL
实例的
RDY
信号均不连接。
对于例化无
LOC
约束的
IDELAYCTRL
基元并且不连接
RDY
输出端口的情况,《库指南》
中提供了
VHDL
和
Verilog
使用模型。
图
1-6
所示为例化
IDELAYCTRL
组件后形成的电路。
图
1-6
:例化无
LOC
约束的
IDELAYCTRL-
不连接
RDY
2
、当连接
RDY
端口时,例化一个宽度等于时钟区域数的与门,并且将例化和复制的
IDELAYCTRL
实 例 的
RDY
输 出 端 口 连 接 到 与 门 的 输 入 。 工 具 将 连 接 到 已 例 化
IDELAYCTRL
实例的
RDY
端口的信号名称赋予与门的输出。
对于例化无
LOC
约束的
IDELAYCTRL
基元并且连接
RDY
端口的情况,《库指南》中
提供了
VHDL
和
Verilog
使用模型。图
1-7
所示为例化
IDELAYCTRL
组件后形成的电路。
图
1-7
:
例化无
LOC
约束的
IDELAYCTRL-
连接
RDY
例化有位置(
LOC
)约束的
IDELAYCTRL
使用
IDELAYCTRL
模块的最有效方法是定义并锁定设计中所用每个
IDELAYCTRL
实
例的位置。具体做法是例化有位置(
LOC
)约束的
IDELAYCTRL
实例。用户必须在用延迟
单元时定义并锁定所有
ISERDES
和
IDELAY
组件的位置。(
IOBDELAY_TYPE
属性设置
为
FIXED
或
VARIABLE
。)完成后,可以选择
IDELAYCTRL
的位置并指定
LOC
约束。
Xilinx
强烈建议使用有
LOC
约束的
IDELAYCTRL
。
(注:如图
1-5
所示,一个
IDELAYCTRL
基元可同时覆盖一个
clock region
,而一个
clock
region
包含不止一个
IOB
,在约束
IDELAYCTRL
基元
LOC
时,需要仔细定位该
IOB
属于
哪个
LOC
的
IDELAYCTRL
。)
位置约束
每个
IDELAYCTRL
模块都有
XY
位置坐标(
X
:行,
Y
:列)。为了约束位置,
IDELAYCTRL
实例可以附带
LOC
属性。
IDELAYCTRL
位置坐标的命名规则与用来命名
CLB
位置的规则不同。这样做便于在各阵列之间传递
LOC
属性。
为
IDELAYCTRL
实例附加
LOC
属性有两种方法。
1
、在
UCF
文件中插入
LOC
约束
2
、在
HDL
设计文件中直接嵌入
LOC
约束
在
UCF
文件中插入
LOC
约束
下列语法用于在
UCF
文件中插入
LOC
约束。
INST
“
instance_name
”
LOC=IDELAYCTRL_X#Y#
;
在
HDL
设计文件中直接嵌入
LOC
约束
下列语法用于在
HDL
设计文件中嵌入
LOC
约束。
// synthesis attribute loc of instance_name is "IDELAYCTRL_X#Y#";
在
VHDL
代码中,用
VHDL
属性描述
LOC
约束。约束必须用下列语法声明后才能使
用:
attribute loc : string
;
声明之后,
LOC
约束可以指定为:
attribute loc of instance_name:label is "IDELAYCTRL_X#Y0#";
《库指南》包括用于例化有
LOC
约束的
IDELAYCTRL
基元的
VHDL
和
Verilog
使用模型
模板。
图
1-8
所示为例化
IDELAYCTRL
组件后形成的电路。
图
1-8
:例化有
LOC
约束的
IDELAYCTRL
例化有
LOC
约束和无
LOC
约束的
IDELAYCTRL
在有些情况下,用户例化有
LOC
约束的
IDELAYCTRL
模块,但还例化无
LOC
约束的
IDELAYCTRL
模块。如果用无位置约束的
IDELAYCTRL
模块例化
IP
核,但还需要为设计
的另一部分例化无
LOC
约束的
IDELAYCTRL
模块,则实现工具会执行以下各项:
• 按“例化有位置(
LOC
)约束的
IDELAYCTRL
”部分所述例化
LOC IDELAYCTRL
实例。
• 复制无位置约束的
IDELAYCTRL
实例,以便用一个
IDELAYCTRL
实例填充每个不
具备有位置约束
IDELAYCTRL
实例的时钟区域。
• 将无位置约束
IDELAYCTRL
实例的
RST
和
REFCLK
输入端口和所复制
IDELAYCTRL
实例的对应输入端口相连接。
• 如果忽略无位置约束
IDELAYCTRL
实例的
RDY
端口,则同时忽略所复制
IDELAYCTRL
实例的所有
RDY
信号。
• 如果连接无位置约束
IDELAYCTRL
实例的
RDY
端口,则将无位置约束实例的
RDY
端口和所复制实例的
RDY
端口连接到一个自动生成的与门。实现工具将连接到无位置约束
实例的
RDY
端口的信号之名称赋予与门的输出。
• 有位置约束实例的所有端口(
RST
、
REFCLK
和
RDY
)均相互独立并且独立于复制
的实例。
图
1-9
所示为例化
IDELAYCTRL
件后形成的电路。
图
1-9
:
IDELAYCTRL
单元的混合例化例化
例化多个无
LOC
约束的
IDELAYCTRL
禁止例化多个无
LOC
属性的
IDELAYCTRL
。如果发生这种情况,实现工具就会报错。
(注:若在一个工程中同时例化多个不同
DELAY_SRC
属性,且无
LOC
约束的
IODELAY
时,只需例化一个
IDELAYCTRL
模块,否则
map
会报错。举例在同一个工程中需要例化一
个固定
IDELAY_VALUE
的
IODELAY_INST0
的
DELAY_SRC
属性设置为“
I
”,表示其输
入为
IDATAIN
,而同时需要例化另外一个固定
ODELAY_VALUE
的
IODELAY_INST1
的
DELAY_SRC
属性设置为“
O
”,其输入为
ODATAIN
,但是
IODELAY_INST0
和
IODELAY_INST1
使用时均无
LOC
约束,在例化
IDELAYCTRL
基元时,只需例化一个
IDELAYCTRL
基元,无需因为例化两个不同属性的
IODELAY
基元而分别例化两个
IDELAYCTRL
基元,否则
map
会报错。)
参考文献
:
【
1
】:
ug190-Virtex-5
用户指南
【
2
】:
ds202- Virtex-5 Data Sheet: DC and Switching Characteristics
【
3
】:
v5ldl-Virtex-5 Libraries Guide for HDL Designs
附图
1
:
tap
延迟精度及相关时序参数
Verilog Instantiation Template
// IODELAY: Input and Output Fixed/variable Delay Element
// Virtex-5
// Xilinx HDL Libraries Guide, version 9.1i
IODELAY # (
.DELAY_SRC ( "I" ), // Specify which input port to be used
// "I"=IDATAIN, "O"=ODATAIN, "DATAIN"=DATAIN
.IDELAY_TYPE ( "DEFAULT" ), // "DEFAULT", "FIXED" or "VARIABLE"
.IDELAY_VALUE ( 0 ), // 0 to 63 tap values
.ODELAY_VALUE ( 0 ), // 0 to 63 tap values
.REFCLK_FREQUENCY ( 200.0 ) // Frequency used for IDELAYCTRL
// 175.0 to 225.0
) IODELAY_INST (
.DATAOUT ( DATAOUT ), // 1-bit delayed data output
.C ( C ), // 1-bit clock input
.CE ( CE ), // 1-bit clock enable input
.DATAIN ( DATAIN ), // 1-bit internal data input
.IDATAIN ( IDATAIN ), // 1-bit input data input (connect to port)
.INC ( INC ), // 1-bit increment/decrement input
.ODATAIN ( ODATAIN ), // 1-bit output data input
.RST ( RST ), // 1-bit active high, synch reset input
.T ( T ) // 1-bit 3-state control input
);
// End of IODELAY_inst instantiation
工程实例:
IODELAY #(
.DELAY_SRC ( "O" ), //IODELAY
源是
ODATAIN
.IDELAY_TYPE ( "FIXED" ), //
静态延迟
.ODELAY_VALUE ( 16 ), //
固定延迟数为
16
个
tap
.REFCLK_FREQUENCY ( 200.0 ) //IDELAYCTRL
参考时钟频率:
200MHz
)IODELAY_INST (
.C ( 1'b0 ), //
可变模式下使用的时钟输入
.CE ( 1'b0 ), //
是否启动递增
/
递减功能
.DATAIN ( 1'b0 ), //
.IDATAIN ( 1'b0 ), //
.INC ( 1'b0 ), //tap
延迟的递增
/
递减选择
.ODATAIN ( qLED ), //
来自
OLOGIC/OSERDES
的信号
.RST ( 1'b0 ), //
将延迟单元次坏皆ど瓒
ǖ
闹,若没有预设定值则复位到
0
.T ( 1'b0 ), //
用作
ODELAY
.DATAOUT ( qLED_cld )
);
IDELAYCTRL IDELAYCTRL_inst (
.RDY ( RDY ), // 1-bit ready output
.REFCLK ( System_Clk ), // 1-bit reference clock input
.RST ( 1'b0 ) // 1-bit reset input
);
#INST "IDELAYCTRL_inst" LOC = IDELAYCTRL_X1Y2; (ucf
文件添加
)
OBUF obuf_qLED (
.I ( qLED_cld ),
.O ( qLED )
);
最后
以上就是舒服汽车为你收集整理的输入/输出延迟单元( IODELAY)简介的全部内容,希望文章能够帮你解决输入/输出延迟单元( IODELAY)简介所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复