我正在使用连接到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.是否有可以完成此转换的按位操作?
答案 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
(可选)实例化多个模块,每个实例 连接到向量的不同位如果模块端口的位宽不同于信号的宽度 连接到它,每个模块端口实例连接到部分选择 信号,最右边的实例索引连接到最右边 向量的一部分,向左进展。
每个信号中必须有正确的位数才能连接到所有位 实例(信号大小和端口大小必须是倍数)。
这会将LED
和converted
位数组分布在8个实例化的converter
中,因此for循环是为您隐式完成的。
答案 2 :(得分:-2)
LED=8'b0zzzzzzz;
这会给你答案。