标签: hdl

同时使用case语句和if-else?

我是硬件初学者.

在学习Verilog HDL时,由于缺乏系统学习,我在学习期间很容易迷路.

我正在尝试编写下面状态图中指定的机器的Verilog HDL行为描述.

在此输入图像描述

我在case语句中使用if-else语句,这给了我关于这些行的语法错误.

与Java或C++不同,Verilog几乎没有关于错误的来源.

你知道问题是什么吗?

我的代码附在下面:

module foo(y_out, state, x_in, clk, reset);

    input x_in, clk, reset;
    output reg y_out;
    parameter s0 = 3'b000, s1 = 3'b001, s2 = 3'b010, s3 = 3'b011, s4 = 3'b100;
    output reg[2:0] state;
    reg[2:0] next_state;

    always @(posedge clk) begin
        if(reset == 1'b0) state <= s0;
        else state <= next_state;
    end
    always @(state, x_in) begin
        y_out = 0;
        next_state = s0;
        case(state, x_in)
        s0:
            if (!x_in) begin
                next_state = s3;
                y_out = 1'b0; …
Run Code Online (Sandbox Code Playgroud)

verilog hdl

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

Vivado Sim 错误:“verilog 95/2K 模式下不允许声明根范围”

当我在 Xilinx Vivado 2016.4 中模拟我的顶级模块时,我收到了奇怪的错误:

ERROR: [VRFC 10-1342] root scope declaration is not allowed in verilog 95/2K mode [<...>/header.vh]
Run Code Online (Sandbox Code Playgroud)

我正在使用指定了 Verilog 2001 的内置Vivado 模拟器。我的header.vh如下所示:

`ifndef _header_vh_
`define _header_vh_

    function integer clog2;
        input integer value;
        begin 
            value = value - 1;
            for (clog2 = 0; value > 0; clog2 = clog2 + 1)
                value = value >> 1;
        end 
    endfunction

`endif
Run Code Online (Sandbox Code Playgroud)

verilog hdl xilinx vivado

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

在 verilog 任务中生成语句

我想在任务中使用 generate 语句。以下代码给出了编译错误(iverilog)。

task write_mem; //for generic use with 8, 16 and 32 bit mem writes
      input [WIDTH-1:0] data;
      input [WIDTH-1:0] addr;
      output [WIDTH-1:0] MEM;
      integer i;

      begin
         generate
            genvar j;
            for(j=0; j<i;j++)
            MEM[addr+(i-j-1)] = data[(j*8):((j*8) + 8)-1];
         endgenerate
      end
endtask // write_mem
Run Code Online (Sandbox Code Playgroud)

我也尝试将其放在generateline 之后integer i,但仍然产生错误。有什么想法吗?

编辑:我也尝试将genvar声明放在begingenerate在上面的代码中将语句。它仍然产生编译器错误

提前致谢,

杰·奥拉宾德

verilog hdl

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

是否可以在其中合成带有变量的 VHDL 代码

如果我的VHDL 中有变量,它是否可以综合(使用RTL编译器等软件)?

我对此表示怀疑,因为它会立即更改其值。我现在在用std_logic

vhdl hdl

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

如何使用 CORDIC 计算 [-1, 1] 之外的数字的指数?

我无法理解计算范围 [-1, 1) 之外的数字的指数背后的数学原理(实际上我不确定使用 CORDIC 计算 exp 的最佳范围是什么,我在某个地方读过 [-pi/4, pi/4] 和其他人我读过 [-1, 1)) 使用 CORDIC 算法。有人可以举个例子吗?

\n\n

我在http://zone.ni.com/reference/en-XX/help/371599G-01/lvfpga/ht_exponential/阅读了以下声明:

\n\n

“x 必须在 [\xe2\x80\x931, 1) 范围内。要在 x 超出此范围时计算 exp(x),请找到一个整数 q 和一个实数 r,其中 r 在 [0, ln(2)),使得 x = q \xc3\x97 ln(2) + r。然后您可以计算 2^q \xc3\x97 exp(r),这相当于 exp(x)。因为 r 是在[\xe2\x80\x931, 1)的有效范围内,可以使用该函数计算exp(r)。"

\n\n

但如何找到 q 和 r 对我来说没有多大意义?

\n\n

我发现的第二种方法是在http://www.xilinx.com/support/documentation/application_notes/xapp552-cordic-floating-point-operations.pdf,它告诉我们在将数字分为整数和小数部分后使用方程:

\n\n
cosh(int + frac) = cosh(int) * cosh(frac) + sinh(int) * sinh(frac)\nsinh(int + frac) = cosh(int) * sinh(frac) + cosh(frac) * …
Run Code Online (Sandbox Code Playgroud)

verilog hdl cordic

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

nand2俄罗斯方块。内存实现

我在nand2tetris课程中实现了数据存储器的实现。但我真的不明白我的实现的某些部分:

CHIP Memory {
    IN in[16], load, address[15];
    OUT out[16];

    PARTS:

    DMux4Way(in=load, sel=address[13..14], a=RAM1, b=RAM2, c=scr, d=kbr);
    Or(a=RAM1, b=RAM2, out=RAM);

    RAM16K(in=in, load=RAM, address=address[0..13], out=RAMout);
    Screen(in=in, load=scr, address=address[0..12], out=ScreenOut);
    Keyboard(out=KeyboardOut);

    Mux4Way16(a=RAMout, b=RAMout, c=ScreenOut, d=KeyboardOut, sel=address[13..14], out=out);
}
Run Code Online (Sandbox Code Playgroud)
  1. 这里负责什么负载。我知道如果负载为 0 - 在任何情况下 Dmux4Way 的输出都将为 0 0 0 0。但我不明白在这种情况下它是如何工作的。即它如何允许不将数据加载到内存中。
  2. 至少无法理解为什么在屏幕中我们输入地址[0..12]而不是地址[0..14] - 完整地址。在我看来,我们应该使用第二个,因为屏幕内存映射位于 RAM 内存映射之后,如果我们想要请求屏幕内存映射 - 我们应该使用范围 (16 384 - 24 575) - 十进制或 (100000000000000 - 101111111111111) - 二进制。但是我们如何仅使用 13 宽度总线(地址[0..12])来表示该范围???不可能。

    因此,如果我们想表示屏幕内存映射,我们应该使用上面介绍的范围。该范围具有 15 宽度或地址[0..14],但不是地址[0..12](宽度 13)。但为什么只工作地址[0..12]而不起作用地址[0..14](完整地址)

DMux4Way(in=加载,sel=地址[13..14],a=RAM1,b=RAM2,c=scr,d=kbr);

memory hdl nand2tetris

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

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

如何在 Verilog 中为常量值使用参数化位宽?

考虑以下示例:

parameter BITWIDTH = 16;
Run Code Online (Sandbox Code Playgroud)

这有效:

logic [1:0][BITWIDTH-1:0] var = {16'h30, 16'h40};

Run Code Online (Sandbox Code Playgroud)

这不起作用:

logic [1:0][BITWIDTH-1:0] var = {BITWIDTH'h30, BITWIDTH'h40}; 
Run Code Online (Sandbox Code Playgroud)

如何在上面的代码行中使用参数?

verilog hdl register-transfer-level system-verilog digital-logic

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

Verilog 模块或 VHDL 实体中的最大端口数

出于好奇,他们的标准对 Verilog 模块或 VHDL 实体中的最大端口数有限制吗?

verilog vhdl hdl

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

如何理解verilog中的阻塞和非阻塞语句?

我了解了 Verilog 中阻塞语句和非阻塞语句之间的基本区别。但我仍然无法理解&何时何地使用阻塞和非阻塞语句会发生什么。例如,考虑简单的 d ff 代码:

module dff (clk, reset,d, q, qb);
input      clk;
input      reset;
input      d;
output     q;
output     qb;

reg        q;

assign qb = ~q;

always @(posedge clk or posedge reset)
begin
  if (reset) begin
    // Asynchronous reset when reset goes high
    q <= 1'b0;
  end else begin
    // Assign D to Q on positive clock edge
    q <= d;
  end
end
endmodule
Run Code Online (Sandbox Code Playgroud)

但是如果我使用两段编码技术编写完全相同的逻辑:

module dff(input wire d,
           clk,
           reset,
           en,
           output wire q);

reg …
Run Code Online (Sandbox Code Playgroud)

verilog hdl system-verilog vlsi

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