问题标签 [digital-logic]
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.
compiler-errors - VHDL 错误(需要简单的表达式)
我是 VHDL 新手,我的代码有问题,我似乎无法修复。我们应该使用选定的信号分配或表格查找来做到这一点。我的是两者的结合,因为我们应该使用不关心不会发生的输入。
该代码基本上应该为 2 的补码输入或偏移二进制提供相同的输出。因此,例如,十进制数 7 在偏移二进制中是“1111”,在 2 的补码中是“0111”。两种形式都应根据开关 oe 的值生成“1111100000”的输出('1' 表示偏移二进制,'0' 表示 2 的补码)。
我已经在这个级别尽可能多地调试了我的代码,但我不明白我做错了什么。
Active-HDL 目前在第 48 行和第 55 行出现错误。我收到两个“预期的简单表达式”错误。
我的代码位于下面的 pastebin URL,因为它允许更好的可读性和语法突出显示(另外,我不喜欢摆弄 Stack Exchange 发布代码的奇怪方式)。此外,如果您对如何在维护分配说明的同时改进代码有任何提示,请随时提出任何建议。
verilog - 在始终块内使用电线?
我可以在 always 块内使用电线吗?例如:
它被编译而没有抛出任何错误。为什么?
c - 为什么按位运算比旧微处理器上的加法/减法运算略快?
我今天看到了这段摘录:
在大多数较旧的微处理器上,按位运算比加法和减法运算稍快,通常比乘法和除法运算快得多。在现代架构中,情况并非如此:按位运算的速度通常与加法相同(尽管仍比乘法快)。
我很好奇为什么按位运算比旧微处理器上的加法/减法运算要快一些。
我能想到的所有会导致延迟的是,实现加法/减法的电路取决于几个级别的逻辑门(并行加法器等),而按位运算的电路实现要简单得多。这是原因吗?
我知道算术和按位运算都在现代处理器上的一个时钟周期内执行,但纯粹谈谈电路的传播时间,理论上现代处理器中的延迟是否仍然存在?
最后,我有一个关于按位移位操作执行的概念性 C 问题:
两者x
和y
都应该保持 value 32
,但是否需要5次单独的左移才能x
达到该值(如通过管道实现的按位移位)?为了澄清,我纯粹是在询问电路行为而不是时钟周期数。
assembly - MIPS 存储字节和存储半字实现
我目前正在实现一个单周期 MIPS 处理器,并且正在实现 SB 和 SH 指令。我已经使用这个线程的想法成功地实现了 LB/LBU 和 LH/LHU 指令:Load half word and load byte in a single cycle datapath
我在概念化如何实施 SB/SH 指令时遇到了麻烦。我目前的想法是有一个 4:1 MUX,其中每个输入都是当前字的掩码,其字节将被写入。例如,假设我要将字节 0x2E 写入地址 0x10010002,例如当前包含值:[0x10010000] 0xABCD1234。所以写入内存后会是:[0x10010000] 0xAB2E1234。(字节对齐寻址)
所以我要做的是使用 4 个与以下值 0xFFFFFF00、0xFFFF00FF、0xFF00FFFF、0x00FFFFFF 来屏蔽地址 0x10010000 处的单词。MUX 的选择位将来自地址的低两位。
与此同时,我们获取字节,对其进行零扩展,然后对其执行一些不同的移位以将其放置在掩码的正确位置。这些不同的移位值将再次进入具有相同相应选择位的 MUX。例如,如果地址的低两位为 0,则无需移位,如果为 01,则左移一个字节。如果是 10,我们左移 2 个字节。如果为 11,则左移 3 个字节(或循环右移 1 个字节)
然后,我们将 MUX 和 OR 中的值放在一起以获得要存储的最终值。所以对于上面的例子:
低两位是 10,所以 MUX 选择 0xFF00FFFF 与 0xABCD1234 相乘,得到 0xAB001234 的输出值。字节左移 4 变为 0x002E0000,然后与 0xAB001234 进行 OR 运算以变为 0xAB2E1234,然后被存储。
当然,这扩展到具有相同想法的 SH 指令。我希望我的例子有意义。我可能会以这种方式实现它,除非有一种我没有看到的更简单的方法来做到这一点。我一直在盯着硬件设计这么久,我可能会错过一些更简单的实现。
谢谢。
algorithm - 如何减少具有大量输入变量的真值表
减少输入变量数量大于 6 的真值表生成的表达式的算法。
更通用的问题是:减少由具有输入变量数量 n 的真值表生成的表达式的算法:其中 n > 6
processor - 是否有必要让“控制单元下一个状态寄存器”触发下降沿?
每个模块可以被认为具有以下功能: [1] 它可以存储数据。[2] 可以对数据进行运算。(算术运算)
模块的一些属性(仅列出,我现在关心的。) [1] 模块中的所有寄存器/内存元素都是上升沿触发的。
现在这种架构可以用来创建计算机处理器的模型。
真正的交易:是否有必要让“控制单元下一个状态寄存器”被触发下降?(下面我解释为什么我这么认为)
该控制信号只是输入和电流状态的组合结果。所以这意味着随着当前状态的变化,控制信号会发生变化,这意味着状态应该在下降沿发生变化[1]。所以状态变化只是发生在时钟下降沿的“控制单元状态寄存器”的变化。这就是为什么我认为“是否有必要让“控制单元下一个状态寄存器”被触发下降沿”......我在想/考虑正确吗?
如果是,那么在实际处理器中也应该发生相同的情况(控制单元状态寄存器的下降沿触发)。
我正在学习东西,所以请原谅+纠正我的错误
hardware - 是否可以避免指定默认值以便在 Chisel 中获得 X?
以下Chisel代码按预期工作。
但是,如果我不指定,则会出现编译时错误io.rdData := UInt(0)
,因为需要默认值。有没有办法在默认情况下明确指定X
或让模块没有默认输出 X,erm?
您可能想要这样做的一些原因是,如果ren
未断言,则任何内容都不应依赖于输出,并且 Xs 允许您指定它,并且指定 X 可以告诉综合工具它是无关紧要的,用于优化目的。
verilog - Verilog:在断言复位时存储计数器值
我有以下verilog代码。想法是在复位时存储计数器的值。但是,我不确定它是否可以合成(内存需要同步重置)。我得到了 DRC violatins,内存、bufreadaddr、bufreadval 都被优化了。还有什么其他方法可以写这个?
scala - 测试工具中的凿子运行时错误
这个凿子代码工作正常:
然而,这个 - 一个小的变化 - 会产生运行时错误:
boolean - 一个组合电路,它接受一个 4 位数字并生成一个接近数字平方根的 3 位二进制数输出
设计一个组合电路,它接受一个 4 位数字并生成一个接近数字平方根的 3 位二进制数字输出。例如,如果平方根为 3.5 或更大,则结果为 4。如果平方根 < 3.5 且 ≥ 2.5,则结果为 3。
我的输入真值表是这样的吗?(我使用 A、B、C、D 作为输入)
我在生成输出表时遇到问题,“生成一个近似于数字平方根的 3 位二进制数输出”有人可以帮我处理输出吗?谢谢你。