如何使用数组从一个输入输出多个值?
How to use an array to output multiple values from one input?
我正在尝试编译 SystemVerilog 代码,该代码将基于两个按钮在 4 位 7 段显示器上生成输出。我得到了使用串联运算符的提示,但一直收到“无法解析多个常量驱动程序”错误。我相信这意味着对同一个信号有多个分配。我通过删除后 3 个 assign
语句并改用数组来更正此问题,但我不确定语法如何在每个寄存器中有两个输出时起作用。添加括号无效。
(
output logic [3:0]en, //7 segment digit selector
output logic a,b,c,d,e,f,g, //7 segment display
input logic [1:0] x //button input
);
logic [3:0] lut [4] = {(4'b1000,7'h01), (4'b0100,7'h04), (4'b0010,7'h01),(4'b001,7'h01)};
assign [en,a,b,c,d,e,f,g] = lut[x]
//this was my original code
//assign {en,a,b,c,d,e,f,g} = x == 2'b11 ? {4'b1000,7'h01}:0;
//assign {en,a,b,c,d,e,f,g} = x == 2'b10 ? {4'b0100,7'h0f}:0;
//assign {en,a,b,c,d,e,f,g} = x == 2'b01 ? {4'b0010,7'h01}:0;
//assign {en,a,b,c,d,e,f,g} = x == 2'b00 ? 0:{4'b0001,7'h01};
case
语句常用于这种情况:
module disp
(
output logic [3:0]en, //7 segment digit selector
output logic a,b,c,d,e,f,g, //7 segment display
input logic [1:0] x //button input
);
always_comb begin
case (x)
2'b11 : {en,a,b,c,d,e,f,g} = {4'b1000,7'h01};
2'b10 : {en,a,b,c,d,e,f,g} = {4'b0100,7'h0f};
2'b01 : {en,a,b,c,d,e,f,g} = {4'b0010,7'h01};
2'b00 : {en,a,b,c,d,e,f,g} = {4'b0001,7'h01};
endcase
end
endmodule
你是对的:你不能对同一个信号多次使用 assign
关键字。
这是一个带有数组的版本,模拟与 case
:
module disp
(
output logic [3:0]en, //7 segment digit selector
output logic a,b,c,d,e,f,g, //7 segment display
input logic [1:0] x //button input
);
logic [10:0] lut [4] = {{4'b001,7'h01}, {4'b0010,7'h01}, {4'b0100,7'h0f}, {4'b1000,7'h01}};
always_comb begin
{en,a,b,c,d,e,f,g} = lut[x];
end
endmodule
我重新排列了数组中的值以匹配 case
。
我正在尝试编译 SystemVerilog 代码,该代码将基于两个按钮在 4 位 7 段显示器上生成输出。我得到了使用串联运算符的提示,但一直收到“无法解析多个常量驱动程序”错误。我相信这意味着对同一个信号有多个分配。我通过删除后 3 个 assign
语句并改用数组来更正此问题,但我不确定语法如何在每个寄存器中有两个输出时起作用。添加括号无效。
(
output logic [3:0]en, //7 segment digit selector
output logic a,b,c,d,e,f,g, //7 segment display
input logic [1:0] x //button input
);
logic [3:0] lut [4] = {(4'b1000,7'h01), (4'b0100,7'h04), (4'b0010,7'h01),(4'b001,7'h01)};
assign [en,a,b,c,d,e,f,g] = lut[x]
//this was my original code
//assign {en,a,b,c,d,e,f,g} = x == 2'b11 ? {4'b1000,7'h01}:0;
//assign {en,a,b,c,d,e,f,g} = x == 2'b10 ? {4'b0100,7'h0f}:0;
//assign {en,a,b,c,d,e,f,g} = x == 2'b01 ? {4'b0010,7'h01}:0;
//assign {en,a,b,c,d,e,f,g} = x == 2'b00 ? 0:{4'b0001,7'h01};
case
语句常用于这种情况:
module disp
(
output logic [3:0]en, //7 segment digit selector
output logic a,b,c,d,e,f,g, //7 segment display
input logic [1:0] x //button input
);
always_comb begin
case (x)
2'b11 : {en,a,b,c,d,e,f,g} = {4'b1000,7'h01};
2'b10 : {en,a,b,c,d,e,f,g} = {4'b0100,7'h0f};
2'b01 : {en,a,b,c,d,e,f,g} = {4'b0010,7'h01};
2'b00 : {en,a,b,c,d,e,f,g} = {4'b0001,7'h01};
endcase
end
endmodule
你是对的:你不能对同一个信号多次使用 assign
关键字。
这是一个带有数组的版本,模拟与 case
:
module disp
(
output logic [3:0]en, //7 segment digit selector
output logic a,b,c,d,e,f,g, //7 segment display
input logic [1:0] x //button input
);
logic [10:0] lut [4] = {{4'b001,7'h01}, {4'b0010,7'h01}, {4'b0100,7'h0f}, {4'b1000,7'h01}};
always_comb begin
{en,a,b,c,d,e,f,g} = lut[x];
end
endmodule
我重新排列了数组中的值以匹配 case
。