问题标签 [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.

0 投票
2 回答
1639 浏览

chisel - Chisel 和 Lava 和 CLaSH 有什么区别?

我一直在研究 Chisel 以及各种 Lavas(Kansas、Chalmers 和 Xilinx 风味)和 CLaSH 的来源。我试图了解 Chisel 与其他产品的主要卖点是什么。我确定的主要方法是快速模拟。

我想知道研究得更深入的人是否可以指出其他优点、缺点和权衡。

(抱歉,如果这是一个太多的讨论问题。我尝试向凿子用户发帖,但显然你需要被接受为会员才能做到这一点。)

0 投票
1 回答
144 浏览

haskell - 将类型上的类型约束移除为满足约束的值。即 Num a => a 到只是 Int

我正在使用一个名为 CLaSH 的系统。对于那些不熟悉的人,它的设计方式允许您使用 Haskell 为 FPGA 进行开发。

我正在尝试创建一个无符号值。 

定义于:  https ://hackage.haskell.org/package/clash-prelude-0.10.11/docs/src/CLaSH-Sized-Internal-Unsigned.html#Unsigned

就像是: 

作品。我希望能够做类似的事情:

但我得到了错误:

(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  。 

我想要的我可以在编译时完成。运行时是不可能的。

0 投票
1 回答
101 浏览

haskell - 如何使用 State monad 重构代码以通过添加更多功能来增加模块化?

我正在尝试掌握单子的窍门。我认为与 state monad 一起玩是个好习惯。

使用CLaSH的 UART Rx :

我将如何将when逻辑转移到他们自己的功能中?我一直在玩这个,但镜头似乎引起了问题。

我认为这里有一个功能

我失踪了。

我想做类似的事情

我认为会有一个execState我需要的功能。

所以我的问题是,

  • 我应该使用什么?
  • 该功能做了什么才能使其与其他功能组合在一起?
  • 如果单子只是组成,为什么我不能when在没有 execState 类型函数的函数中使用?
  • 我可以通过哪些其他方式来增加此代码的模块化?
0 投票
2 回答
600 浏览

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 源代码使用的扩展

错误信息:

** 编辑 ** 添加了更多细节。

0 投票
1 回答
502 浏览

haskell - 初始化寄存器

我有一个非常简单的同步电路,应该让 LED 闪烁:

由于当我将它上传到真正的 FPGA 板时它不起作用,我想我会在 Xilinx 的模拟器中尝试它,使用以下测试台:

在模拟器中,这与现实生活中 FPGA 板的行为相匹配:LED信号保持低电平。

我查看了生成的 VHDL,这就是它的样子:

我注意到内部状态未初始化,仅在重置时分配。所以这给了我一个想法,向测试平台添加一个重置过程:

有了这个改变,之后我看到LED模拟器开始闪烁。[*]

负责模拟;但是我如何确保在真实板上有类似的复位信号?

[*] 对于模拟,当然,我将频率从 32,000,000 个周期增加到了 100 个周期;否则我必须运行模拟器很长时间才能看到第一个过渡。

0 投票
2 回答
120 浏览

haskell - 术语级访问时钟速率

我想将时钟速率(以 Hz 为单位)作为术语级别的值访问,以便我可以在计数器中使用它。

到目前为止,我能够想出的一种方法是将类型级别的Domain 解压缩到其时钟周期(以 ps 为单位),然后将其转换为时钟速率。但是,这需要一个额外的KnownNat ps约束,然后会感染所有试图使用它的东西,一直到topLevel

另一种避免引入额外KnownNat约束的方法是在 上导入Clash.Signal.Internal和模式匹配Clock,因为它包含SNat期间的见证:

但这会使合成器崩溃(我猜我不应该导入Clash.Signal.Internal):

这是一个展示此问题的完整模块(我尝试将其合成:vhdl以获得上述错误):

我的问题是,有没有一种方法可以clkRate在不引入任何额外KnownNat约束或导入任何Internal模块的情况下在术语级别进行具体化?

0 投票
1 回答
67 浏览

haskell - 周期长度和频率之间的类型级转换

为了便于阅读,我想使用时钟频率值作为我的类型索引。但是,我需要检查这些与时钟域的兼容性,时钟域将它们的速度表示为周期长度。

为了更具体一点,假设我有以下数据类型,出于可读性目的,它在其类型中使用时钟速率(以赫兹为单位);在实际程序中,这可能是例如 VGA 时序:

但是,我需要将它与表示时钟周期(以皮秒为单位)的类型一起使用;在真正的 CLaSH 程序中,这将是时钟域本身。

现在问题开始了,因为 25.175 MHz 的一个周期不是皮秒的整数。首先,让我们尝试使用乘法:

这以预期的方式失败:

我们可以尝试的另一件事是类型级别的划分:

但这似乎并没有减少:

0 投票
0 回答
201 浏览

haskell - 无需通过 Template Haskell 将函数转换为预先计算的查找表

我有以下 CLaSH 功能:

当然,生成的 HDL 模块是不可综合的,因为除以 2 的非幂常数。所以我想把它变成一个查找表,然后放到一个小的异步ROM中。

起初,我认为这样做就足够了

但生成的 VHDL 仍然包含计算toBCD 0,toBCD 1等的公式。我想要的是获得仅包含 256x24 表中的预先计算值的 VHDL。

我发现的一种解决方法是romBCD通过 Template Haskell 计算 's 内容:

但这会强制 的定义romBCD位于一个单独的模块中,而不是toBCD.

0 投票
1 回答
302 浏览

vhdl - 为什么数组更新会破坏元素值?

下面的独立 VHDL 文件是从 CLaSH 的输出中简化而来的,这应该可以解释其有些奇怪的结构。

目的是在iss.tup2_sel1(0)的循环中增加。但是,我在 VHDL 模拟器中看到的是(因此, )在数组更新后变为 unknoqn (其值为)。为什么数组元素会损坏?s.tup2_sel0"01"OUTPUTs.tup2_sel1(0)"XXXXXXXX"

我的顶级测试平台生成RESET信号:

0 投票
0 回答
42 浏览

clash - 如何实现 Clash readNew 亚稳态解决方法?

如何正确使用readNew

一个包含两个模块的最小示例,它们只读取和写入asyncRam

顶层.hs

低级.hs

目前,当我编译此代码时,我收到亚稳态警告(尽管它是成功的):

我做了一些研究,发现了这个 google group answer。我很确定这是应该做的,但我不确定如何实施。

asyncRam clk d32如帖子中所述,我将如何内联?我如何获得“免费时钟”?我正在尝试readNew来自Clash.Explicit.Prelude(不成功),但我不明白为什么我不能只使用Prelude版本。我认为可能有一些需要,exposeClockReset但从我读过的内容来看,似乎有来自同一域的两个时钟被用来规避亚稳态警告?请澄清,谢谢!

更新:这是一个已知问题。有人告诉我现在可以忽略编译器警告。