我正在尝试使用Verilog中的D触发器创建一个4位计数器。我正在遵循这个图表http://i.imgur.com/VR5593a.png。我拿到了D触发器的代码。我遇到的问题是在第一个时钟周期中的D0。我猜我必须首先假设Q0为1,Q1,Q2,Q3为0。我不确定如何在代码中只传递一次D0的初始值。
module DFlipFlop(CLK, D, Q);
input CLK, D;
output Q;
reg Q;
always @(posedge CLK) begin
Q <= D;
end
endmodule
module RippleMod(CLK, q0, q1, q2, q3);
input CLK;
output q0, q1, q2, q3;
DFlipFlop d1 (CLK,q3,q0);//not sure about q3 there, think I will get X if i do this.
DFlipFlop d2 (CLK,q0,q1);
DFlipFlop d3 (CLK,q1,q2);
DFlipFlop d4 (CLK,q2,q4);
endmodule发布于 2015-11-02 16:19:47
使用reset信号将对您有所帮助。因此,您只需将Q3重置为1,并将其余信号重置为。
发布于 2017-06-21 10:12:31
您需要执行一些操作来设置初始状态。
对于模拟,您通常可以使用“初始”块来设置寄存器的初始状态。一些综合工具,特别是那些针对FPGA/CPLD的工具,也支持以这种方式设置初始状态。一些不支持初始块的合成工具可能支持特定于工具的方法来设置初始条件。
另一种选择是在触发器中构建一条复位线。当然,这样做的缺点是,您需要一些东西来触发重置线,要么是模拟中的测试平台,要么是实际实现中的某种硬件。
发布于 2017-06-21 22:08:11
verilog将所有4状态变量初始化为'x‘。因此,你将永远在循环中运行一个'x‘,而不会有任何实际的变化。您需要为您的案例提供输入。类似以下内容(在SV中)
module RippleMod(CLK, en, in, q0, q1, q2, q3);
input CLK, en, in;
output q0, q1, q2, q3;
logic d1in;
always_ff @(negedge clk) begin
if (en)
d1in <= in;
else
d1in <= q3;
end
DFlipFlop d1 (CLK,d1in,q0);
DFlipFlop d2 (CLK,q0,q1);
DFlipFlop d3 (CLK,q1,q2);
DFlipFlop d4 (CLK,q2,q4);
endmodulehttps://stackoverflow.com/questions/33472996
复制相似问题