问题标签 [digital-design]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
verilog - verilog 模块中加法器输出的错误值
我在 Verilog 中为加法器编写了门级代码。加法器的输出如下所示。如您所见, sum 和 cout 始终在 z 中。我不知道为什么。你能检查一下我错过了什么吗?谢谢你的时间。
输出:
a = x, b = x, cin = x, summ = z, cout = z 在时间 = 0
a = 0, b = 0, cin = 0, summ = z, cout = z 在时间 = 10
a = 0, b = 1, cin = 0, summ = z, cout = z 在时间 = 20
a = 1, b = 0, cin = 0, summ = z, cout = z 在时间 = 30
a = 1, b = 1, cin = 0, summ = z, cout = z 在时间 = 40
a = 0, b = 0, cin = 1, summ = z, cout = z 在时间 = 50
a = 0, b = 1, cin = 1, summ = z, cout = z 在时间 = 60
a = 1, b = 0, cin = 1, summ = z, cout = z 在时间 = 70
a = 1, b = 1, cin = 1, summ = z, cout = z 在时间 = 80
.
.
.
memory - 将位向量存储在触发器中而不是内存中 - Chisel
我想知道ChiselReg
和Mem
Chisel 在用法上的区别,以及如何决定在常见场景中选择哪一个。我认为Mem
在存储大量数据时这是最好的主意,因为它将数据存储到 SRAM 而不是使用 FPGA 片内的触发器,对吗?
如果我想实现一个大的寄存器文件(通常大小的 10 倍),最好使用Mem
then 而不是Reg
?
scheduling - SystemVerilog 寄存器设计避免竞争
在 systemverilog 中进行数字设计时,我遇到了有关赛车条件的问题。
驱动我的设计的测试台(我无法修改)以这样一种方式驱动输入,即设计中的某些寄存器由于竞争条件而无法正常工作。
这是一个 eda-playground 示例,它说明了正在发生的事情(输入在时钟“之前”发生变化,时间为 15ns):
http://www.edaplayground.com/x/rWJ
有没有办法让设计(在这种情况下是一个简单的寄存器)抵抗这个特定的问题?我需要的是像“out_data <= preponed(in_data);”这样的语句 或类似的东西会使输入信号的顺序变化无关紧要。
我已经阅读了 SystemVerilog LRM 中的#1step,但我不确定如何使用它,也不确定它是否可以帮助我解决这个特定问题。
fpga - 将数据从慢时钟域发送到快时钟域
假设我想将数据流从慢时钟域发送到快域,延迟很重要。有什么方法可以确定延迟的下限吗?
标准解决方案是 FIFO,其延迟将提供严格的上限。很明显,数据需要在两个域中注册,并且需要一些时间来解决跨域路径和亚稳态问题。我可能可以实现一个没有任何开销的 FIFO,尽管它的时序约束很难指定(并且可能会满足)。如果在接收域中有一个额外的周期,我当然可以安全地做到这一点。
然而,“似乎很清楚”并不是一个铁板钉钉的论点。也许有一个不明显的实现不涉及将两个同步电路连接在一起。这似乎是一个长镜头,所以也许有一些严格的论据可以提供一个严格的延迟下限?非常感谢。
编辑:当我说下限时,我指的是任何正确解决问题所必须花费的最少时间,而不是任何特定实现的延迟。打个比方:波纹进位加法器有延迟 O(n),这是两个二进制数相加成本的上限(因为我们知道如何以这种速度完成,所以问题不会比这更难)。我们还知道二进制加法必须花费 Omega(log(n)) 时间,因为最高位将取决于 2n 个输入(并且在叶子上构建具有这些输入的树是我们可能做的最好的)。
verilog - 使用 Altera 板的 Verilog 递增递减计数器
嘿,所以我基本上是 Verilog 的新手,不太确定语法是如何工作的以及类似的事情。
任务如下
使用 Altera 板上的按钮和开关来增加或减少 4 位计数器。计数器的值应使用板载 LED 显示。使用开关控制计数器的方向,使用按钮更改计数器值。
这就是我到目前为止所得到的,我不知道它是否正确,当我到达那一点时,我知道如何在板上分配输入和输出,但就是无法编译代码。我不断得到:
错误 (10043):Lab2pt2.v(11) 中的 Verilog HDL 不支持功能错误:不支持对寄存器的程序连续分配。
下面是代码:
binary - VHDL 计数器返回“X”,未知值
我正在尝试使用实例化组件创建一个 4 位计数器,如下所示。当我模拟时,输出在 0 和 X(未知信号)之间切换。我不确定出了什么问题。仿真,电路图和代码如下所示。
4位模数计数器
位片
结构 VHDL
在这里,我对切片使用了生成命令,但我对其进行了硬编码以消除错误
位片测试台
计数器测试台
当我模拟位片时,输出会正确切换,如下所示。
当我模拟组合计数器以获得四位计数器时,它会在无符号值之间切换,如下所示。我不明白问题是什么。
2:
我取出了 control.vhd 中的重置,并消除了 uknown 信号,但它的计数不正确。如下所示。
verilog - 扇出的网络不能被分配多个值
我正在尝试设计一个基于 4 位乘法器的 8 位乘法器。所以这是我的代码:
然后我得到这个错误:
错误 (12014): 扇出到“q[15]”的网络“sum2[11]”不能分配多个值
错误 (12015):网络由“nbit_adder:s3|s[11]”馈送错误 (12015):
网络由“nbit_adder:s4|s[11]”提供
不仅如此。我应该怎么办 ?
verilog - 流水线化一个由 10 个串联组件组成的 verilog 模块
我正在尝试流水线化一个由 5 个乘法器和 5 个串联连接的加法器组成的模块。该模块是一个多项式计算器。在没有流水线的情况下,该模块到目前为止运行良好。
没有流水线的结构如下所示,
由于它们都是串联的,因此关键路径由 10 个组件组成。
我实施的流水线想法如下,
我有一个错误,“不能由原语或连续赋值驱动。”这是由于 p0,p1,p3 ... 寄存器。将它们转换成线可以解决错误,但它们不再是寄存器。我使用iverilog 作为编译器。
我的问题是,如何进行流水线操作,以便使用尽可能少的时钟周期获得输出并解决错误?
******* 带代码的编辑版本 *******
system-verilog - Systemverilog 跨层次边界的接口
当和接口遍历分层边界时,我使用 systemverilog 接口遇到了一些后端问题。我试图在附图中勾勒出情况。
上图显示了使用接口的“常规”方法。接口和连接的模块都在同一层次上实例化。这适用于模拟和后端。
中间的图片显示了我的情况。在顶层,我有一个模块和接口实例化。接口接紫色模块,再接2个子模块。在模拟中这是有效的。
然后综合工具抱怨紫色级别的接口应该是modport。所以我补充说。然而,综合工具将线解释为双向并添加逻辑以促进这一点。在我的设计中,所有电线都是单向的。
我能找到解决此问题的唯一解决方法如下图所示。我通过 modport 连接原始接口(标记为 A)。然后我实例化一个新接口(标记为 B),它与接口 A 具有相同的父接口。接口 A 和 B 都连接到一个连接模块,该模块包含许多语句,例如:
分配接口B.rx1 = 接口A.rx1;
分配接口B.rx2 = 接口A.rx2;
分配 interfaceA.statusX = interfaceB.statusX;
ETC
所以它只是接口A和B的“哑”连接。
这种工作方式感觉非常错误,因为这个连接模块会产生大量开销。是否有一种更好/更简单的方法可以在层次边界上使用界面,不仅可以在模拟中工作,而且可以在综合中工作?