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

在Verilog寄存器中将0转换为Z,verilog,Verilog,我正在使用连接到FPGA的字符复合LED板,我想将包含1和0的寄存器转换为0和z。例如,8'b01000000到8'BZ0ZZZZZ 以下代码起作用: 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'

我正在使用连接到FPGA的字符复合LED板,我想将包含1和0的寄存器转换为0和z。例如,8'b010000008'BZ0ZZZZZ

以下代码起作用:

   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。是否有一个位操作可以完成此转换?

您可以尝试一个for循环。这将使您的代码规模更好

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

这会给你答案

把每一位委派给这样的模块怎么样?这是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页(标记为第17页):

模块名称实例名称实例数组范围(.port\u name(信号),…)

instance\u array\u range
(可选)实例化多个模块,每个实例 连接到向量的不同位

如果模块端口的位宽度与信号宽度不同 连接到它之后,每个模块端口实例都连接到选择的一部分 信号,最右边的实例索引连接到最右边的实例索引 向量的一部分,并向左转

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


这将在8个实例化的
转换器
之间传播
LED
转换的
位数组,因此为您隐式完成for循环。

我不想将LED设置为静态值;我需要任意转换LED,无论其值如何。
 LED=8'b0zzzzzzz; 
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));