Перейти к содержанию
    

Как создать модуль с переменным кол-вом портов?

Хочу создать модуль с n портов, каждый из которых будет шириной w бит. С шириной разобрался, вот заготовка с одним портом входа шириной по умолчаний в 2 бита.

module muxU(clk, in, out);

parameter WIDTH = 2;

input clk;
input [WIDTH:0]in;
output reg [WIDTH:0]out;

always @ (posedge clk)
begin
    out <= in;
end

endmodule

Есть потребность в будущем блок с 2-мя входными портами

 

module muxU(clk, in1, in2, out);

parameter WIDTH = 2;

input clk;
input [WIDTH:0]in1;
input [WIDTH:0]in2;
output reg [WIDTH:0]out;

always @ (posedge clk)
begin
    out <= in2;
end
endmodule

 

Как написать на верилоге такой модуль, чтобы менять только какойнить параметр и кол-во портов in автоматом добавлялось/уменьшалось?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как написать на верилоге такой модуль, чтобы менять только какойнить параметр и кол-во портов in автоматом добавлялось/уменьшалось?

Через предпроцессор попробовать разве что.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

module muxU(clk, in, out);

parameter n = 1;
parameter WIDTH = 2;

input clk;
input [WIDTH:0]in[n:0];
output reg [WIDTH:0]out;

always @ (posedge clk)
begin
    out <= in[n];
end
endmodule

а лучше так:

module muxU #(parameter
            n = 1    ,
            WIDTH = 2
            )                    
            (
            input  wire             clk            ,
            output wire [WIDTH:0]    in    [n:0]    ,
            output reg                 out        
            );

always @ (posedge clk)
begin
    out <= in[n];
end

endmodule

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Использовать вместо input, output интерфейсы. В них можно сгенерировать сколько угодно каких угодно портов да плюс логики наворотить. Мегавещь, очень рекомендую.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Использовать вместо input, output интерфейсы. В них можно сгенерировать сколько угодно каких угодно портов да плюс логики наворотить. Мегавещь, очень рекомендую.

Это да. Мегарулёз. Но это уже SystemVerilog а не просто верилог. Но квартус умеет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Использовать вместо input, output интерфейсы. В них можно сгенерировать сколько угодно каких угодно портов да плюс логики наворотить. Мегавещь, очень рекомендую.

Количество портов все-равно не изменишь с помощью параметра (и ничего "сгенерировать" не получится). Надо менять сам интерфейс.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хочу создать модуль с n портов, каждый из которых будет шириной w бит. С шириной разобрался, вот заготовка с одним портом входа шириной по умолчаний в 2 бита.

n*w - это логичнее оформлять, как массив длины n из шин шириной w. Проблема, что в простом Верилоге запрещены порты-массивы, но можно запаковать массив в один порт параметризованной длины n*w, а внутри модуля распаковать в нормальный массив.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Количество портов все-равно не изменишь с помощью параметра (и ничего "сгенерировать" не получится). Надо менять сам интерфейс.

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

 

        .npor                   (npor),                 //               npor.npor
        .pin_perst              (pin_perst),            //                   .pin_perst
        .test_in                (test_in),              //           hip_ctrl.test_in
        .simu_mode_pipe         (simu_mode_pipe),       //                   .simu_mode_pipe
        .pld_clk                (pld_clk),              //            pld_clk.clk
        .coreclkout             (coreclkout),           //     coreclkout_hip.clk
        .refclk                 (refclk),               //             refclk.clk
        .rx_in0                 (rx_in0),               //         hip_serial.rx_in0
        .rx_in1                 (rx_in1),               //                   .rx_in1
        .rx_in2                 (rx_in2),               //                   .rx_in2
        .rx_in3                 (rx_in3),               //                   .rx_in3
        .tx_out0                (tx_out0),              //                   .tx_out0
        .tx_out1                (tx_out1),              //                   .tx_out1
        .tx_out2                (tx_out2),              //                   .tx_out2
        .tx_out3                (tx_out3),              //                   .tx_out3
        .rx_st_valid            (rx_st_valid),          //              rx_st.valid
        .rx_st_sop              (rx_st_sop),            //                   .startofpacket
        .rx_st_eop              (rx_st_eop),            //                   .endofpacket
        .rx_st_empty            (rx_st_empty),          //                   .empty
        .rx_st_ready            (rx_st_ready),          //                   .ready
        .rx_st_err              (rx_st_err),            //                   .error
        .rx_st_data             (rx_st_data),           //                   .data
        .rx_st_bar              (rx_st_bar),            //          rx_bar_be.rx_st_bar
        .rx_st_mask             (rx_st_mask),           //                   .rx_st_mask
        .tx_st_valid            (tx_st_valid),          //              tx_st.valid
        .tx_st_sop              (tx_st_sop),            //                   .startofpacket
        .tx_st_eop              (tx_st_eop),            //                   .endofpacket
        .tx_st_empty            (tx_st_empty),          //                   .empty
        .tx_st_ready            (tx_st_ready),          //                   .ready
        .tx_st_err              (tx_st_err),            //                   .error
        .tx_st_data             (tx_st_data),           //                   .data
        .tx_fifo_empty          (tx_fifo_empty),        //            tx_fifo.fifo_empty
        .tx_cred_datafccp       (tx_cred_datafccp),     //            tx_cred.tx_cred_datafccp
        .tx_cred_datafcnp       (tx_cred_datafcnp),     //                   .tx_cred_datafcnp
        .tx_cred_datafcp        (tx_cred_datafcp),      //                   .tx_cred_datafcp
        .tx_cred_fchipcons      (tx_cred_fchipcons),    //                   .tx_cred_fchipcons
        .tx_cred_fcinfinite     (tx_cred_fcinfinite),   //                   .tx_cred_fcinfinite
        .tx_cred_hdrfccp        (tx_cred_hdrfccp),      //                   .tx_cred_hdrfccp
        .tx_cred_hdrfcnp        (tx_cred_hdrfcnp),      //                   .tx_cred_hdrfcnp
        .tx_cred_hdrfcp         (tx_cred_hdrfcp),       //                   .tx_cred_hdrfcp
        .sim_pipe_pclk_in       (sim_pipe_pclk_in),     //           hip_pipe.sim_pipe_pclk_in
        .sim_pipe_rate          (sim_pipe_rate),        //                   .sim_pipe_rate
        .sim_ltssmstate         (sim_ltssmstate),       //                   .sim_ltssmstate
        .eidleinfersel0         (eidleinfersel0),       //                   .eidleinfersel0
        .eidleinfersel1         (eidleinfersel1),       //                   .eidleinfersel1
        .eidleinfersel2         (eidleinfersel2),       //                   .eidleinfersel2
        .eidleinfersel3         (eidleinfersel3),       //                   .eidleinfersel3
        .powerdown0             (powerdown0),           //                   .powerdown0
        .powerdown1             (powerdown1),           //                   .powerdown1
        .powerdown2             (powerdown2),           //                   .powerdown2
        .powerdown3             (powerdown3),           //                   .powerdown3
        .rxpolarity0            (rxpolarity0),          //                   .rxpolarity0
        .rxpolarity1            (rxpolarity1),          //                   .rxpolarity1
        .rxpolarity2            (rxpolarity2),          //                   .rxpolarity2
        .rxpolarity3            (rxpolarity3),          //                   .rxpolarity3
        .txcompl0               (txcompl0),             //                   .txcompl0
        .txcompl1               (txcompl1),             //                   .txcompl1
        .txcompl2               (txcompl2),             //                   .txcompl2
        .txcompl3               (txcompl3),             //                   .txcompl3
        .txdata0                (txdata0),              //                   .txdata0
        .txdata1                (txdata1),              //                   .txdata1
        .txdata2                (txdata2),              //                   .txdata2
        .txdata3                (txdata3),              //                   .txdata3
        .txdatak0               (txdatak0),             //                   .txdatak0
        .txdatak1               (txdatak1),             //                   .txdatak1
        .txdatak2               (txdatak2),             //                   .txdatak2
        .txdatak3               (txdatak3),             //                   .txdatak3
        .txdetectrx0            (txdetectrx0),          //                   .txdetectrx0
        .txdetectrx1            (txdetectrx1),          //                   .txdetectrx1
        .txdetectrx2            (txdetectrx2),          //                   .txdetectrx2
        .txdetectrx3            (txdetectrx3),          //                   .txdetectrx3
        .txelecidle0            (txelecidle0),          //                   .txelecidle0
        .txelecidle1            (txelecidle1),          //                   .txelecidle1
        .txelecidle2            (txelecidle2),          //                   .txelecidle2
        .txelecidle3            (txelecidle3),          //                   .txelecidle3
        .txswing0               (txswing0),             //                   .txswing0
        .txswing1               (txswing1),             //                   .txswing1
        .txswing2               (txswing2),             //                   .txswing2
        .txswing3               (txswing3),             //                   .txswing3
        .txmargin0              (txmargin0),            //                   .txmargin0
        .txmargin1              (txmargin1),            //                   .txmargin1
        .txmargin2              (txmargin2),            //                   .txmargin2
        .txmargin3              (txmargin3),            //                   .txmargin3
        .txdeemph0              (txdeemph0),            //                   .txdeemph0
        .txdeemph1              (txdeemph1),            //                   .txdeemph1
        .txdeemph2              (txdeemph2),            //                   .txdeemph2
        .txdeemph3              (txdeemph3),            //                   .txdeemph3
        .phystatus0             (phystatus0),           //                   .phystatus0
        .phystatus1             (phystatus1),           //                   .phystatus1
        .phystatus2             (phystatus2),           //                   .phystatus2
        .phystatus3             (phystatus3),           //                   .phystatus3
        .rxdata0                (rxdata0),              //                   .rxdata0
        .rxdata1                (rxdata1),              //                   .rxdata1
        .rxdata2                (rxdata2),              //                   .rxdata2
        .rxdata3                (rxdata3),              //                   .rxdata3
        .rxdatak0               (rxdatak0),             //                   .rxdatak0
        .rxdatak1               (rxdatak1),             //                   .rxdatak1
        .rxdatak2               (rxdatak2),             //                   .rxdatak2
        .rxdatak3               (rxdatak3),             //                   .rxdatak3
        .rxelecidle0            (rxelecidle0),          //                   .rxelecidle0
        .rxelecidle1            (rxelecidle1),          //                   .rxelecidle1
        .rxelecidle2            (rxelecidle2),          //                   .rxelecidle2
        .rxelecidle3            (rxelecidle3),          //                   .rxelecidle3
        .rxstatus0              (rxstatus0),            //                   .rxstatus0
        .rxstatus1              (rxstatus1),            //                   .rxstatus1
        .rxstatus2              (rxstatus2),            //                   .rxstatus2
        .rxstatus3              (rxstatus3),            //                   .rxstatus3
        .rxvalid0               (rxvalid0),             //                   .rxvalid0
        .rxvalid1               (rxvalid1),             //                   .rxvalid1
        .rxvalid2               (rxvalid2),             //                   .rxvalid2
        .rxvalid3               (rxvalid3),             //                   .rxvalid3
        .reset_status           (reset_status),         //            hip_rst.reset_status
        .serdes_pll_locked      (serdes_pll_locked),    //                   .serdes_pll_locked
        .pld_clk_inuse          (pld_clk_inuse),        //                   .pld_clk_inuse
        .pld_core_ready         (pld_core_ready),       //                   .pld_core_ready
        .testin_zero            (testin_zero),          //                   .testin_zero
        .lmi_addr               (lmi_addr),             //                lmi.lmi_addr
        .lmi_din                (lmi_din),              //                   .lmi_din
        .lmi_rden               (lmi_rden),             //                   .lmi_rden
        .lmi_wren               (lmi_wren),             //                   .lmi_wren
        .lmi_ack                (lmi_ack),              //                   .lmi_ack
        .lmi_dout               (lmi_dout),             //                   .lmi_dout
        .pm_auxpwr              (pm_auxpwr),            //         power_mngt.pm_auxpwr
        .pm_data                (pm_data),              //                   .pm_data
        .pme_to_cr              (pme_to_cr),            //                   .pme_to_cr
        .pm_event               (pm_event),             //                   .pm_event
        .pme_to_sr              (pme_to_sr),            //                   .pme_to_sr
        .reconfig_to_xcvr       (reconfig_to_xcvr),     //   reconfig_to_xcvr.reconfig_to_xcvr
        .busy_xcvr_reconfig     (busy_xcvr_reconfig),   //                   .busy_xcvr_reconfig
        .reconfig_from_xcvr     (reconfig_from_xcvr),   // reconfig_from_xcvr.reconfig_from_xcvr
        .app_msi_num            (app_msi_num),          //            int_msi.app_msi_num
        .app_msi_req            (app_msi_req),          //                   .app_msi_req
        .app_msi_tc             (app_msi_tc),           //                   .app_msi_tc
        .app_msi_ack            (app_msi_ack),          //                   .app_msi_ack
        .app_int_sts_vec        (app_int_sts_vec),      //                   .app_int_sts
        .tl_hpg_ctrl_er         (tl_hpg_ctrl_er),       //          config_tl.hpg_ctrler
        .tl_cfg_ctl             (tl_cfg_ctl),           //                   .tl_cfg_ctl
        .cpl_err                (cpl_err),              //                   .cpl_err
        .tl_cfg_add             (tl_cfg_add),           //                   .tl_cfg_add
        .tl_cfg_sts             (tl_cfg_sts),           //                   .tl_cfg_sts
        .cpl_pending            (cpl_pending),          //                   .cpl_pending
        .tl_cfg_ctl_wr          (tl_cfg_ctl_wr),        //                   .tl_cfg_ctl_wr
        .tl_cfg_sts_wr          (tl_cfg_sts_wr),        //                   .tl_cfg_sts_wr
        .dl_current_speed       (dl_current_speed),     //         hip_status.currentspeed
        .derr_cor_ext_rcv0      (derr_cor_ext_rcv0),    //                   .derr_cor_ext_rcv
        .derr_cor_ext_rpl       (derr_cor_ext_rpl),     //                   .derr_cor_ext_rpl
        .derr_rpl               (derr_rpl),             //                   .derr_rpl
        .dlup_exit              (dlup_exit),            //                   .dlup_exit
        .dl_ltssm               (dl_ltssm),             //                   .ltssmstate
        .ev128ns                (ev128ns),              //                   .ev128ns
        .ev1us                  (ev1us),                //                   .ev1us
        .hotrst_exit            (hotrst_exit),          //                   .hotrst_exit
        .int_status             (int_status),           //                   .int_status
        .l2_exit                (l2_exit),              //                   .l2_exit
        .lane_act               (lane_act),             //                   .lane_act
        .ko_cpl_spc_header      (ko_cpl_spc_header),    //                   .ko_cpl_spc_header
        .ko_cpl_spc_data        (ko_cpl_spc_data),      //                   .ko_cpl_spc_data
        .rx_in4                 (1'b0),                 //        (terminated)
        .rx_in5                 (1'b0),                 //        (terminated)
        .rx_in6                 (1'b0),                 //        (terminated)
        .rx_in7                 (1'b0),                 //        (terminated)
        .tx_out4                (),                     //        (terminated)
        .tx_out5                (),                     //        (terminated)
        .tx_out6                (),                     //        (terminated)
        .tx_out7                (),                     //        (terminated)
        .rx_fifo_empty          (),                     //        (terminated)
        .rx_fifo_full           (),                     //        (terminated)
        .rx_bar_dec_func_num    (),                     //        (terminated)
        .rx_st_be               (),                     //        (terminated)
        .tx_fifo_full           (),                     //        (terminated)
        .tx_fifo_rdp            (),                     //        (terminated)
        .tx_fifo_wrp            (),                     //        (terminated)
        .eidleinfersel4         (),                     //        (terminated)
        .eidleinfersel5         (),                     //        (terminated)
        .eidleinfersel6         (),                     //        (terminated)
        .eidleinfersel7         (),                     //        (terminated)
        .powerdown4             (),                     //        (terminated)
        .powerdown5             (),                     //        (terminated)
        .powerdown6             (),                     //        (terminated)
        .powerdown7             (),                     //        (terminated)
        .rxpolarity4            (),                     //        (terminated)
        .rxpolarity5            (),                     //        (terminated)
        .rxpolarity6            (),                     //        (terminated)
        .rxpolarity7            (),                     //        (terminated)
        .txcompl4               (),                     //        (terminated)
        .txcompl5               (),                     //        (terminated)
        .txcompl6               (),                     //        (terminated)
        .txcompl7               (),                     //        (terminated)
        .txdata4                (),                     //        (terminated)
        .txdata5                (),                     //        (terminated)
        .txdata6                (),                     //        (terminated)
        .txdata7                (),                     //        (terminated)
        .txdatak4               (),                     //        (terminated)
        .txdatak5               (),                     //        (terminated)
        .txdatak6               (),                     //        (terminated)
        .txdatak7               (),                     //        (terminated)
        .txdetectrx4            (),                     //        (terminated)
        .txdetectrx5            (),                     //        (terminated)
        .txdetectrx6            (),                     //        (terminated)
        .txdetectrx7            (),                     //        (terminated)
        .txelecidle4            (),                     //        (terminated)
        .txelecidle5            (),                     //        (terminated)
        .txelecidle6            (),                     //        (terminated)
        .txelecidle7            (),                     //        (terminated)
        .txswing4               (),                     //        (terminated)
        .txswing5               (),                     //        (terminated)
        .txswing6               (),                     //        (terminated)
        .txswing7               (),                     //        (terminated)
        .txmargin4              (),                     //        (terminated)
        .txmargin5              (),                     //        (terminated)
        .txmargin6              (),                     //        (terminated)
        .txmargin7              (),                     //        (terminated)
        .txdeemph4              (),                     //        (terminated)
        .txdeemph5              (),                     //        (terminated)
        .txdeemph6              (),                     //        (terminated)
        .txdeemph7              (),                     //        (terminated)
        .phystatus4             (1'b0),                 //        (terminated)
        .phystatus5             (1'b0),                 //        (terminated)
        .phystatus6             (1'b0),                 //        (terminated)
        .phystatus7             (1'b0),                 //        (terminated)
        .rxdata4                (8'b00000000),          //        (terminated)
        .rxdata5                (8'b00000000),          //        (terminated)
        .rxdata6                (8'b00000000),          //        (terminated)
        .rxdata7                (8'b00000000),          //        (terminated)
        .rxdatak4               (1'b0),                 //        (terminated)
        .rxdatak5               (1'b0),                 //        (terminated)
        .rxdatak6               (1'b0),                 //        (terminated)
        .rxdatak7               (1'b0),                 //        (terminated)
        .rxelecidle4            (1'b0),                 //        (terminated)
        .rxelecidle5            (1'b0),                 //        (terminated)
        .rxelecidle6            (1'b0),                 //        (terminated)
        .rxelecidle7            (1'b0),                 //        (terminated)
        .rxstatus4              (3'b000),               //        (terminated)
        .rxstatus5              (3'b000),               //        (terminated)
        .rxstatus6              (3'b000),               //        (terminated)
        .rxstatus7              (3'b000),               //        (terminated)
        .rxvalid4               (1'b0),                 //        (terminated)
        .rxvalid5               (1'b0),                 //        (terminated)
        .rxvalid6               (1'b0),                 //        (terminated)
        .rxvalid7               (1'b0),                 //        (terminated)
        .sim_pipe_pclk_out      (),                     //        (terminated)
        .pm_event_func          (3'b000),               //        (terminated)
        .hip_reconfig_clk       (1'b0),                 //        (terminated)
        .hip_reconfig_rst_n     (1'b0),                 //        (terminated)
        .hip_reconfig_address   (10'b0000000000),       //        (terminated)
        .hip_reconfig_byte_en   (2'b00),                //        (terminated)
        .hip_reconfig_read      (1'b0),                 //        (terminated)
        .hip_reconfig_readdata  (),                     //        (terminated)
        .hip_reconfig_write     (1'b0),                 //        (terminated)
        .hip_reconfig_writedata (16'b0000000000000000), //        (terminated)
        .ser_shift_load         (1'b0),                 //        (terminated)
        .interface_sel          (1'b0),                 //        (terminated)
        .app_msi_func           (3'b000),               //        (terminated)
        .serr_out               (),                     //        (terminated)
        .aer_msi_num            (5'b00000),             //        (terminated)
        .pex_msi_num            (5'b00000),             //        (terminated)
        .cpl_err_func           (3'b000)                //        (terminated)
    );

В этом найти быстро что-то вообще реально? Но процесс пошел, альтера у себя уже переименовала некоторые файлы с .v в .sv может быть что пока циклоны и арии с третим PCIe до нас дойдут, альтера и интерфейс к нему сделает вменяемый.

 

Извиняюсь. Наболело.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Количество портов все-равно не изменишь с помощью параметра (и ничего "сгенерировать" не получится). Надо менять сам интерфейс.

А надо шашечки (модуль с портами) или ехать (иметь возможность передавать в модуль и из него сигналы)? У объекта интерфейса меняется параметр и все дела.

 

Это да. Мегарулёз. Но это уже SystemVerilog а не просто верилог.

Насколько знаю, деление на Verilog/SystemVerilog скорее условное. Стандарты до 2005 года - это V, с этого года и далее - SV. Т.е. разделения, как, например, С и C++ нету, V и SV - это один и тот же язык, название, скорее, отмечает фазу развития.

 

Но квартус умеет.

Дык, эт самое главное - главное, чтобы инструментарий поддерживал. Если поддерживает, то и надо использовать это штатное очень эффективное средство, а не городить костыли.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насколько знаю, деление на Verilog/SystemVerilog скорее условное. Стандарты до 2005 года - это V, с этого года и далее - SV. Т.е. разделения, как, например, С и C++ нету, V и SV - это один и тот же язык, название, скорее, отмечает фазу развития.

Тут я не в курсе. В Квартусе надо указывать какого именно стандарта файл. Но не видел чтобы что-то переставало работать, если .v файл назначил .sv, в отличии от C++/C

 

Дык, эт самое главное - главное, чтобы инструментарий поддерживал. Если поддерживает, то и надо использовать это штатное очень эффективное средство, а не городить костыли.

Вот бы еще Альтера начала использовать собственный инструментарий, а то от их примера работы с PCI, волосы выпасть могут.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот бы еще Альтера начала использовать собственный инструментарий, а то от их примера работы с PCI, волосы выпасть могут.

Ну, пример на то и пример. Просто синтезатор с поддержкой SV интерфейсов пишут одни индусы, а примеры - другие. :) А что мешает под себя переписать так, как нравится?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну, пример на то и пример. Просто синтезатор с поддержкой SV интерфейсов пишут одни индусы, а примеры - другие. :) А что мешает под себя переписать так, как нравится?

Тем что не хочется этим заниматься каждый раз когда они чегонить апдейтят или ошибки правят. Сейчас какой-то компромисс нашел, но судя по всему если я еще буду заниматься PCIe, то к моменту выхода пятой арии или циклона, придется все переписывать. Они все вроде как менять собираются.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А надо шашечки (модуль с портами) или ехать (иметь возможность передавать в модуль и из него сигналы)? У объекта интерфейса меняется параметр и все дела.

От параметра количество портов не изменится. А чтобы собрать/разобрать упакованный массив - для этого SV и интерфейсы не нужны.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

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

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...