当一个RTL块包含对同一个寄存器的多个赋值时,我无法理解Kansas Lava的行为.这是版本号1:
foo :: (Clock c) => Signal clk Bool
foo = runRTL $ do
r <- newReg True
r := low
return $ var r
Run Code Online (Sandbox Code Playgroud)
这表现得像我预期的那样:
*Main> takeS 10 foo :: Seq Bool
low | low | low | low | low | low | low | low | low | low | ? .
Run Code Online (Sandbox Code Playgroud)
生成的VHDL是:
architecture str of assignments is
signal sig_2_o0 : std_logic;
begin
sig_2_o0 <= '0';
OUTPUT <= sig_2_o0;
end architecture str; …Run Code Online (Sandbox Code Playgroud) 我正在FPGA上构建Commodore PET.我已经在Kansas Lava中实现了我自己的6502内核(代码可以在https://github.com/gergoerdi/mos6502-kansas-lava获得),并在其周围放置足够的IO(https://github.com/gergoerdi/eightbit-kansas-lava)我能够启动原始的Commodore PET ROM,获得一个闪烁的光标并开始输入.
但是,在输入经典的BASIC程序之后
10 PRINT "HELLO WORLD"
20 GOTO 10
Run Code Online (Sandbox Code Playgroud)
它会在一段时间后(几秒钟后)崩溃
?ILLEGAL QUANTITY ERROR IN 10
Run Code Online (Sandbox Code Playgroud)
因为我的代码具有相当合理的每操作码测试覆盖率,并且它通过AllSuiteA,我想我会考虑更复杂行为的测试,这就是我如何到达Klaus Dormann的中断测试套件.在Kansas Lava模拟器中运行它已经指出了我原来的中断实现中的大量错误:
I进入中断处理程序时未设置该标志B标志是所有的地方I它们到达时未设置(正确的行为似乎是在I设置时排队中断以及何时取消设置,它们仍然应该被处理)修好这些之后,我现在可以成功运行Klaus Dormann测试,所以我希望将我的机器加载到真正的FPGA上,运气好的BASIC崩溃可能会消失.
然而,修复了所有这些中断错误并在模拟器中通过中断测试的新版本现在无法响应键盘输入,甚至只是在真实FPGA上闪烁光标.请注意,键盘输入和光标闪烁都是响应外部IRQ(从屏幕VBlank信号连接)完成的,所以这意味着固定版本以某种方式打破了所有中断处理 ...
我正在寻找任何可能出错的模糊建议或如何开始调试.
完整代码可在https://github.com/gergoerdi/mos6502-kansas-lava/tree/interrupt-rewrite获得,违规提交(修复测试并打破PET)是7a09b794af.我意识到这与最小可行再现完全相反,但变化本身很小,因为我不知道它出错的地方,并且因为重现问题需要一台功能足以引导库存Commodore PET ROM的机器,所以我不要我不知道怎么缩小它...
添加:
我设法在同一个硬件上用一个非常简单的(我敢说最小的)ROM而不是库存PET ROM重现相同的问题:
.org $C000
reset:
;; Initialize PIA
LDY #$07
STY $E813
LDA #30
STA $42
STA $8000
CLI
JMP *
irq:
CMP $E812 ; ACK …Run Code Online (Sandbox Code Playgroud) 我一直在研究Chisel以及各种Lavas(堪萨斯,Chalmers和Xilinx口味)和CLaSH的来源.我试图了解Chisel与其他产品的主要卖点是什么.我发现的主要是快速模拟.
我想知道深入研究的人是否可以指出其他优点,缺点和权衡取舍.
(对不起,如果讨论问题太多了.我试着向凿子用户发帖,但显然你需要被接受为会员才能这样做.)
我正在尝试实现时间多路复用来驱动一个4位数的7段显示器:该设备有7个数据段和4个阳极,因此如果要显示四个不同的数字,则必须将阳极设置为0001第一个和数据腿到你的部分; 然后过一会儿,将阳极设置为0010并更新数据支路; 等等.
我正试图在Kansas Lava中实现它.但是,Xilinx编译器拒绝生成的VHDL类型错误(并查看生成的代码,我认为是正确的).
首先,我的Lava代码:它基本上实现了序列的信号[0, 1, 2, 3, 0, ...],然后使用.!.运算符从Language.KansasLava.Signal索引到矩阵矩阵参数.通过0001在每个时间步向左旋转产生阳极值.
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE DataKinds #-}
import Language.KansasLava
import Hardware.KansasLava.Boards.Papilio.LogicStart -- from http://github.com/gergoerdi/kansas-lava-papilio
import Data.Sized.Matrix
import Data.Sized.Unsigned as Unsigned
import Data.Bits
driveSS :: forall clk sig n. (Clock clk, sig ~ Signal clk, Size n, Rep n, Num n, Integral n) => Matrix n (Matrix X7 (sig Bool)) -> SevenSeg clk …Run Code Online (Sandbox Code Playgroud)