lljlljlzh1

生成语句对两个N位总线进行按位异或

0
阅读(4614)


/*本程序说明了如何使用生成语句对两个N位的总线用门级原语进行按位异或。
在这里其目的在于说明循环生成语句的使用方法,其实这个实例如果使用矢量
线网的逻辑表达式比用门级原语实现 起来更为简单*/


//本模块生成两条N位总线变量的按位异或。
module fpgaceshi (out, i0, i1);
parameter N = 32;
//端口的声明语句
output [N - 1:0] out;
input [N - 1:0] i0, i1;
//声明一个临时循环变量
//该变量只用于生成块的循环计算
//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 //结束生成块
//另外一种编写形式
//异或门可以用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
*/

endmodule
/*
 (1) 在仿真之前,仿真器会对生成块中的代码进行确立(展平),将生成块转换为
 展开的代码,然后对展开的代码进行仿真。因此,生成块的本质是使用循环内的一条
 语句来替代多条重复的Verilog 语句,简化用户的编程。
 (2) 关键字genvar用于声明生成的变量,生成变量只能用在生成块之中,在确立后
 的仿真代码中,生成变量是不存在的。
 (3) 一个生成变量的值只能有循环生成语句来改变。
 (4) 循环生成语句可以嵌套使用,不过使用在同一个生成块作为索引的循环生成语
 句不能够相互嵌套。
 (5) xor_loop是赋值循环生成语句的名字,目的在于通过它对循环生成语句之中的
 变量进行层次引用。因此,循环生成语句中的各个异或门的相对层次名为:xor_loop[0].g1,
 xor_loop[1].g1,...xor_loop[31].g1.
 
 注意:重要的是能够想象出循环生成语句被展平之后的形式,这点是必要的。
*/