以下是代码:代码的意图是从寄存器中的一个计算前导零的数量.我只想从寄存器有效数据中计算一次前导零.我必须使用一个总是块.现在我最初分配了一个1'b1,后来我将它改为1'b0,这样块就会被执行一次.如果我尝试模拟代码.始终块不会执行.但是如果我后来指定为0'b1(这没有任何意义).代码在模拟器中正确模拟.但是,如果我在FPGA工具包中合成代码,它会产生一些错误的结果.请帮我
integer count,index;
wire a;
assign a=1'b1;
always@(a)
begin
for(count=0;count<7;count=count+1) begin
index=4*count;
if((significand[index ]==1'b0) && (significand[index+1]==1'b0) &&
(significand[index+2]==1'b0) && (significand[index+3]==1'b0))
lzero=lzero+1;
end
end
assign a=1'b0;
// If I use assign a=0'b1, it simulates properly,
// but 0'b1 doesn't make any sense, also If I keep 0'b1,
// I dont get proper result in actual synthesis onto the board.
Run Code Online (Sandbox Code Playgroud)
实际上,我提出问题的意图是,我应该如何能够使用"始终"块.因为我只想执行一次这个块,所以我不需要总是设置"posedge clk"或"negedge clock".所以我该怎么做 ??请帮助,因为我的项目要求我使用for循环if else循环
你看起来像是一个试图编写程序的软件工程师,而不是试图描述硬件.
在编码时,你必须非常平行地思考.
你的代码说"连续并始终将一个值赋值为a",然后它会"连续地并且始终将值0赋值给".这显然不是你想要的.那些赋值语句不是你想要的那些时间.
所以你想要这样的东西(在伪代码中):1)读取输入寄存器2)计数0的数量3)输出0的数量
在软件中你会像这样做第2步:
for i=msb to lsb loop
if (input[i] == 1) then break;
end loop
return i;
Run Code Online (Sandbox Code Playgroud)
对于HW中的循环,或者意味着编写一个状态机(想想你如何使用函数语言进行递归,其中一个输入是你要做的索引).或者我们可以自己展开循环.
if (msb == 1 ) then return 0
else if (msb-1 == 1) then return 1
...
else if (msb-31 == 1) then return 31
else return 32
end if
Run Code Online (Sandbox Code Playgroud)