Verilog中带有for循环的大型多路复用器

问题描述 投票:1回答:1

我希望我的电路根据输入地址将0 10和255 10之间的值写入称为mem_address_reg的寄存器。经过“与”运算后,该地址可以采用256 10个不同的值之一。我希望电路是组合的,所以一种检查值的方法是用256 10个不同的输入构建一个多路复用器,然后根据传入地址(输入的选择线)将其中之一写入输出。多路复用器)。

此电路有效,但需要我编写一个脚本,该脚本生成所有256 10案例陈述,并且代码肿。因此,我不想使用自己编写每一行的方法,而是使用for循环为我生成这些行。不幸的是,这似乎不起作用。

我做错了什么?

带有circuit肿代码的工作电路:

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
for-loop switch-statement verilog synthesis
1个回答
4
投票

只是做

assign mem_address_reg = masked_write_addr[29:22];
© www.soinside.com 2019 - 2024. All rights reserved.