在下面的Verilog模块中,我想了解为什么使用级联的阻塞赋值没有给出与2注释掉的阻塞分配相同的结果。
当我在FPGA上运行程序时,它给出了两个阻塞分配( leds闪烁)的预期结果,而不是使用级联( leds保持关闭)的阻塞分配。
加分的答案指向Verilog规范,解释在这里发挥的作用!
/* Every second, the set of leds that are lit will change */
module blinky(
input clk,
output [3:0] led
);
reg [3:0] count = 0;
reg [27:0] i = 0;
我这里有一段Verilog代码 $size(data); 其中data是一个16位数字。 但是,它在Vivado中给出了一个错误。 error: system call size not allowed in this dialect use system Verilog mode 我试着寻找解决方案,但没有运气,因此在这里张贴它。
我正在使用Emacs修改Perl和Verilog交错的代码。我使用在这两者之间切换,这与预期的一样。问题是perl代码是用//;逐行表示的,如下所示:
This is verilog code
// This is a verilog comment
//; This is perl code
//; This is more perl code
This is verilog code again.
虽然双模式模式可以识别出它是Perl,但它是逐行执行的,所以跨行进行缩进之类的操作没有意义。
我想要做的是让Perl代码像往常一样格式化,但忽略//;字符(它们应该放在行首,然后像往常一样对
我正在实现一个自定义的16位cpu (在verilog中)。如果我需要实现一个溢出标志来处理带符号的比较,我会遇到麻烦。
在我目前的实现中,我只检查结果的0和符号位,以确定比较的结果:
when comparing x to y the ALU calculates: x - y (2's compl)
If the sign bit is set and the result is not zero y > x
If the sign bit is not set and the result is not zero x > y
我没有使用溢出标志来确定比较的结果。我尝试
在verilog中,{a + b}和(a + b)有什么不同。我用模拟来做:
reg [3:0] a = 4'b0001;
reg [3:0] b = 4'b1111;
reg [4:0] c = (a + b); give the result c = 5'b1_0000
但
reg [4:0] c = {a + b}; give c = 5'b0_0000;
这意味着(a + b)可以给出结果5位,而{a + b}可以给出4位。我也不知道原因。请帮帮我。
谢谢
我试图使用下面的代码在verilog中生成波形,但结果并不像预期的那样。
initial begin
d = 1'b0;
#8 d <= 1'b1;
#15 d <= 1'b0;
end
它的初始值是0(OK),在t=8,它的1(OK),但在t=23,它的0。相反,我希望t=15的值为0,相对于t=0,而不是t=8(即前面的语句)。
是否有办法这样做?我尝试过交换阻塞和非阻塞任务,但没有运气!
谢谢,
开发人员
我刚开始理解Verilog,因为这门语言需要从综合的角度来思考。
在做一些程序的时候,我发现:
begin
buf_inm[row][col] =temp_data;
#1 mux_data=buf_inm[row][col];
end
给出了正确的结果
begin
buf_inm[row][col] =temp_data;
mux_data=buf_inm[row][col];
end
在变量赋值方面。
有谁能解释一下这两者之间的区别吗?
在任何其他高级语言中,结构2(没有延迟)会给出正确的赋值。
感谢你,
你诚心的,R。甘尼桑。
我试图删除Verilog模式下的尾随空白。我已经用菜单定制了Verilog模式:"Verilog -> Customize模式.“。
在编辑或保存Verilog文件时,没有删除尾随空白。我试过一些命令‘添加钩子’,但仍然没有成功。我错过了什么?
这是我的.emacs (Emacs24.3.1):
`(custom-set-variables
;; custom-set-variables was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init
select '1'
from Dual
where to_date('11-APR-2018','DD-MM-YYYY') between to_date(sysdate - 14,'DD-MM-YYYY')
and to_date(sysdate,'DD-MM-YYYY')
为什么这个查询没有给出正确的结果,当我用硬编码的日期替换sysdate时,它给出了预期的结果,所以当使用sysdate时,为什么它没有给出预
我是相对较新的FPGA,我正在寻找一些关于Verilog模块声明的现代最佳实践的指导。
我看到了在verilog中声明模块的两种方法。第一个让我想起了,比如
module toplevel(clock,reset);
input clock;
input reset;
/* snip */
endmodule
而另一种语法将输入/输出说明符作为参数列表的一部分,与VHDL没有太大的不同,如在中。
module fadder(
input a, //data in a
input b, //data in b
in
我正在使用vivado v2016.4行为模拟来模拟下面所示的verilog代码。测试夹具代码也显示在主verilog代码下面。
控制台输出显示:
A = -13
B = 4
C = 16332
此外,如果我挂起寄存器变量,我会看到以下内容:
ff3 for A
004 for B
003fcc for C
乘法给出了正确的结果(-52或ffffcc),如果我使用
C[23:0] = $signed(A[11:0])*signed(B[11:0]);
或
C[23:0] = $signed(A[11:0]*B[11:0]);
为什么我需要使用$signed来获得正确的结果?
我使用的是icarus verilog的最新主分支构建。
我应该期望运行下面的代码吗?
module string_display ();
//reg [10:0][7:0] x = "initial";
string x = "initial";
always @* begin
$display ("x = %s",x);
end
initial begin
// Assign new string
x = "aaaaa";
#1
// Assign new string
x = &
我试图生成一个使用generate语句彼此相邻放置的锁存数组。我一直试图使用Xilinx约束"RLOC“来完成这个任务,但我没有成功。
下面的代码不会成功地实现,但是应该说明我试图获得的结果。下面代码的问题是,约束调用中的"i“没有被转换为字符串,这正是调用所要寻找的。有人有这样做的经验吗?
我使用Virtex4和XilinxISE10.1.03进行综合和实现。我不太清楚我使用的Verilog是什么版本,但我认为它是Verilog 2001。如果有人也能告诉我如何检查我使用的Verilog版本,我将不胜感激。
genvar i;
generate
for (i