标签: clash

创建一个允许类型在每次重复函数调用后更改的折叠,以便在没有递归的情况下调用函数n次

我试图使用定义的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)

haskell type-systems clash type-level-computation

19
推荐指数
1
解决办法
488
查看次数

Chisel和Lava与CLaSH有什么区别?

我一直在研究Chisel以及各种Lavas(堪萨斯,Chalmers和Xilinx口味)和CLaSH的来源.我试图了解Chisel与其他产品的主要卖点是什么.我发现的主要是快速模拟.

我想知道深入研究的人是否可以指出其他优点,缺点和权衡取舍.

(对不起,如果讨论问题太多了.我试着向凿子用户发帖,但显然你需要被接受为会员才能这样做.)

lava clash chisel

7
推荐指数
1
解决办法
1053
查看次数

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

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

为了使这更具体一点,假设我有以下数据类型,出于可读性目的,它使用其类型的时钟速率(以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)

haskell clash type-level-computation

2
推荐指数
1
解决办法
61
查看次数

如何使用State monad重构代码以通过添加更多函数来增加模块性?

我想要获得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)

monads haskell record clash

0
推荐指数
1
解决办法
67
查看次数

冲突教程示例中“纯”关键字的目的是什么?

在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)

haskell hdl clash

0
推荐指数
1
解决办法
140
查看次数