谢谢各位!!
> 下面是我简单的代码:
> (这个module是个带控制端的逻辑电路,完成平方、立方、阶乘运算)
> `define Square 4'd0
> `define Cube 4'd1
> `define Factorial 4'd2
> module function_test(result,opcode,in);
> output [7:0] result;
> input [7:0] in;
> input [4:0] opcode;
> always @ (opcode or in)
> result=Operation(in,opcode);
>
> function [7:0] Operation; //此函数完成平方、立方、阶乘运算
> input [7:0] source; //被操作数
> input [4:0] command; //用于选择运算种类
> reg [7:0] index; //中间变量
> always @ (command or source)
> casex(command)
> `Square: Operation=source*source;
> `Cube: Operation=source*source*source;
> `Factorial: begin
> Operation=1;
> for(index=2;index<=source;index=index+1)
> Operation=Operation*index;
> end
> default: Operation=8'bzzzz_zzzz;
> endcase
> endfunction
> endmodule
1.always內不能放在function內
2.for(index=2;index<=source;index=index+1) 的source必須是定數
因為是變數的話,這個合成硬件
以下是我改的
`define Square 4'd0
`define Cube 4'd1
`define Factorial 4'd2
module Function(result,opcode,in);
output reg [7:0] result;
input [7:0] in;
input [4:0] opcode;
always@(opcode or in)
result = Operation(in, opcode);
function [7:0] Operation;
input [7:0] source;
input [4:0] command; begin
Operation = (command == `Square) ? source * source :
(command == `Cube) ? source * source *
source :
8'bzzzz_zzzz;
end
endfunction
endmodule
不過Factorial部分我還沒想出要怎麼改
> > endmodule- 隱藏被引用文字 -
>
> - 顯示被引用文字 -
你這種寫法主要有兩個問題
1.always不能放在function內
2.for(index=2;index<=source;index=index+1) 的source必須是定數
因為是變數的話,這個不能合成硬件
以下是我改的
`define Square 4'd0
`define Cube 4'd1
`define Factorial 4'd2
module Function(result,opcode,in);
output reg [7:0] result;
input [7:0] in;
input [4:0] opcode;
always@(opcode or in)
result = Operation(in, opcode);
function [7:0] Operation;
input [7:0] source;
input [4:0] command; begin
Operation = (command == `Square) ? source * source :
(command == `Cube) ? source * source *
source :
8'bzzzz_zzzz;
end
endfunction
endmodule
不過Factorial部分我還沒想出要怎麼改
On 11月20日, 下午4時55分, 成电王超 <dljxcwangc...@126.com> wrote:
> > - 顯示被引用文字 -- 隱藏被引用文字 -
>
> - 顯示被引用文字 -
在Verilog,for並不能如寫C那樣
因為Verilog是個硬件描述語言,而不是硬件程序語言,
for是用來描述硬件
如你有五個乘法器要描述,就可以用for來描述5個乘法器
但你若有n的乘法器,而n是個變數,這樣合成器就會傻眼了
畢竟FPGA的logic element或者ASIC的電晶體數目都是固定的,不可能有變數出現
不過可惜Quartus II 8.1目前還不能合成
你可以看看你的合成器可以合成嗎?
module Factorial (
input [3:0] iN, // 0 ~ 15
output [31:0] oRESULT // 1 * 2 * 3...* 15
);
assign oRESULT = fact(iN);
function automatic [63:0] fact (
input [31:0] n
);
if (n == 1)
fact = 1;
else
fact = n * fact(n-1);
endfunction
endmodule
On 11月28日, 上午11時04分, dljxcwangchao <dljxcwangc...@126.com> wrote:
> 谢谢了,受益匪浅!!
>
> 在2008-11-28?06:20:07,OOMusou?<oomu...@gmail.com>?写道:
>
>
>
> >關於Fractorial
> >我覺得只能去找近似的公式來做了
> >不可能如軟件的思維用for來做
>
> >在Verilog,for並不能如寫C那樣
> >因為Verilog是個硬件描述語言,而不是硬件程序語言,
> >for是用來描述硬件
> >如你有五個乘法器要描述,就可以用for來描述5個乘法器
>
> >但你若有n的乘法器,而n是個變數,這樣合成器就會傻眼了
> >畢竟FPGA的logic?element或者ASIC的電晶體數目都是固定的,不可能有變數出現
>
> >On?11月27日,?下午2時48分,?成电王超?<dljxcwangc...@126.com>?wrote:
> >>?谢谢
>
> >>?On?11月27日,?上午10時40分,?OOMusou?<oomu...@gmail.com>?wrote:
>
> >>?>?前一篇有錯字,重發一次
>
> >>?>?你這種寫法主要有兩個問題
>
> >>?>?1.always不能放在function內
> >>?>?2.for(index=2;index<=source;index=index+1)?的source必須是定數
> >>?>?因為是變數的話,這個不能合成硬件
>
> >>?>?以下是我改的
>
> >>?>?`define?Square????4'd0
> >>?>?`define?Cube??????4'd1
> >>?>?`define?Factorial?4'd2
>
> >>?>?module?Function(result,opcode,in);
> >>?>?output?reg?[7:0]?result;
> >>?>?input??[7:0]?in;
> >>?>?input??[4:0]?opcode;
>
> >>?>?always@(opcode?or?in)
> >>?>???result?=?Operation(in,?opcode);
>
> >>?>?function?[7:0]?Operation;
> >>?>?input?[7:0]?source;
> >>?>?input?[4:0]?command;?begin
>
> >>?>?Operation?=?(command?==?`Square)???source?*?source?:
> >>?>?????????????(command?==?`Cube)?????source?*?source?*
> >>?>?source?:
> >>?>?????????????8'bzzzz_zzzz;
>
> >>?>?end
> >>?>?endfunction
>
> >>?>?endmodule
>
> >>?>?不過Factorial部分我還沒想出要怎麼改
>
> >>?>?On?11月20日,?下午4時55分,?成电王超?<dljxcwangc...@126.com>?wrote:
>
> >>?>?>?>??我今天在使用verilog里面的function的时候遇到了问题,老是调试不正确,能帮我看一看吗?
>
> >>?>?>??我估计是自己对function的语法还不够了解
>
> >>?>?>??谢谢各位!!
>
> >>?>?>?>?下面是我简单的代码:
> >>?>?>?>?(这个module是个带控制端的逻辑电路,完成平方、立方、阶乘运算)
> >>?>?>?>?`define?Square????4'd0
> >>?>?>?>?`define?Cube??????4'd1
> >>?>?>?>?`define?Factorial?4'd2
> >>?>?>?>?module?function_test(result,opcode,in);
> >>?>?>?>?output?[7:0]?result;
> >>?>?>?>?input??[7:0]?in;
> >>?>?>?>?input??[4:0]?opcode;
> >>?>?>?>?always?@?(opcode?or?in)
> >>?>?>?>???result=Operation(in,opcode);
>
> >>?>?>?>?function?[7:0]?Operation;??//此函数完成平方、立方、阶乘运算
> >>?>?>?>??input?[7:0]?source;???//被操作数
> >>?>?>?>??input?[4:0]?command;??//用于选择运算种类
> >>?>?>?>??reg?[7:0]?index;??//中间变量
> >>?>?>?>?always?@?(command?or?source)
> >>?>?>?>??casex(command)
> >>?>?>?>????`Square:?????Operation=source*source;
> >>?>?>?>????`Cube:???????Operation=source*source*source;
> >>?>?>?>????`Factorial:??begin
> >>?>?>?>??????????????????Operation=1;
> >>?>?>?>??????????????????for(index=2;index<=source;index=index+1)
> >>?>?>?>????????????????????Operation=Operation*index;
> >>?>?>?>?????????????????end
> >>?>?>?>?????default:????Operation=8'bzzzz_zzzz;
> >>?>?>?>??endcase
> >>?>?>?>?endfunction
> >>?>?>?>?endmodule-?隱藏被引用文字?-
>
> >>?>?>?-?顯示被引用文字?--?隱藏被引用文字?-
>
> >>?>?-?顯示被引用文字?--?隱藏被引用文字?-
>
> >>?-?顯示被引用文字?-- 隱藏被引用文字 -
>
> - 顯示被引用文字 -