Verilog 中带有 for 循环的大型多路复用器
Big multiplexer with for loop in Verilog
我希望我的电路将 010 和 25510 之间的值写入名为 mem_address_reg
的寄存器,具体取决于传入地址。经过与运算后,该地址可以取 25610 个不同值之一。我希望电路是组合的,所以检查值的一种方法是构建一个具有 25610 个不同输入的多路复用器,然后根据传入地址将其中一个写入输出(多路复用器的 select 行)。
这个电路可以工作,但需要我编写一个脚本来生成所有 25610 个案例语句,并且代码变得臃肿。因此,我不想自己编写每一行代码,而是想使用一个 for 循环来为我生成这些代码。不幸的是,这似乎不起作用。
我做错了什么?
代码臃肿的工作电路:
wire [31:0] masked_write_adr;
reg [29:0] nvmm_write_request_adr;
reg [7:0] mem_address_reg;
assign masked_write_adr = {2'b00, nvmm_write_request_adr} & 32'hFFC0_0000;
always@(*)
begin
case(masked_write_adr)
32'h0000_0000: mem_address_reg = 8'h00;
32'h0040_0000: mem_address_reg = 8'h01;
32'h0080_0000: mem_address_reg = 8'h02;
32'h00C0_0000: mem_address_reg = 8'h03;
32'h0100_0000: mem_address_reg = 8'h04;
32'h0140_0000: mem_address_reg = 8'h05;
(...)
32'h3FC0_0000: mem_address_reg = 8'hFF;
default: mem_address_reg = 8'h0;
endcase
end
这是我认为是不起作用的模拟电路:
wire [31:0] masked_write_adr;
reg [29:0] nvmm_write_request_adr;
reg [7:0] mem_address_reg;
assign masked_write_adr = {2'b00, nvmm_write_request_adr} & 32'hFFC0_0000;
integer k;
always@(*)
begin
mem_address_reg <= 8'h00;
for(k=0; k<255; k=k+1)
begin
if((k*32'h40_0000) == masked_write_adr)
mem_address_reg <= k;
end
end
就这样
assign mem_address_reg = masked_write_addr[29:22];
我希望我的电路将 010 和 25510 之间的值写入名为 mem_address_reg
的寄存器,具体取决于传入地址。经过与运算后,该地址可以取 25610 个不同值之一。我希望电路是组合的,所以检查值的一种方法是构建一个具有 25610 个不同输入的多路复用器,然后根据传入地址将其中一个写入输出(多路复用器的 select 行)。
这个电路可以工作,但需要我编写一个脚本来生成所有 25610 个案例语句,并且代码变得臃肿。因此,我不想自己编写每一行代码,而是想使用一个 for 循环来为我生成这些代码。不幸的是,这似乎不起作用。
我做错了什么?
代码臃肿的工作电路:
wire [31:0] masked_write_adr;
reg [29:0] nvmm_write_request_adr;
reg [7:0] mem_address_reg;
assign masked_write_adr = {2'b00, nvmm_write_request_adr} & 32'hFFC0_0000;
always@(*)
begin
case(masked_write_adr)
32'h0000_0000: mem_address_reg = 8'h00;
32'h0040_0000: mem_address_reg = 8'h01;
32'h0080_0000: mem_address_reg = 8'h02;
32'h00C0_0000: mem_address_reg = 8'h03;
32'h0100_0000: mem_address_reg = 8'h04;
32'h0140_0000: mem_address_reg = 8'h05;
(...)
32'h3FC0_0000: mem_address_reg = 8'hFF;
default: mem_address_reg = 8'h0;
endcase
end
这是我认为是不起作用的模拟电路:
wire [31:0] masked_write_adr;
reg [29:0] nvmm_write_request_adr;
reg [7:0] mem_address_reg;
assign masked_write_adr = {2'b00, nvmm_write_request_adr} & 32'hFFC0_0000;
integer k;
always@(*)
begin
mem_address_reg <= 8'h00;
for(k=0; k<255; k=k+1)
begin
if((k*32'h40_0000) == masked_write_adr)
mem_address_reg <= k;
end
end
就这样
assign mem_address_reg = masked_write_addr[29:22];