我正在实现一个可配置的DPRAM,其中RAM DEPTH是参数.
如何从RAM DEPTH确定ADDRESS WIDTH?
我知道关系RAM DEPTH = 2 ^(ADDRESS WIDTH)
即ADDRESS WIDTH = log(base 2)RAM DEPTH.
如何在Verilog中实现log(base 2)函数?
我正在用Verilog编写一个项目,并希望用来parameter在我的模块中定义一些参数.但是,当我阅读一些源代码时,localparam有时会使用而不是parameter.
他们之间有什么区别?
在我的日常工作中,我和团队中的其他人在Verilog-AMS中编写了许多硬件模型,这种语言主要由商业供应商和一些开源模拟器项目支持.支持彼此代码更有帮助的一件事是LINTER,它会检查我们的代码是否存在常见问题并协助实施共享代码格式化风格.我当然希望能够添加自己的规则,在我向自己证明自己的实用性之后,将它们提升给团队的其他成员.我不介意做必须完成的工作,但当然也是想利用其他现有项目的工作.
使用yacc或bison格式的允许语言语法是否能让我站起来?或者我应该将每个语言语句吮吸到perl字符串中,并使用模式匹配来查找我不喜欢的内容?
(大多数语法和编译错误很容易被商业工具捕获..但我们有一些自己的扩展.)
reg和wire之间有什么区别?我们什么时候应该使用reg以及何时应该在verilog模块中使用wire.我有时也注意到输出再次被声明为reg.例如,在D触发器中的reg Q. 我已经在某处读过 - "程序赋值语句的目标输出必须是reg数据类型." 什么是程序转让声明?我已经彻底搜索了这个,但未能找到明确的解释.
如果在Verilog中使用automatic关键字声明任务是什么意思?
task automatic do_things;
input [31:0] number_of_things;
reg [31:0] tmp_thing;
begin
// ...
end
endtask;
Run Code Online (Sandbox Code Playgroud)
注意:这个问题主要是因为我很好奇网站上是否有任何硬件程序员.:)
编写RAM时哪个代码更好?
分配data_out内部always块:
module memory(
output reg [7:0] data_out,
input [7:0] address,
input [7:0] data_in,
input write_enable,
input clk
);
reg [7:0] memory [0:255];
always @(posedge clk) begin
if (write_enable) begin
memory[address] <= data_in;
end
data_out <= memory[address];
end
endmodule
Run Code Online (Sandbox Code Playgroud)data_out使用assign声明分配:
module memory(
output [7:0] data_out,
input [7:0] address,
input [7:0] data_in,
input write_enable,
input clk
);
reg [7:0] memory [0:255];
always @(posedge clk) begin
if (write_enable) begin
memory[address] <= data_in;
end
end
assign …Run Code Online (Sandbox Code Playgroud)我是一个试图学习Verilog的FPGA菜鸟.如何将值分配给始终块中的reg,作为初始值或作为常量.我试图在下面的代码中做这样的事情.我收到一个错误,因为8位常量不算作输入.我也不想触发时钟总是关闭.我只想为特定值分配一个寄存器.因为我希望它是可合成的,所以我不能使用初始块.非常感谢.
module top
(
input wire clk,
output wire [7:0] led
);
reg [7:0] data_reg ;
always @*
begin
data_reg = 8'b10101011;
end
assign led = data_reg;
endmodule
Run Code Online (Sandbox Code Playgroud) 多年来,我参与了许多基于微控制器的项目; 主要使用Microchip的PIC.我已经使用过各种微控制器模拟器,虽然它们有时会非常有用,但我常常感到很沮丧.在现实生活中,微控制器从不存在,固件的行为取决于环境.但是,我使用过的sims都没有为微控制器以外的任何东西提供良好的支持.
我的第一个想法是在Verilog中对整个电路板进行建模.但是,我宁愿不创建一个完整的CPU模型,而且我没有太多运气找到我使用的芯片的现有模型.无论如何,我真的不需要或者想要在这个细节级别模拟proc,我想保留常规处理器sim提供的调试工具.
在我看来,理想的解决方案是混合模拟器,它将传统的处理器模拟器与Verilog模型连接起来.
这样的事情存在吗?
我试图让一个模块在ISE 12.4中通过语法检查,它给了我一个我不明白的错误.首先是一个代码片段:
parameter ROWBITS = 4;
reg [ROWBITS-1:0] temp;
genvar c;
generate
always @(posedge sysclk) begin
for (c = 0; c < ROWBITS; c = c + 1) begin: test
temp[c] <= 1'b0;
end
end
endgenerate
Run Code Online (Sandbox Code Playgroud)
当我尝试语法检查时,我收到以下错误消息:
错误:HDLCompiler:731 - "test.v"第46行:不允许对非寄存器<c>进行程序分配.
我真的不明白为什么抱怨."c"不是电线,它是一种genvar.这应该等同于完全合法的语法:
reg [3:0] temp;
always @(posedge sysclk) begin
temp[0] <= 1'b0;
temp[1] <= 1'b0;
temp[2] <= 1'b0;
temp[3] <= 1'b0;
end
Run Code Online (Sandbox Code Playgroud)
请不要评论如何在没有生成的情况下更容易地编写它.这是一个更复杂的代码片段的简化示例,涉及对"temp"的多个ifs和非阻塞赋值.另外,不要只告诉我有更新版本的ISE,我已经知道了.OTOH,如果您知道它已在ISE的更高版本中修复,请告诉我您知道哪个版本有效.
在课堂上,教授说学生不应该说他们学会了用Verilog编程.他说像Verilog这样的东西不习惯用来设计它.那么Verilog与其他编程语言有何不同?