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