Verilog 83优先编码器

这个是83优先编码器 书上写的程序
module code8_3(I,Y);
input[7:0]I;
output[2:0]Y;
function[2:0]code;
input[7:0]I;
if(I[7]) code=3'b111;
else if(I[6]) code=3'b110;
else if(I[5]) code=3'b101;
else if(I[4]) code=3'b100;
else if(I[3]) code=3'b011;
else if(I[2]) code=3'b010;
else if(I[1]) code=3'b001;
else code=3'b000;
endfunction
assign Y=code(I);
endmodule

为什么不能这么写:
module code8_3(I,Y);
input[7:0]I;
output[2:0]Y;
reg[2:0]Y
always @ (I)
begin
if(I[7]) Y=3'b111;
else if(I[6]) Y=3'b110;
else if(I[5]) Y=3'b101;
else if(I[4]) Y=3'b100;
else if(I[3]) Y=3'b011;
else if(I[2]) Y=3'b010;
else if(I[1]) Y=3'b001;
else Y=3'b000;
end
endmodule

麻烦高手指教一下吧!另外assign A={B,C}是代表什么意思啊?多谢多谢!!

先回答你第二个问题
assign A={B,C} 代表 A = B+C 的组合位宽的值
例如:
wire [1:0]A ;
wire B,C;
A={B,C}; //A 是2位宽的, B是1位宽的, C是1位宽的,这样 A[1] 就对应 B ,A[0] 就对应C.

//如果
A={C,B}; //哪么 这样 A[1] 就对应 C ,A[0] 就对应B.

再回答你第一个问题
可以用你的方法写(即用always)。但是你写的程序有个地方有错,改一下就可以了。书上用的是function ,而你用的是always。这两种方法比较如下:
1,如果在本模块内,你需要实现2个83优先编码器,哪么就可以直接调用 function 模块就行了,这样使程序更简洁。
2,如果在本模块内只需要实现一个83优先编码器,就可以用 always ,在需要的地方直接调用该模块。更利于综合。

//修改后代码如下

module code8_3(I,Y);
input[7:0]I;
output[2:0]Y;
reg[2:0]Y
always @ (I or Y) //这里必须包括所有的下面要用到的信号名称 你原来是(I).少了一个Y .(也可以用*号代替 I 和 Y).
begin
if(I[7]) Y=3'b111;
else if(I[6]) Y=3'b110;
else if(I[5]) Y=3'b101;
else if(I[4]) Y=3'b100;
else if(I[3]) Y=3'b011;
else if(I[2]) Y=3'b010;
else if(I[1]) Y=3'b001;
else Y=3'b000;
end
endmodule
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-07-28

能写成你那样啊,下面是我使用你那个程序的仿真结果,达到了93优先编码器的效果,两个程序的功能是一样的,只不过书上的程序使用了fuction函数,使用的fuction函数的好处是使程序模块化,便于在本程序内调用,但是这个程序相对简单,使用fuction函数有画蛇添足的效果,呵呵。

相似回答