2016-05-07 4 views
0

Рассмотрим следующий код Verilog.Использование параметров Verilog, если в остальных случаях

parameter C_SUB_WIDTH = 2; 
parameter C_SUB_HEIGHT = 2; 
parameter BIT_DEPTH = 12; 

reg [5:0] single_block_width; 

always @ (*) begin 
    if(BIT_DEPTH == 8) begin 
     case({C_SUB_HEIGHT == 1, C_SUB_WIDTH == 1}) 
      2'b00: single_block_width = 6'd16; 
      2'b10: single_block_width = 6'd16; 
      2'b11: single_block_width = 6'd24; 
      default:single_block_width = 6'dx; 
     endcase 
    end 
    else if(BIT_DEPTH == 10) begin 
     case({C_SUB_HEIGHT == 1, C_SUB_WIDTH == 1}) 
      2'b00: single_block_width = 6'd16; 
      2'b10: single_block_width = 6'd24; 
      2'b11: single_block_width = 6'd32; 
      default:single_block_width = 6'dx; 
     endcase 
    end 
    else if(BIT_DEPTH == 12) begin 
     case({C_SUB_HEIGHT == 1, C_SUB_WIDTH == 1}) 
      2'b00: single_block_width = 6'd24; 
      2'b10: single_block_width = 6'd24; 
      2'b11: single_block_width = 6'd40; 
      default:single_block_width = 6'dx; 
     endcase 
    end 
    else begin 
     single_block_width = 6'dx; 
    end 
end 

С C_SUB_WIDTH, C_SUB_HEIGHT и BIT_DEPTH все параметры, будет это сделать single_block_width, параметр тоже?

Если нет, то как я могу сделать параметр single_block_width a и установить его значение на основе вышеупомянутых параметров?

Я использую Xilinx Vivado для синтеза вышеуказанного кода. (Его необходимо уметь синтезировать)

Спасибо.

+2

Кстати, для моделирования полезно использовать 'always @ (*)' только с параметрами в всегда блоке. Поскольку параметры никогда не изменяются, для блока не нужно ничего чувствительного, и блок никогда не выполняется. SystemVerilog решает это с помощью конструкции 'always_comb', которая гарантирует, что он будет выполнять блок хотя бы один раз за время 0. –

+0

Спасибо за вашу ценную информацию – user2389323

ответ

1
parameter [5:0] SINGLE_BLOCK_WIDTH = (BIT_DEPTH == 8) ? ((C_SUB_WIDTH == 0) ? ((C_SUB_HEIGHT == 0) ? 6'd16 : 6'd16) : 6'd24) 
           : ((BIT_DEPTH == 10) ? ((C_SUB_WIDTH == 0) ? ((C_SUB_HEIGHT == 0) ? 6'd16 : 6'd24) : 6'd32) 
            : (BIT_DEPTH == 12) ? ((C_SUB_WIDTH == 0) ? ((C_SUB_HEIGHT == 0) ? 6'd24 : 6'd24) : 6'd40)); 

Пробуй этот тип кодирования. Он может иметь логическую ошибку, но он синтезируется.

+0

Благодарим вас за ответ. Это будет работать – user2389323

Смежные вопросы