问题标签 [clash]
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.
chisel - Chisel 和 Lava 和 CLaSH 有什么区别?
我一直在研究 Chisel 以及各种 Lavas(Kansas、Chalmers 和 Xilinx 风味)和 CLaSH 的来源。我试图了解 Chisel 与其他产品的主要卖点是什么。我确定的主要方法是快速模拟。
我想知道研究得更深入的人是否可以指出其他优点、缺点和权衡。
(抱歉,如果这是一个太多的讨论问题。我尝试向凿子用户发帖,但显然你需要被接受为会员才能做到这一点。)
haskell - 将类型上的类型约束移除为满足约束的值。即 Num a => a 到只是 Int
我正在使用一个名为 CLaSH 的系统。对于那些不熟悉的人,它的设计方式允许您使用 Haskell 为 FPGA 进行开发。
我正在尝试创建一个无符号值。
就像是:
作品。我希望能够做类似的事情:
但我得到了错误:
(KnownNat x1) 没有由文字“2”产生的实例
可能的修复:
将 (KnownNat x1) 添加到
表达式类型签名:无符号 x1
在表达式中: 2 :: Unsigned x
在 `it' 的等式中:it = 2 :: Unsigned x
然后我尝试了在同一个文件中定义的“fromInteger#”。
返回类型
有了那个'y',我可以通过添加一个指定大小的无符号来给它一个大小。
这给出了 5
我如何得到类似的东西
如果我不能做到这一点,我为什么不能呢?
编辑:使用模板 Haskell 可以做我需要的事情。请参阅下面的代码并链接到 CLaSH 组说明
https://groups.google.com/forum/#!topic/clash-language/uPjt8i0lF0M 。
我想要的我可以在编译时完成。运行时是不可能的。
haskell - 创建一个折叠,允许在每次重复函数调用后更改类型,以便在不递归的情况下调用函数 n 次
我正在尝试使用此处定义的dfold
基本上它是一个折叠,允许您在每个循环后返回一个新类型。
我正在尝试概括此项目中定义 的bitonicSort : https ://github.com/adamwalker/clash-utils/blob/master/src/Clash/Sort.hs
我有两个对 dfold 生成的类型很重要的函数:
上面提到的项目中使用的例子是:
我继续做了一个更通用的版本。
使用这个版本,我可以像这样快速制作新的双音排序:
每个排序都使用指定大小的向量。
快速笔记:
我正在尝试将“genBitonic”应用于“bitonicBase”t 次。
我正在使用 CLaSH 将其综合到 VHDL,所以我不能使用递归来应用 t 次
我们将始终将大小为 2^t 的 vec 排序为相同大小的 vec
"Vec n a" 是大小为 n 的向量,类型为 a
我想做一个为给定 Vec 生成函数的函数。我相信使用 dfold 或 dtfold 是正确的路径。
我想用 function 之类的东西来折叠genBitonic
。
然后fst
用来获取我需要的排序功能。
我有两种可能的设计:
一:使用组合折叠以获得一个以基础为基础的函数。
在基地回复之前,它会导致类似
二:第二个想法是使用 bitonicBase 作为值 b 开始累积。这将直接导致我在申请之前需要它的形式fst
。
编辑
vecAcum
只是意味着在dfold
.
在 dfold 示例中,它们使用 a 进行折叠,:>
这只是列表运算符的向量形式:
我想要做的是采用两个函数的元组,例如:
并组成它们。所以genBitonic . genBitonic
会有类型:
因此,基本功能将是巩固类型的东西。例如
我正在使用 dfold 为长度为 n 的向量构建函数,这相当于对长度为 n 的向量进行递归。
我试过:
我尝试按照 dfold 下列出的示例进行操作
我正在使用 dfold 源代码使用的扩展
错误信息:
** 编辑 ** 添加了更多细节。
haskell - 初始化寄存器
我有一个非常简单的同步电路,应该让 LED 闪烁:
由于当我将它上传到真正的 FPGA 板时它不起作用,我想我会在 Xilinx 的模拟器中尝试它,使用以下测试台:
在模拟器中,这与现实生活中 FPGA 板的行为相匹配:LED
信号保持低电平。
我查看了生成的 VHDL,这就是它的样子:
我注意到内部状态未初始化,仅在重置时分配。所以这给了我一个想法,向测试平台添加一个重置过程:
有了这个改变,之后我看到LED
模拟器开始闪烁。[*]
负责模拟;但是我如何确保在真实板上有类似的复位信号?
[*] 对于模拟,当然,我将频率从 32,000,000 个周期增加到了 100 个周期;否则我必须运行模拟器很长时间才能看到第一个过渡。
haskell - 术语级访问时钟速率
我想将时钟速率(以 Hz 为单位)作为术语级别的值访问,以便我可以在计数器中使用它。
到目前为止,我能够想出的一种方法是将类型级别的Dom
ain 解压缩到其时钟周期(以 ps 为单位),然后将其转换为时钟速率。但是,这需要一个额外的KnownNat ps
约束,然后会感染所有试图使用它的东西,一直到topLevel
:
另一种避免引入额外KnownNat
约束的方法是在 上导入Clash.Signal.Internal
和模式匹配Clock
,因为它包含SNat
期间的见证:
但这会使合成器崩溃(我猜我不应该导入Clash.Signal.Internal
):
这是一个展示此问题的完整模块(我尝试将其合成:vhdl
以获得上述错误):
我的问题是,有没有一种方法可以clkRate
在不引入任何额外KnownNat
约束或导入任何Internal
模块的情况下在术语级别进行具体化?
haskell - 周期长度和频率之间的类型级转换
为了便于阅读,我想使用时钟频率值作为我的类型索引。但是,我需要检查这些与时钟域的兼容性,时钟域将它们的速度表示为周期长度。
为了更具体一点,假设我有以下数据类型,出于可读性目的,它在其类型中使用时钟速率(以赫兹为单位);在实际程序中,这可能是例如 VGA 时序:
但是,我需要将它与表示时钟周期(以皮秒为单位)的类型一起使用;在真正的 CLaSH 程序中,这将是时钟域本身。
现在问题开始了,因为 25.175 MHz 的一个周期不是皮秒的整数。首先,让我们尝试使用乘法:
这以预期的方式失败:
我们可以尝试的另一件事是类型级别的划分:
但这似乎并没有减少:
haskell - 无需通过 Template Haskell 将函数转换为预先计算的查找表
我有以下 CLaSH 功能:
当然,生成的 HDL 模块是不可综合的,因为除以 2 的非幂常数。所以我想把它变成一个查找表,然后放到一个小的异步ROM中。
起初,我认为这样做就足够了
但生成的 VHDL 仍然包含计算toBCD 0
,toBCD 1
等的公式。我想要的是获得仅包含 256x24 表中的预先计算值的 VHDL。
我发现的一种解决方法是romBCD
通过 Template Haskell 计算 's 内容:
但这会强制 的定义romBCD
位于一个单独的模块中,而不是toBCD
.
vhdl - 为什么数组更新会破坏元素值?
下面的独立 VHDL 文件是从 CLaSH 的输出中简化而来的,这应该可以解释其有些奇怪的结构。
目的是在iss.tup2_sel1(0)
的循环中增加。但是,我在 VHDL 模拟器中看到的是(因此, )在数组更新后变为 unknoqn (其值为)。为什么数组元素会损坏?s.tup2_sel0
"01"
OUTPUT
s.tup2_sel1(0)
"XXXXXXXX"
我的顶级测试平台生成RESET
信号:
clash - 如何实现 Clash readNew 亚稳态解决方法?
如何正确使用readNew
?
一个包含两个模块的最小示例,它们只读取和写入asyncRam
:
顶层.hs
低级.hs
目前,当我编译此代码时,我收到亚稳态警告(尽管它是成功的):
我做了一些研究,发现了这个 google group answer。我很确定这是我应该做的,但我不确定如何实施。
asyncRam clk d32
如帖子中所述,我将如何内联?我如何获得“免费时钟”?我正在尝试readNew
来自Clash.Explicit.Prelude(不成功),但我不明白为什么我不能只使用Prelude版本。我认为可能有一些需要,exposeClockReset
但从我读过的内容来看,似乎有来自同一域的两个时钟被用来规避亚稳态警告?请澄清,谢谢!
更新:这是一个已知问题。有人告诉我现在可以忽略编译器警告。