I2S Receiver的HDL实现

本文深入解析了I2S接口用于传输立体声音频数据流的工作原理,详细介绍了SCK、WS和SD三个关键信号的作用,以及如何通过Verilog实现I2S接收器,包括状态机设计和数据捕获逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

I2S用于传输立体声音频数据流,包括SCK、WS和SD三个信号,SCK为时钟,WS用于区分左声道和右声道,SD为数据,可以是16、20、24或32bits。
在这里插入图片描述
I2S的实现框图如下:
在这里插入图片描述
I2S Receiver详细框图如下:
在这里插入图片描述
代码如下:

`timescale 1ns/1ns
module i2s_receive2 #
  (
   parameter width = 32
   )
  (
   input sck,
   input ws,
   input sd,
   output reg [width-1:0] data_left,
   output reg [width-1:0] data_right
   );

  reg wsd = 0;
  always @(posedge sck)
    wsd <= ws;

  reg wsdd;
  always @(posedge sck)
    wsdd <= wsd;

  wire wsp = wsd ^ wsdd;

  reg [$clog2(width+1)-1:0] counter;
  always @(negedge sck)
    if (wsp)
      counter <= 0;
    else if (counter < width)
      counter <= counter+1;

  reg [0:width-1] shift;
  always @(posedge sck)
    begin
      if (wsp)
	shift <= 0;
      if (counter < width)
	shift[counter] <= sd;
    end

  always @(posedge sck)
    if (wsd && wsp)
      data_left <= shift;

  always @(posedge sck)
    if (!wsd && wsp)
      data_right <= shift;

endmodule
linux QT4环境编译此段代码class connection_metadata_no_tls { public: typedef websocketpp::lib::shared_ptr<connection_metadata_no_tls> ptr; connection_metadata_no_tls(websocketpp::connection_hdl hdl, std::string uri) : m_hdl(hdl) , m_status("Connecting") , m_uri(uri) , m_server("N/A") {} void on_open(client_no_tls *client, websocketpp::connection_hdl hdl) { m_status = "Open"; status_new = true; client_no_tls::connection_ptr con = client->get_con_from_hdl(hdl); m_server = con->get_response_header("Server"); //QMetaObject::invokeMethod(m_timer, "start", Qt::QueuedConnection); m_timer = new QTimer(); connect(m_timer, SIGNAL(timeout()), this, SLOT(send_ping())); m_timer->start(30000); // 30秒间隔 qDebug()<<"on_open hdl"<<hdl._empty(); websocketpp::lib::error_code ec; client->ping(hdl,"heartbeat",ec); } void send_ping() { } void on_ping(client_no_tls *client, websocketpp::connection_hdl hdl) { // m_status = "Open"; // status_new = true; // client_no_tls::connection_ptr con = client->get_con_from_hdl(hdl); // m_server = con->get_response_header("Server"); qDebug()<<"on_ping hdl"<<hdl._empty(); websocketpp::lib::error_code ec; client->ping(hdl,"heartbeat",ec); } // if connection failed, the function will be invoke. void on_fail(client_no_tls *client, websocketpp::connection_hdl hdl) { m_status = "Failed"; status_new = false; client_no_tls::connection_ptr con = client->get_con_from_hdl(hdl); m_server = con->get_response_header("Server"); m_error_reason = con->get_ec().message(); QDEBUG<<"Err"<<QString::fromStdString(m_error_reason); } void on_close(client_no_tls *client, websocketpp::connection_hdl hdl) { m_status = "Closed"; status_new = false; client_no_tls::connection_ptr con = client->get_con_from_hdl(hdl); std::stringstream s; s << "close code: " << con->get_remote_close_code() << " (" << websocketpp::close::status::get_string(con->get_remote_close_code()) << "), close reason: " << con->get_remote_close_reason(); m_error_reason = s.str(); QDEBUG<<"Close Net"<<QString::fromStdString(m_error_reason); } void on_message(websocketpp::connection_hdl, client_no_tls::message_ptr msg) { if (msg->get_opcode() == websocketpp::frame::opcode::text) { m_messages.push_back(msg->get_payload()); // m_textMessage.append(QString::fromStdString(msg->get_payload()));//Utf8toAscii // m_textMessage = QString::fromUtf8(msg->get_payload()); // QDEBUG<<"得到了数据1"<<m_textMessage; m_binaryMessage.clear(); m_binaryMessage.append(QString::fromStdString(msg->get_payload())); QString string; string.append(m_binaryMessage);// QByteArray转QString方法2 QDEBUG<<"Get Server Message:"<<string; for(int i = 0 ; i < 20 ; i++) { if(messageback[i].is_used == 0 ) { memset(messageback[i].data,0,sizeof(messageback[i].data)); memcpy(messageback[i].data,m_binaryMessage,m_binaryMessage.length()); messageback[i].len = m_binaryMessage.length(); messageback[i].is_used =1 ; break; } } } else { m_messages.push_back(websocketpp::utility::to_hex(msg->get_payload())); // QDEBUG<<"得到了数据2"; } } websocketpp::connection_hdl get_hdl() const { return m_hdl; } std::string get_status() const { return m_status; } std::string get_uri() const { return m_uri; } void record_sent_message(std::string message) { m_messages.push_back(">> " + message); } friend std::ostream & operator<< (std::ostream & out, connection_metadata_no_tls const & data); private: websocketpp::connection_hdl m_hdl; std::string m_status; std::string m_uri; std::string m_server; std::string m_error_reason; std::vector<std::string> m_messages; QTimer *m_timer; //private slots: // void send_ping(); }; 提示 错误:invalid conversion from 'QTimer*' to 'int' [-fpermissive] connect(m_timer, SIGNAL(timeout()), this, SLOT(send_ping())); ^
最新发布
07-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值