标签: hdl

目的是提供多个架构?

我正在学习VHDL,我正在尝试从示例,语法指南和实验中学习.

有一点我不太明白为什么你想要提供多个架构.例如,这个示例MUX代码:

architecture behv1 of Mux is
begin
    process(I3,I2,I1,I0,S)
    begin

        -- use case statement
        case S is
        when "00" =>    O <= I0;
        when "01" =>    O <= I1;
        when "10" =>    O <= I2;
        when "11" =>    O <= I3;
        when others =>  O <= "ZZZ";
    end case;

    end process;
end behv1;

architecture behv2 of Mux is
begin

    -- use when.. else statement
    O <=    I0 when S="00" else
        I1 when S="01" else
        I2 when S="10" else …
Run Code Online (Sandbox Code Playgroud)

hardware syntax vhdl hdl

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

如何在 Chisel 生成的模块中注入 Verilog 代码?

为了测试我的 Chisel 设计,我将Icaruscocotb一起使用。但是,如果在 verilog 模块代码中没有明确询问 Icarus 不会生成 VCD 跟踪,如下所示:

`ifdef COCOTB_SIM
initial begin
  $dumpfile ("my_module_name.vcd");
  $dumpvars (0, my_module_name);
  #1;
end
`endif
Run Code Online (Sandbox Code Playgroud)

为了在每次生成 chisel 模块时添加此内容,我编写了一个名为cocotbify.py 的Python 小脚本,在生成的模块下“注入”此代码。

同样,要添加一些 systemVerilog assert()/assume() 以使用yosys-smtbmc进行正式检查,我必须在生成的每个 verilog 模块下“注入”代码。我还破解了一个名为smtbmcify.py的小 python 脚本来注入我的断言/假设代码。

我意识到这是一个 hack,但我找不到直接在 Chisel 模块下执行此操作的好方法。我知道有BlackBox,但我不想实例化子模块,并且函数 setInline 创建第二个 verilog 文件(我想直接在模块中写入)。

我在 Chisel scala 代码中看到了一种名为ChiselAnnotation的类型,但我不确定这是要使用的东西,我现在不知道如何使用。

verilog hdl chisel yosys cocotb

7
推荐指数
0
解决办法
216
查看次数

如何实现(伪)硬件随机数生成器

如何在HDL(verilog)中实现硬件随机数生成器?

需要考虑哪些选择?


这个问题遵循自我答案的格式.鼓励添加答案和更新.

random verilog hdl

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

在Mac OS X 10.6.8上使用什么来编译和模拟Verilog程序?

我是第二年的本科生.

我需要模拟Verilog程序作为我的教学大纲的一部分.但遗憾的是我的大学使用的是Xilinx ISE,它不适用于Mac.

所以请帮我解决最好的软件以及如何安装和使用它们的一些详细步骤.

提前致谢

macos verilog hdl

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

在VHDL中声明实体内的数组

我正在尝试建立一个缓冲区,以便为小型CPU设计保存16位,16位宽的指令.

我需要一种从我的测试平台将指令加载到缓冲区的方法.所以我想使用一个std_logic_vectors数组来实现这一目标.但是,我收到语法错误,我不知道为什么(或者如果我允许在VHDL中执行此操作).

语法错误位于我声明的行 instructions

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;




entity instruction_buffer is
    port
    (
    reset               : in std_logic;
    instructions        : in array(0 to 15) of std_logic_vector(15 downto 0);
    instruction_address : in  std_logic_vector(3 downto  0);
    clk                 : in std_logic;
    instruction_out     : out std_logic_vector(15 downto 0)
    );
end instruction_buffer;
Run Code Online (Sandbox Code Playgroud)

我也试过这样做,但后来我的实体端口映射中出现语法错误,告诉我这std_logic_vector是一个未知的类型.我发誓,VHDL的语法错误没有C哈哈那么有意义

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

package instructionBuffer is
    type instructionBuffer is array(0 to 15) of std_logic_vector (15 downto 0);
end package instructionBuffer;

entity instruction_buffer is
    port
    (
    instruction_address …
Run Code Online (Sandbox Code Playgroud)

syntax-error vhdl hdl

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

Verilog:值与数组范围不匹配,模拟不匹配

据我所知,以下代码正确地进行了合成和模拟,但XST仍然发出以下警告: value(s) does not match array range, simulation mismatch.是否有我遗漏的东西?

使用的工具:Xilinx ISE项目导航器(合成器:XST)FPGA:SPARTAN 3E

module error_example(
    input [47:0] data,
    input [2:0] sel,
    output [5:0] data_out
);

   assign data_out = data[sel*6 +: 6];

endmodule
Run Code Online (Sandbox Code Playgroud)

WARNING:Xst:790 - "error_example.v" line 8: Index value(s) does not match array range, simulation mismatch.

就像我说的,这是有效的,我已经完成了数学运算:

sel 可以有0到7之间的值,

if sel为0,那么data_out = data[5:0] ......

如果sel是7,那么data_out = data[47:42]

我应该在这里做些不同的事吗?这是XST中的错误吗?

verilog hdl xilinx

6
推荐指数
1
解决办法
1049
查看次数

Verilog与无签名样本签署并首先签署

假设我有一个reg [15:0] my_reg包含16位带符号样本的寄存器:

如何将样本从签名转换为未签名?我已经阅读了这篇维基百科的文章,并且知道签名数字的2位补码,但是如何有效地在Verilog中执行这种转换呢?(我不知道它my_reg是正还是负,并且它在每个时钟周期都会发生变化=我在每个正时钟边沿都会收到一个新的样本).

最终目标(增加一点上下文)是实现数字FPGA内置自动增益控制(AGC).

编辑:正如所建议的那样,我将两个问题分成了两个不同的帖子.在这里看到另一个

verilog bit-manipulation hdl

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

有没有办法在 Verilog 中定义类似 C 结构的东西

我有一个用 Verilog(重要的是不是 SystemVerilog)编写的项目,由于在设计的不同部分之间传递的信号数量太多,它变得有点难以管理。因为我有几个模块都需要相同的信号,所以我想尝试将它们合并为较少数量的命名对象。问题是如何去做。

假设这是我人为的例子:

module mymodule(sig_a_in, sig_b_in, sig_c_in, sig_d_in, sig_e_in,
                sig_a_out, sig_b_out, sig_c_out, sig_d_out, sig_e_out);

  input wire sig_a_in, sig_b_in, sig_c_in;
  input wire [5  : 0] sig_d_in;
  input wire [31 : 0] sig_e_in;
  output reg sig_a_out, sig_b_out, sig_c_out;
  output reg [5  : 0] sig_d_out;
  output reg [31 : 0] sig_e_out;
endmodule
Run Code Online (Sandbox Code Playgroud)

在我看来,重要的是我可以按名称引用信号的可读性。但是,我不想将它们全部单独传递给每个模块。同样,我在这个项目中只使用 Verilog,所以 SystemVerilog 构造是不可能的。

我的第一个想法是我只需将它们组合成一个总线,然后使用定义的名称来引用各个电线。然而,这有点笨拙,尤其是当您将其他总线添加到混音中时。这在我人为的例子中非常简单,因为信号具有明显的隐式顺序,但在现实生活中它们没有。

`define SIGNAL_BUS_WIDTH 41
`define A 0
`define B 1
`define C 2
`define D 3
`define E 9

module mymodule(signal_bus_in, signal_bus_out);

  input wire [`SIGNAL_BUS_WIDTH-1 : …
Run Code Online (Sandbox Code Playgroud)

struct verilog hdl

5
推荐指数
1
解决办法
3870
查看次数

在 Verilog 中验证参数

我创建了一个模块,它接受一个指定模块数据线字节宽度的参数。它看起来像:

module wrapper#
(
    parameter DATA_BYTE_WIDTH = 1
)
( 
    din, dout, ..
);
    localparam DATA_BIT_WIDTH = 8*DATA_BYTE_WIDTH;
    input [DATA_BIT_WIDTH-1:0] din;
    output [DATA_BIT_WIDTH-1:0] dout;
    .....
    generate
        if( DATA_BYTE_WIDTH == 1 ) begin
            // Various modules and interconnects for 1-byte data
        else if( DATA_BYTE_WIDTH == 2) begin
            // Various modules and interconnects for 2-byte data
        else if....
            // and so on, for 4, 8, and 16
        else 
           // DATA_BYTE_WIDTH is not a valid value
           // HERE is where I want to …
Run Code Online (Sandbox Code Playgroud)

verilog hdl xilinx-ise

5
推荐指数
1
解决办法
3735
查看次数

Verilog:if语句和case语句之间的区别

我是 Verilog 语言的新手,想做一些练习来熟悉它。我在HDLbits上遇到了这个问题:DFF8ar

这个问题要求我创建 8 个具有高电平有效异步复位功能的 D 触发器。我使用一个case语句来处理areset信号:

module top_module (
input clk,
input areset,   // active high asynchronous reset
input [7:0] d,
output reg[7:0] q
);

always @(posedge clk or posedge areset) begin
    case (areset)
        1'b1: q <= 8'b0; 
        default: q <= d;
    endcase
end
endmodule
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,它生成的电路忽略了该clk信号: 在此输入图像描述

但是,如果我将case语句切换为if-else语句,结果将是正确的:

always @(posedge clk or posedge areset) begin
    if (areset)
        q <= 8'b0; 
    else q <= d;
end
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

即使进行了一些研究后,我也不知道其背后的原因。if-else陈述和 …

verilog hdl system-verilog

5
推荐指数
1
解决办法
1290
查看次数