在Verilog寄存器中将0转换为Z.

时间:2016-06-17 19:14:31

标签: verilog

我正在使用连接到FPGA的charlieplexed LED板,我想将包含1&0和0的寄存器转换为0&s; s和z' s 。例如, 8' b01000000 8' bz0zzzzzz

以下代码有效:

   LED = 8'b01000000; 
   converted = {LED[0] ? 1'b0 : 1'bz, 
                LED[1] ? 1'b0 : 1'bz, 
                LED[2] ? 1'b0 : 1'bz, 
                LED[3] ? 1'b0 : 1'bz, 
                LED[4] ? 1'b0 : 1'bz, 
                LED[5] ? 1'b0 : 1'bz, 
                LED[6] ? 1'b0 : 1'bz, 
                LED[7] ? 1'b0 : 1'bz};

为简单起见,我想用一行代码替换它。但是,z的大多数逻辑操作都会导致“未知”。值x,我的编译器解析为0.是否有可以完成此转换的按位操作?

3 个答案:

答案 0 :(得分:3)

您可以尝试for循环。这将使您的代码更好地扩展。

reg [7:0] converted;
integer i;
always @* for (i=0; i<8; i=i+1) converted[i] = LED[i] ? 1'b0 : 1'bz;

您还可以在生成块中使用for循环。如果converted旨在合成三态驱动程序,则此方法很有用。

wire [7:0] converted;
genvar gidx;
generate
  for(gidx=0; gidx<8; gidx=gidx+1) begin : label_gen_pulldown
    assign converted[gidx] = LED[gidx] ? 1'b0 : 1'bz;
  end
endgenerate

答案 1 :(得分:0)

如何将每个位委托给这样的模块?这是Verilog-2001语法:

module converter(signal, converted);
   input signal;
   output wire converted;

   assign converted = signal ? 1'b0 : 1'bz;
endmodule

LED = 8'b01000000;

// one liner
converter _converter[7:0](.signal(LED), .converted(converted));
第21页的

Documented here(标记为第17页):

  

module_name instance_name instance_array_range( .port_name(signal), ... );

     

instance_array_range(可选)实例化多个模块,每个实例   连接到向量的不同位

     

如果模块端口的位宽不同于信号的宽度   连接到它,每个模块端口实例连接到部分选择   信号,最右边的实例索引连接到最右边   向量的一部分,向左进展。

     

每个信号中必须有正确的位数才能连接到所有位   实例(信号大小和端口大小必须是倍数)。

这会将LEDconverted位数组分布在8个实例化的converter中,因此for循环是为您隐式完成的。

答案 2 :(得分:-2)

 LED=8'b0zzzzzzz; 

这会给你答案。