编写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)我在我的设计中为时钟控制了一些锁存和逻辑.我在合成和布局方面没有太多经验.在RTL中实现时钟门控的正确方法是什么?
例1:
always_comb begin
gated_clk = clk & latch_update_en;
end
always_latch begin
if(gated_clk) begin
latch_data <= new_data;
end
end
Run Code Online (Sandbox Code Playgroud)
例2:在对RTL时钟门控的良好实践进行一些研究时,我偶然发现了一个RTL示例.该示例实现了上面的代码:
clock_gator cg_cell (.clk(clk), .en(latch_update_en), .scan_en(scan_en_in), .gated_clk(gated_clk));
always_latch begin
if(gated_clk) begin
latch_data <= new_data;
end
end
Run Code Online (Sandbox Code Playgroud)
使用自定义时钟门控单元的目的是什么?如果clk在带有另一个使能信号的always_comb块中直接"和"处理,那么该工具是否在合成中有困难时间?我感觉使用特殊时钟门控单元是生成门控时钟信号的标准方法.我试图理解为什么会这样.
我正在为Verilog中的一个简单的符号扩展器开发一个我正在为计算机体系结构创建的处理器.
这是我到目前为止所做的:[编辑:略微改变选择陈述]
`timescale 1ns / 1ps
module SignExtender( CLK, extend, extended );
input[7:0] extend;
input CLK;
output[15:0] extended;
reg[15:0] extended;
wire[7:0] extend;
always
begin
while (CLK == 1)
extended[7:0] = extend[7:0];
extended[15:8] = {8{extend[7]}};
end
endmodule
Run Code Online (Sandbox Code Playgroud)
我添加了while(CLK == 1)思考可以解决我的问题,我认为这是一个无限循环.当我尝试在iSim中测试时,电路永远不会初始化.
我也尝试删除复制语法,只为[8] - [15]做扩展[8] = extend [7]等,但是会出现相同的结果,所以我很确定最内层的语法是正确的.
这是测试文件:
`timescale 1ns / 1ps
module SignExtender_testbench0;
// Inputs
reg [7:0] extend;
reg CLK;
// Outputs
wire [15:0] extended;
// Instantiate the Unit Under Test (UUT)
SignExtender uut (
.extend(extend),
.extended(extended)
);
initial begin
// …
Run Code Online (Sandbox Code Playgroud) 可能不是StackOverflow这个问题,但是编译器和Verilog(可以视为编程语言)都与此项目有关。
在哪里可以找到从Verilog语言到GDSII格式或Netlist的开源(或可下载且免费用于非商业用途)编译器?有很多Verilog模拟器(可将其编译为本地机器代码或C语言),很多Verilog-to-FPGA编译器,但我希望编译器能够从Verilog生成晶体管的几何结构。
网表是http://en.wikipedia.org/wiki/网表-集成电路元件的互连,例如晶体管,电阻器甚至是电池(?)。它可以转换为GDSII,但是如果编译器在“ Verilog-> Netlist”上运行,我还需要一个免费的转换器“ Netlist-> GDS2”。
GDSII http://en.wikipedia.org/wiki/GDSII-是VLSI集成电路(IC)的一种格式,被IC制造商所接受。一个人用硅制造GDSII几乎是不可能的,但是我认为尝试编译一些小示例可能很有趣。
该编译器可以使用“完全定制”(它将绘制所有晶体管本身),也可以使用“基于单元”的设计(将verilog编译为某些库单元的几何集)。
当然,所需的编译器可以是大学项目,而不能编译大型Verilog项目。
谢谢。
我是HDL语言的新手.我有一个关于如何编程移位寄存器的问题.(我知道我转向另一个方向).为什么这本书使用wire[N-1:0] r_next
?我的实施有什么缺点?谢谢
我的第一次尝试如下
module lesson04#(parameter N=8)(
input wire clk, reset,
input wire data,
output wire out
);
reg [N-1: 0] r_reg;
always @(posedge clk or negedge reset)
begin
if(!reset)
r_reg =0;
else
r_reg[0]=data;
r_reg = r_reg<<1;
end
assign out =r_reg[N-1];
endmodule
Run Code Online (Sandbox Code Playgroud)
但是这本书给出了:
module lesson04#(parameter N=8)(
input wire clk, reset,
input wire data,
output wire out
);
reg [N-1: 0] r_reg;
wire[N-1:0] r_next;
always @(posedge clk or negedge reset)
begin
if(!reset)
r_reg =0;
else
r_reg <= r_next;
end
assign …
Run Code Online (Sandbox Code Playgroud) 我想将修改后的分数乘以整数,如下所示
我已经做了什么来找到分数转换为CSD形式的方法.但我想知道如何应用乘以整数.
例如,我得到了这个
然后我可以像verilog rtl表达式那样:
但问题是,如果输入值为3,那么如何计算上面的代码呢?
但据我所知,它无法计算.因为3 >> 1为1,(3 >> 5)为0,(3 >> 7)为0,(3 >> 10)为0;
所以我无法得到正常的结果.找到修改的分数表达式的原因也消失了.然后这个帖子的问题点是"如何将修改后的分数应用于整数".
更新:这应该是这样的.y =((3 << 1024)>> 1) - ((3 << 1024)>> 5) - ((3 << 1024)>> 7)+((3 << …
我正在使用verilog设计芯片.我有一个3位计数器.我希望当计数器处于第8个循环时,应该有一个时钟故障然后正常工作.在verilog设计中可能产生时钟故障的方法是什么?
我一直读到 RTL 代码中声明的延迟永远无法被综合。它们仅用于模拟目的,现代综合工具只会忽略代码中的延迟声明。
例如:将被综合工具x = #10 y;
视为。x = y;
有人可以解释一下为什么无法综合任何硬件描述语言(即VHDL、Verilog 或Sytem-Verilog)中的延迟声明吗?
我无法在文本文件中获得正确的输出,但是在modelsim中的模拟非常好..但是在将其写入文本文件时,每次输入都获得XX.可能有一些语法错误或其他一些.如果有任何可以帮助plz写下测试工作台来写一个触发器的dout(输出)(作为一个例子),每个dout(输出)显示在文本文件的新行中.
码:
module LFSR( clk,reset,out);
parameter width =4;
input clk,reset;
output [width-1:0] out ;
reg [width-1:0] lfsr;
integer r;
wire feedback = lfsr[width-1]^lfsr[width-2];
always @(posedge clk)
if (reset)
begin
lfsr <= 4'b1000;
end
else
begin
lfsr[0] <= feedback;
for(r=1;r<width;r=r+1)
lfsr[r]<=lfsr[r-1];
end
assign out=lfsr;
endmodule
Run Code Online (Sandbox Code Playgroud)
试验台:
module aaatest();
parameter width =4;
reg clk,reset;
wire [width-1:0] out;
reg [width-1:0] lfsr[13:0];
integer f,i;
initial
begin
f = $fopen("output.txt","w");
end
LFSR patt (clk,reset,out);
always #5 clk=~clk;
initial begin
clk=1; reset=1;
#10 reset=0;
# 140 …
Run Code Online (Sandbox Code Playgroud)