为什么我不能在 Verilog "always" 块中将一个寄存器的内容复制到另一个寄存器?
Why I can not copy a content of register to another one in "always" block in Verilog?
好吧,我有这段代码,它运行良好:
module syncRX(clk, signal, detect);
input clk, signal;
output reg [7:0] detect = 0;
reg [7:0] delay = 0;
//wire clk_1khz;
freq_div div(.clk(clk), .clk_1khz(clk_1khz));
always @(posedge signal)
begin
detect <= detect + 1;
delay <= 0;
end
always @(posedge clk_1khz)
begin
delay <= delay + 1;
end
endmodule // top
module freq_div(input clk, output reg clk_1khz);
reg [12:0] count = 0;
always @(posedge clk)
begin
if(count == 6000)
begin
clk_1khz <= ~clk_1khz;
count <= 0;
end
else
count <= count + 1;
end
endmodule
当我更改行“detect <= detect + 1;”时出现问题“检测 <= 延迟;”。
目的是计算信号的周期,但我收到 Icestorm 的警告消息:
警告:在设计中找不到时钟
FPGA 停止工作...
拜托,任何人都知道发生了什么问题?
感谢大家!
通过问题的投票我可以看出这不是一个好问题,也许是因为社区认为它已经记录在案,但我仍然找不到解决问题的方法,我做了一些改进,我会尝试再次在这里寻求帮助,我现在有这段代码,可以完美地合成:
module syncRX(clk, signal, detect);
input clk, signal;
output [7:0] detect;
reg [7:0] detect_aux = 8'b0;
reg rst;
assign detect = detect_aux & ~rst;
freq_div div(.clk(clk), .clk_1khz(clk_1khz));
always @(posedge signal)
rst <= 1;
always @(posedge clk_1khz)
detect_aux <= detect_aux + 1;
endmodule // top
module freq_div(input clk, output reg clk_1khz);
reg [12:0] count = 0;
always @(posedge clk)
begin
if(count == 6000)
begin
clk_1khz <= ~clk_1khz;
count <= 0;
end
else
count <= count + 1;
end
endmodule
问题在于
reg rst;
assign detect = detect_aux & ~rst;
接缝什么都不做。有什么建议吗?
谢谢
问题是 delay
是多重驱动的(合成中不允许从多个 always 块驱动)这是未定义的行为(在这种情况下,我相信将使用常量“0”)。它也应该至少是一个警告。
好吧,我有这段代码,它运行良好:
module syncRX(clk, signal, detect);
input clk, signal;
output reg [7:0] detect = 0;
reg [7:0] delay = 0;
//wire clk_1khz;
freq_div div(.clk(clk), .clk_1khz(clk_1khz));
always @(posedge signal)
begin
detect <= detect + 1;
delay <= 0;
end
always @(posedge clk_1khz)
begin
delay <= delay + 1;
end
endmodule // top
module freq_div(input clk, output reg clk_1khz);
reg [12:0] count = 0;
always @(posedge clk)
begin
if(count == 6000)
begin
clk_1khz <= ~clk_1khz;
count <= 0;
end
else
count <= count + 1;
end
endmodule
当我更改行“detect <= detect + 1;”时出现问题“检测 <= 延迟;”。 目的是计算信号的周期,但我收到 Icestorm 的警告消息: 警告:在设计中找不到时钟
FPGA 停止工作... 拜托,任何人都知道发生了什么问题? 感谢大家!
通过问题的投票我可以看出这不是一个好问题,也许是因为社区认为它已经记录在案,但我仍然找不到解决问题的方法,我做了一些改进,我会尝试再次在这里寻求帮助,我现在有这段代码,可以完美地合成:
module syncRX(clk, signal, detect);
input clk, signal;
output [7:0] detect;
reg [7:0] detect_aux = 8'b0;
reg rst;
assign detect = detect_aux & ~rst;
freq_div div(.clk(clk), .clk_1khz(clk_1khz));
always @(posedge signal)
rst <= 1;
always @(posedge clk_1khz)
detect_aux <= detect_aux + 1;
endmodule // top
module freq_div(input clk, output reg clk_1khz);
reg [12:0] count = 0;
always @(posedge clk)
begin
if(count == 6000)
begin
clk_1khz <= ~clk_1khz;
count <= 0;
end
else
count <= count + 1;
end
endmodule
问题在于
reg rst;
assign detect = detect_aux & ~rst;
接缝什么都不做。有什么建议吗? 谢谢
问题是 delay
是多重驱动的(合成中不允许从多个 always 块驱动)这是未定义的行为(在这种情况下,我相信将使用常量“0”)。它也应该至少是一个警告。