Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于remainb的问题 #1

Open
benjstark opened this issue May 17, 2023 · 2 comments
Open

关于remainb的问题 #1

benjstark opened this issue May 17, 2023 · 2 comments

Comments

@benjstark
Copy link

王轩博士您好:
首先非常感谢优质的开源项目,为初学者提高能力提供了可能。目前我有一个小疑问:
在nfca_tx_frame.sv中,remainb怎么计算的?我的理解是它应当与tx_tdatab和为8,但是代码中好像描述的并不是这个意思。
非常期待您的回答。

@WangXuan95
Copy link
Owner

你好,这里的 remainb 来自 lastb 信号,见 nfca_tx_frame.sv 的 104 行:
remainb <= incomplete ? lastb[2:0] : '0;
lastb 的来自 tx_tdatab 信号,见 79 行:
lastb <= tx_tdatab==4'd0 ? 4'd1 : tx_tdatab>4'd8 ? 4'd8 : tx_tdatab;

79 行和104行共同达到的效果是:

  • tx_tdatab=0 时,让 remainb=1 (是一种不应该出现的不合法情况)
  • tx_tdatab=1~7 时,让 remainb=1~7 (发送的最后一个字节是残缺的)
  • tx_tdatab=8 时,让 remainb=0 (发送的最后一个字节是完整的)

tx_tdatab 的合法取值范围是 1~8 ,代表 TX 包的最后一个字节有多少个有效 bit 。
remainb 代表的是即将到达的第一个 bit 应该放在 RX 包的字节的第几位,而不是你理解的即将到达的第一个可能残缺的字节应该有多少个bit。这里我的变量命名确实有点误导性,不应该取 remain 这个词。

例如,TX 的最后一个字节的 tx_tdatab=2 ,说明这个残缺字节的 [1:0] 位是TX的。得到 remainb=2 ,那么 RX 的第一个 bit 应该放在残缺字节的 [2] 位,RX 的第二个字节应该放在残缺字节的 [3] 位, ... 以此类推,直到残缺字节被填满为止。

你可以看一下 nfca_rx_tobytes.sv ,里面有个 cnt 计数器,它在初始时就是先取 remainb 的值 (见49行) :
cnt <= {1'b0, remainb};

然后每RX一个 bit ,就把这个 bit 放在接收字节的第 cnt 位 (见 60 行) :
byte_saved[cnt] <= rx_bit;

并让 cnt 自增:
cnt <= cnt + 4'd1;

希望我的回答能解决你的困惑。

@benjstark
Copy link
Author

感谢王博的回复。代码风格和思路令人受益匪浅。
目前遇到一个新的问题:在nfca_tx_modulate.sv 中,两个localparam 的值是怎么得到的呢?
期待王博的解答。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants