Я хочу, чтобы моя схема записывала значение от 0 10 до 255 10 в регистр с именем mem_address_reg
в зависимости от входящего адреса. После операции и этот адрес может принимать одно из 256 10 различных значений. Я хочу, чтобы схема была комбинационной, поэтому один из способов проверить это значение - построить мультиплексор с 256 10 различными входами, который затем записывает один из них на выход, в зависимости от входящего адреса (строка выбора мультиплексора).
Эта схема работает, но требует, чтобы я написал скрипт, который генерирует все 256 10 case-операторов, и код становится раздутым. Поэтому вместо того, чтобы писать каждую строку самостоятельно, я хочу использовать для l oop, который генерирует их для меня. К сожалению, это не похоже на работу.
Что я сделал не так?
Рабочая схема с раздутым кодом:
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