生成语句对两个N位总线进行按位异或
0赞
发表于 2/29/2012 5:17:03 PM
阅读(4614)
/*本程序说明了如何使用生成语句对两个N位的总线用门级原语进行按位异或。
在这里其目的在于说明循环生成语句的使用方法,其实这个实例如果使用矢量
线网的逻辑表达式比用门级原语实现 起来更为简单*/
//本模块生成两条N位总线变量的按位异或。
module fpgaceshi (out, i0, i1);
parameter N = 32;
parameter N = 32;
//端口的声明语句
output [N - 1:0] out;
input [N - 1:0] i0, i1;
output [N - 1:0] out;
input [N - 1:0] i0, i1;
//声明一个临时循环变量
//该变量只用于生成块的循环计算
//Verilog仿真时该变量在设计中并不存在
genvar j;
//该变量只用于生成块的循环计算
//Verilog仿真时该变量在设计中并不存在
genvar j;
//用一个单循环生成按位异或的异或门(xor)
generate
for (j = 0; j < N; j = j + 1)
begin :xor_loop
xor g1(out [j], i0[j], i1[j]);
end //在生成块内部结束循环
endgenerate //结束生成块
generate
for (j = 0; j < N; j = j + 1)
begin :xor_loop
xor g1(out [j], i0[j], i1[j]);
end //在生成块内部结束循环
endgenerate //结束生成块
//另外一种编写形式
//异或门可以用always块来替代
//异或门可以用always块来替代
/*
reg [N - 1:0] out ;
generate
for (j = 0; j < N; j = j + 1)
begin: bit
always @ (i0[j] or i1[j])
out[j] = i0[j] ^ i1[j];
end
endgenerate
*/
reg [N - 1:0] out ;
generate
for (j = 0; j < N; j = j + 1)
begin: bit
always @ (i0[j] or i1[j])
out[j] = i0[j] ^ i1[j];
end
endgenerate
*/
endmodule
/*
(1) 在仿真之前,仿真器会对生成块中的代码进行确立(展平),将生成块转换为
展开的代码,然后对展开的代码进行仿真。因此,生成块的本质是使用循环内的一条
语句来替代多条重复的Verilog 语句,简化用户的编程。
(2) 关键字genvar用于声明生成的变量,生成变量只能用在生成块之中,在确立后
的仿真代码中,生成变量是不存在的。
(3) 一个生成变量的值只能有循环生成语句来改变。
(4) 循环生成语句可以嵌套使用,不过使用在同一个生成块作为索引的循环生成语
句不能够相互嵌套。
(5) xor_loop是赋值循环生成语句的名字,目的在于通过它对循环生成语句之中的
变量进行层次引用。因此,循环生成语句中的各个异或门的相对层次名为:xor_loop[0].g1,
xor_loop[1].g1,...xor_loop[31].g1.
注意:重要的是能够想象出循环生成语句被展平之后的形式,这点是必要的。
*/
