我试图使用定义的dfold 这里
dfold
:: KnownNat k
=> Proxy (p :: TyFun Nat * -> *)
-> (forall l. SNat l -> a -> (p @@ l) -> p @@ (l + 1))
-> (p @@ 0)
-> Vec k a
-> p @@ k
Run Code Online (Sandbox Code Playgroud)
基本上它是一个折叠,允许您在每个循环后返回一个新类型.
我试图概括这个项目中定义的bitonicSort:https: //github.com/adamwalker/clash-utils/blob/master/src/Clash/Sort.hs
我有两个函数对dfold生成的类型很重要:
bitonicSort
:: forall n a. (KnownNat n, Ord a)
=> (Vec n a -> Vec n a) -- ^ The recursive step
-> (Vec (2 * n) a …Run Code Online (Sandbox Code Playgroud) 我一直在研究Chisel以及各种Lavas(堪萨斯,Chalmers和Xilinx口味)和CLaSH的来源.我试图了解Chisel与其他产品的主要卖点是什么.我发现的主要是快速模拟.
我想知道深入研究的人是否可以指出其他优点,缺点和权衡取舍.
(对不起,如果讨论问题太多了.我试着向凿子用户发帖,但显然你需要被接受为会员才能这样做.)
为了便于阅读,我想使用时钟频率值作为我的类型索引.但是,我需要检查这些与时钟域的兼容性,时钟域代表它们作为周期长度的速度.
为了使这更具体一点,假设我有以下数据类型,出于可读性目的,它使用其类型的时钟速率(以Hz为单位); 在实际程序中,这可能是例如VGA时序:
data Rate (rate :: Nat) = MkRate
rate :: Rate 25175000
rate = MkRate
Run Code Online (Sandbox Code Playgroud)
但是,我需要将它与表示时钟周期的类型一起使用(以皮秒为单位); 在真正的CLaSH程序中,这将是时钟域本身.
data Period (ps :: Nat) = MkPeriod
period :: Period 39721
period = MkPeriod
Run Code Online (Sandbox Code Playgroud)
现在问题开始了,因为25.175 MHz的一个周期不是整数皮秒.首先,让我们尝试使用乘法:
connect1 :: ((rate * ps) ~ 1000000000000) => Rate rate -> Period ps -> ()
connect1 _ _ = ()
test1 :: ()
test1 = connect1 rate period
Run Code Online (Sandbox Code Playgroud)
这以预期的方式失败:
../clash-sandbox/lib/src-clash/Cactus/Clash/VGA.hs:79:9: error:
• Couldn't match type ‘999976175000’ with ‘1000000000000’
arising from a use of ‘connect1’
• …Run Code Online (Sandbox Code Playgroud) 我想要获得monad的支持.我认为与国家monad一起玩是个不错的做法.
使用CLaSH的UART Rx :
-- UART RX Logic
data RxReg
= RxReg
{ _rx_reg :: BitVector 8
, _rx_data :: BitVector 8
, _rx_sample_cnt :: Unsigned 4
, _rx_cnt :: Unsigned 4
, _rx_frame_err :: Bool
, _rx_over_run :: Bool
, _rx_empty :: Bool
, _rx_d1 :: Bit
, _rx_d2 :: Bit
, _rx_busy :: Bool
}
makeLenses ''RxReg
uartRX r@(RxReg {..}) rx_in uld_rx_data rx_enable = flip execState r $ do
-- Synchronise the async signal
rx_d1 .= …Run Code Online (Sandbox Code Playgroud) 在Clash官网,有如下例子:
>>> sampleN @System 4 (register 0 (pure (8 :: Signed 8)))
Run Code Online (Sandbox Code Playgroud)
我知道什么是纯函数,但为什么这里有这个关键字?如果我删除它,我会收到一个错误:
Clash.Prelude> sampleN @System 4 (register 0 (8 :: Signed 8))
<interactive>:2:32: error:
* Couldn't match expected type `Signal System a'
with actual type `Signed 8'
* In the second argument of `register', namely `(8 :: Signed 8)'
In the third argument of `sampleN', namely
`(register 0 (8 :: Signed 8))'
In the expression: sampleN @System 4 (register 0 (8 :: Signed 8))
* Relevant bindings include it …Run Code Online (Sandbox Code Playgroud)