我是硬件初学者.
在学习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) 当我在 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) 我想在任务中使用 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声明放在begin和generate在上面的代码中将语句。它仍然产生编译器错误
提前致谢,
杰·奥拉宾德
如果我的VHDL 中有变量,它是否可以综合(使用RTL编译器等软件)?
我对此表示怀疑,因为它会立即更改其值。我现在在用std_logic。
我无法理解计算范围 [-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\ncosh(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) 我在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)
至少无法理解为什么在屏幕中我们输入地址[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);
verilog$signed和signed'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
出于好奇,他们的标准对 Verilog 模块或 VHDL 实体中的最大端口数有限制吗?
我了解了 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)