标签: vhdl

VHDL的隐藏功能

最初的问题是:

VHDL中有哪些非常有用但却深奥的语言功能,你实际上可以用来做有用的工作?

原来的问题被删除了,我只是在回答.我认为这是一个有趣的问题,特别是当您将VHDL与其他(普通)编程语言进行比较时.

免责声明:我在VHDL中只做了一些简单的例子.

但是,与其他编程语言相比,我特别喜欢它(这可能不是你所要求的,但我认为只是对于这些事情,每个程序员都应该知道一点VHDL):

  1. 能够拥有单个界面的多种不同实现(体系结构),并轻松交换它们.

  2. 语言模型固有的低开销并行性.它让我想起了数据流语言.

vhdl

10
推荐指数
3
解决办法
6430
查看次数

通过bit twiddling在循环调度中找到下一个

考虑以下问题.您有一个位串,表示一个热编码中的当前调度从属.例如,"00000100"(最左边的位为#7,最右边的#0)表示调度了从属#2.

现在,我想在循环调度方案中选择下一个计划的从站,并进行扭曲.我有一个"请求掩码",说明实际上想要安排哪些奴隶.将仅从想要的人那里挑选下一个奴隶.

一些例子(假设循环调度是通过向左旋转完成的).例1:

  • 当前:"00000100"
  • 面具:"01100000"
  • 下一个时间表:"00100000" - 在正常循环中,#3然后#4应该在#2之后,但是他们没有请求,所以选择了#5.

例2:

  • 目前:"01000000"
  • 面具:"00001010"
  • 下一步:"00000010" - 因为调度是通过左循环完成的,而#1是该命令中的第一个请求从属.

现在,我知道,这可以很容易地循环编码.但实际上我想通过一个有点笨拙的操作得到我的结果,没有循环.动机:我想在VHDL/Verilog的硬件(在FPGA中)实现这一点.

奖励是组成一个对任何数量的奴隶N都是通用的算法.

顺便说一句,这不是一个功课问题.无论何时想要以某种方式安排从属设备,并通过从属设备的请求来调度调度,这都是一个重要的问题.我目前的解决方案有点"沉重",我想知道我是否遗漏了一些明显的东西.

algorithm verilog bit-manipulation vhdl

9
推荐指数
2
解决办法
6428
查看次数

通过泛型来记录端口类型

我最近开始使用记录作为我的端口定义,特别是如果我想对属于某个接口的信号进行分组.但是,我在这里遇到的问题是我无法通过泛型传递给stl_logic_vector的宽度.所以我基本上想做的是以下内容:

library ieee;
use ieee.std_logic_1164.all;
use work.math_pkg.all;

package fifo_pkg is

  type fifo_in_type is record
    data_in : std_logic_vector(DATA_WIDTH_??- 1 downto 0);
    rd      : std_logic;
    wr      : std_logic;
  end record;

  type fifo_out_type is record
    data_out : std_logic_vector(DATA_WIDTH_?? - 1 downto 0);
    empty    : std_logic;
    full     : std_logic;
  end record;

  component fifo is
    generic
      (
        MIN_DEPTH  : integer;
        DATA_WIDTH : integer
        );
    port
      (
        clk   : in  std_logic;
        res_n : in  std_logic;
        i     : in  fifo_in_type;
        o     : out fifo_out_type
        );
  end component …
Run Code Online (Sandbox Code Playgroud)

vhdl

9
推荐指数
1
解决办法
9792
查看次数

来自不同过程的VHDL驱动信号

我对以下VHDL代码有一点问题:

process (zbroji)
begin
    if rising_edge(zbroji) then
        oduzima <= '0';
        ucitanPrvi <= '1';
        broj1 <= ulaz_broj;
    end if;
end process;

process (oduzmi)
begin
    if rising_edge(oduzmi) then
        oduzima <= '1';
        ucitanPrvi <= '1';
        broj1 <= ulaz_broj;
    end if;

end process;
Run Code Online (Sandbox Code Playgroud)

问题是信号ucitanPrvi总是有值X.如果我不尝试在两个进程中设置它的值,那么我没有任何问题...所以我知道我不能从多个进程驱动一个信号,但我不知道如何以不同的方式写这个...有谁知道如何解决这个问题?

谢谢 !

编辑:谢谢大家回复:)现在我明白为什么我不能从多个进程驱动一个信号(至少在我希望它工作的方式).

vhdl

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

Verilog相当于"等到......为......"?

在Verilog测试平台中,我试图编写以下行为:

具有以下行为(提醒):

  • 事件发生;
  • 或持续时间到期.

除非我弄错了,我在Verilog中找不到任何直接等效的函数...所以我尝试了以下代码:

reg watchdog;
// ...

// Set a signal 'watchdog' in background which will be triggered in 10 us.
fork
  watchdog <= #10_000 1'b1;
join

// Wait until SIGNAL is set to '1' *OR* watchdog event occurs.
@(posedge SIGNAL or posedge watchdog);

// Reset the watchdog
watchdog <= 1'b0;
Run Code Online (Sandbox Code Playgroud)

此代码完成工作,但最后一条指令不取消或取代fork指令.因此,在第二次调用此代码时(例如watchdog <= #50_000 1'b1;),watchdog可能会触发第一次(很快就会发生).

有什么好主意吗?(取消第一次计划的等效或方式fork?)

PS:在SystemVerilog中这样做不是一个选项... ;-)

verilog vhdl

9
推荐指数
1
解决办法
3万
查看次数

连续分配看似不起作用

我正在研究FIR滤波器,特别是延迟线.x_delayed被初始化为全零.

type slv32_array is array(natural range <>) of std_logic_vector(31 downto 0);
...
signal x_delayed : slv32_array(0 to NTAPS-1) := (others => (others => '0'));
Run Code Online (Sandbox Code Playgroud)

这不起作用:

x_delayed(0) <= x;             -- Continuous assignment

DELAYS : process(samp_clk)
begin
    if rising_edge(samp_clk) then
        for i in 1 to NTAPS-1 loop
            x_delayed(i) <= x_delayed(i-1);
        end loop;
    end if; -- rising_edge(samp_clk)
end process;
Run Code Online (Sandbox Code Playgroud)

模拟


但这样做:

DELAYS : process(samp_clk)
begin
    if rising_edge(samp_clk) then
        x_delayed(0) <= x;           -- Registering input
        for i in 1 to NTAPS-1 loop
            x_delayed(i) …
Run Code Online (Sandbox Code Playgroud)

vhdl

9
推荐指数
1
解决办法
2010
查看次数

如何管理大型VHDL测试平台

我在不同的VHDL项目中一次又一次看到的一个问题是,顶级测试平台总是很大并且很难保持井井有条.基本上有一个主要的测试过程,其中每个测试信号都被控制或验证,随着时间的推移变得巨大.我知道您可以为较低级别的组件制作测试平台,但这个问题主要适用于顶级输入/输出测试.

我希望有某种层次结构来保持组织有序.我已经尝试过实现VHDL程序,但编译器非常不满意,因为它认为我试图从不同代码段分配信号......

VHDL中是否有可用于实现c编程的内联函数或#define预处理器替换宏的行为?如果没有,你能提出什么建议?能让我的顶级测试平台看起来像这样会让我高兴:

testClockSignals();
testDigitialIO();
testDACSignals();
...
Run Code Online (Sandbox Code Playgroud)

在单独的文件中实现这些功能将是锦上添花.哈哈......我只想在C中编写和模拟测试台.

testing vhdl

9
推荐指数
2
解决办法
3044
查看次数

在VHDL中初始化记录数组

我的记录定义如下

type ifx_t is
record
  data                        : std_logic_vector(127 downto 0);
  address                     : std_logic_vector (19 downto 0); 
  WrReq                       : std_logic;-- 
  RdReq                       : std_logic; --
end record;
type Array_ifx_t is array (0 to 2) of ifx_t;
Run Code Online (Sandbox Code Playgroud)

我必须初始化这个记录数组的实例,我尝试了以下方式,它不起作用

signal pair_in       : Array_ifx_t:= (others =>((others =>'0'),(others=>'0'),'0','0')); 
Run Code Online (Sandbox Code Playgroud)

请帮助.

arrays records signals vhdl

9
推荐指数
1
解决办法
3万
查看次数

测试不同级别的FPGA设计

这里讨论了FPGA的测试策略的各个方面,但是我发现以下问题没有被提出/讨论/回答:

您应该在什么级别模拟FPGA设计,以及在每个级别验证什么?

如果您使用x级测试等概念回答,其中x =块,子系统,函数或其他内容,请描述x适合您的内容.像典型的大小,复杂性或一个例子.


9月14日

当涉及到实际问题时,两个给出的答案都是相同的,但我会接受来自@kraigher的答案,因为它是最短的答案.


9月10日

这是@Paebbles和@kraigher的两个答案的总结和比较.其中一个答案很长,所以希望这将有助于任何想要为自己的答案做出贡献的人.请记住,这是一个有利可图的赏金!

  • 它们都模拟了所有级别的所有组件.至少@Paebbles会对功能含量很少的组件(例如MUX)进行例外处理.
  • 他们都在努力实现测试自动化
  • 他们都开发了"工具"来简化板级测试
  • 他们都避免在一个级别测试已经在下面级别测试过的东西
  • 最大的区别似乎在于测试平台的模拟频率.@Paebbles直接在HW中进行测试,除非有重大的设计更改,在这种情况下也会运行模拟.@kraigher随着设计的发展不断运行模拟.我认为这也是一个非常重要的问题,我个人更喜欢@kraigher表达的方式.但是,这不是原始问题的一部分,所以我认为这两个答案之间存在共识.关于测试运行频率的问题之前也已经讨论过,例如,系统单元测试的整个套件应该多久运行一次?

他们在实验室中进行了多少测试,但这似乎主要与项目的具体情况有关(有多少事情无法通过模拟进行有效测试).我碰巧知道@kraigher的最后一个项目,所以我可以说这两个项目都属于1年以上的类别.从一个规模较小的人那里听到一个故事会很有趣.从我所看到的所有项目来看,在模拟中的功能覆盖方面都是完整的,因此必须有其他故事.


9月7日

这是@peabbles的一些后续问题太长,无法在评论中使用.

是的@peabbles,你已经提供了很多我正在寻找的内容,但我还有其他问题.我担心这可能是一个冗长的讨论,但考虑到我们花在验证上的时间以及人们应用的各种策略,我认为它值得关注.希望我们会有更多的答案,以便可以比较各种方法.你的赏金肯定会有所帮助.

我认为你的故事包含许多有趣且有趣的解决方案,但我是工程师,所以我会专注于我认为可以挑战的作品;-)

您花了很多时间在硬件上进行测试,以解决您遇到的所有外部问题.从实际的角度来看(因为他们不会修复他们的SATA标准违规),这就像有一个有缺陷的需求规范,这样你就可以开发一个解决错误问题的设计.这通常是在您"交付"时发现的,这会激发您为什么要经常交付并尽早发现问题.我对一件事感到好奇.当您在实验室中发现需要进行设计更改的错误时,您是否会在可以测试的最低级别更新测试平台?不这样做会增加错误在实验室中重新出现的风险,并且随着时间的推移它也会降低测试平台的功能覆盖率,使您更加依赖于实验室测试.

你说大多数测试是在实验室完成的,这是由你必须调试的外部问题造成的.如果你只看你自己的内部代码和错误,你的答案是否相同?

当您像往常一样工作很长的周转时间时,您会找到各种方法来利用这段时间.您描述了在第一次测试时开始合成下一个设计,并且如果您在一个驱动器中发现了一个错误,那么您开始为该驱动​​器合成修复,同时继续使用当前设计测试其他驱动器.您还在实验室中进行了测试时描述了可观察性问题.我将对此做一些持怀疑态度的解释,你必须提供积极的解释!

如果您在开始测试第一个设计时可以立即合成下一个设计,那么您似乎正在以非常小的增量进行工作,但仍然努力在每个级别运行每个测试一直到硬件.这似乎有点过分/昂贵,特别是当您没有完全自动化硬件测试时.另一个持怀疑态度的解释是,你正在寻找一个错误,但由于可观察性差,你正在制作随机试验和错误类型的构建,希望它们能够提供你试图孤立​​的问题的线索.这是否真正有效地利用了时间,因为每一个构建都增加了价值,还是更"做某事比做什么更好"?

在设计更高的协议层时,您是否考虑将更高层次的通信堆栈短路以加速仿真?毕竟,已经测试了下层.

您重用了一些组件并假设它们没有bug.那是因为他们配有测试平台,证明了这一点吗?使用证明往往很弱,因为重用通常发生在另一个环境中.Arianne 5火箭就是一个很好的例子,你可以再次将XAPP 870用于Virtex 5.

由于您可以在不同级别进行模拟,因此我认为您可以在较低级别使用较快的运行时间,并且可以在较大的结构完成之前验证设计的一部分时使用较短的反馈循环.仍然有一些代码片段足够重要,可以授予他们自己的组件,但仍然太简单,无法获得自己的测试平台.你能给出这样一个组件的例子吗?他们真的没有bug吗?我个人在犯错误之前没有写过很多代码行,所以如果我有一个很好的代码片段就像一个组件,我会抓住机会在上面提到的原因进行测试.

testing verilog fpga vhdl

9
推荐指数
2
解决办法
1190
查看次数

如何在Sphinx运行时预处理源文件?

我为我的项目设置了Sphinx文档,并希望提取源文件的doc字符串并将它们嵌入到最终文档中.不幸的是,Sphinx不支持源文件的语言(VHDL).VHDL似乎没有Sphinx域.

所以我的想法如下:

  • 在Sphinx之前进入Sphinx运行并执行一些Python代码
  • Python代码从每个源文件(最顶层的多行注释块)中提取文本块,并为每个源文件组装一个reST文件,包括此注释块和一些其他reST标记.
  • 所有源文件都列在a中index.rst,以生成适当的.. toctree::指令.
  • 每个源代码目录递归地完成文本提取和转换.

所以主要的问题是:如何挂钩到Spinx?

或者我应该导入并运行我自己的配置conf.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
from my_preprocessor import my_proc
proc = my_proc()
proc.run()
#
# Test documentation build configuration file, created by
# sphinx-quickstart on Tue May 24 11:28:20 2016.
# ....
Run Code Online (Sandbox Code Playgroud)

我无法修改构建过程文件:Makefile并且make.bat,因为真正的构建过程在ReadTheDocs.org上运行.RTD仅执行conf.py.

python vhdl python-3.x python-sphinx read-the-docs

9
推荐指数
1
解决办法
930
查看次数