always @ (posedge clk)
wire_data_out <= data_received>>data_bits;
Кстати:
- вы не можете использовать присваивания внутри всегда блока.
- В синхронизированном разделе вы должны использовать неблокирующие назначения.
Это одна строка, как вы и просили. Но я бы не стал писать свой код таким образом. Это требует, чтобы читатель знал, что Verilog добавит нулевые биты к верху и потеряет нижние биты. Я бы использовал код, как вы написали (но тогда без синтаксических ошибок: -):
always @ (posedge clk) begin
case (data_bits)
2'b00: wire_data_out <= data_received;
2'b01: wire_data_out <= {1'b0,data_received[7:1]};
2'b10: wire_data_out <= {2'b0,data_received[7:2]};
2'b11: wire_data_out <= {3'b0,data_received[7:3]};
endcase
Конечный результат будет точно такой же логики, но читаемость лучше.