<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • x
    x
    查看: 4229|回復: 7
    打印 上一主題 下一主題

    [提問] 新手 求助 T T

    [復制鏈接]
    跳轉到指定樓層
    樓主
    發表于 2011-11-18 11:14:16 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
    關鍵詞: 并轉串
    35積分
    小弟剛開始學習CPLD,編寫程序時候遇到個問題沒辦法解決 跪求高手助我。!
          要求的功能是這樣的,(8位)并形信號轉換為串形信號。并形信號在CS拉低時鎖存,CS拉低之后的CLK觸發將鎖存的信號在一個引腳串形輸出。
          另外,CS拉高以后要忽略CLK信號,而CS在低位時的CLK 的數量不一定為8。
          要用VERILOG,實現。


          小弟嘗試過幾種辦法均告失敗,似乎問題出現在CS拉低和CLK拉高時的連接沖突。

    沙發
    發表于 2011-11-18 11:51:48 | 只看該作者
    寫出你的程序來讓大家看看呀
    板凳
     樓主| 發表于 2011-11-18 12:40:22 | 只看該作者
    哦  抱歉  代碼 寫了挺多種的 下面發幾個  多謝各位大俠了。簘
    地板
     樓主| 發表于 2011-11-18 12:59:45 | 只看該作者
    module spi02(  data,clk,cs,miso_o   );

    //input
    input    clk;
    input    cs;
    input [7:0]  data;
    wire [7:0]  data;
    //output
    output   miso_o;
    reg           miso_o;
    //reg
    reg [2:0]  counter;
    reg [7:0]  data_read;

    always@(negedge  cs)   //cs下降沿出發并形數據載入
    begin
                            data_read[0]<= data[0];
                            data_read[1]<= data[1];
                            data_read[2]<= data[2];
                            data_read[3]<= data[3];
                            data_read[4]<= data[4];
                            data_read[5]<= data[5];
                            data_read[6]<= data[6];
                            data_read[7]<= data[7];       
    end


    always@(posedge clk)   //cs的下降沿中的CS出發串行行輸出
    begin
            if(!cs)
            begin
                    data_read <= {data_read[6:0],1'b0}; //移位
                    miso_o<=data_read[7];
            end
    end

    endmodule

    這是最初的代碼,直接了當的描述要實現的功能。但是編譯時報如下錯
    Error (10028): Can't resolve multiple constant drivers for net "data_read[7]" at spi02.v(33)
    Error (10029): Constant driver at spi02.v(18)
    Error (10028): Can't resolve multiple constant drivers for net "data_read[6]" at spi02.v(33)
    Error (10028): Can't resolve multiple constant drivers for net "data_read[5]" at spi02.v(33)
    Error (10028): Can't resolve multiple constant drivers for net "data_read[4]" at spi02.v(33)
    。。。。。。
    地下室
     樓主| 發表于 2011-11-18 13:10:57 | 只看該作者
    看上去錯誤似乎是 兩個ALWAYS事件中都對data_read 的連接方式作出要求,而且這兩種連接方式有沖突。

    因此,我增加了一個FLAG 來避免沖突。程序如下:
    module spi02(
               
                       data
                       ,clk,cs,miso_o           
                            );
    //input
    input    clk;
    input    cs;
    input [7:0]  data;
    wire [7:0]  data;
    //output
    output   miso_o;
    reg           miso_o;
    //reg
    reg [2:0]  counter;
    reg [7:0]  data_read;
    reg            flag;

    always@( negedge   cs   )
    begin
           
                            data_read[0]<= data[0];
                            data_read[1]<= data[1];
                            data_read[2]<= data[2];
                            data_read[3]<= data[3];
                            data_read[4]<= data[4];
                            data_read[5]<= data[5];
                            data_read[6]<= data[6];
                            data_read[7]<= data[7];
                            flag<=1'b1;  //flag至1
           
    end

    always@( posedge   cs   ) //flag至0
    begin
            flag<=1'b0;
    end
    always@(posedge clk)
    begin
            if((!cs)&&flag)
            begin
                    data_read <= {data_read[6:0],1'b0};
                    miso_o<=data_read[7];
            end
    end

    endmodule

    我希望通過  FLAG來告訴他當 兩個觸發同時發生時 先做哪個。但是好像不起作用。
    報錯還多了一個:
    Error (10028): Can't resolve multiple constant drivers for net "flag" at spi02.v(34)
    6
     樓主| 發表于 2011-11-18 13:28:10 | 只看該作者
    最后我索性把 兩個信號放在一個ALWAYS里



    always@(    cs  or clk )
    begin
            if (!cs)
            begin
                    if(!flag)
                    begin
                            data_read[0]<= data[0];
                            data_read[1]<= data[1];
                            data_read[2]<= data[2];
                            data_read[3]<= data[3];
                            data_read[4]<= data[4];
                            data_read[5]<= data[5];
                            data_read[6]<= data[6];
                            data_read[7]<= data[7];
                            flag<=1;
                    end
                else
                begin
                            data_read <= {data_read[6:0],1'b0};
                            miso_o<=data_read[7];
                    end
            end       
            else
            begin
            flag<=1;
            end       
           
    end

    endmodule
    7
     樓主| 發表于 2011-11-18 13:30:03 | 只看該作者
    沒有報錯 但是仿真無法得到波形。!


    各位路過的師傅們幫幫忙!
    小弟剛進壇子,只有點積分獎勵,跪謝了。!
    8
    發表于 2015-2-16 19:18:31 | 只看該作者
    頭皮發麻..... fpga的邏輯觀念比c更嚴謹

    `define datalen  (8-1)

    module spi02(  reset, data, clk, cs, miso_o   );
    //input
    input reset
    input    clk;
    input    cs;
    input [7:0]  data;
    //wire [7:0]  data;
    //output
    output   miso_o;
    reg        out;
    //reg
    reg [2:0]  counter;
    //reg [7:0]  data_read;

    assign miso_o <= out;

    always@(posedge clk or reset)   //cs的下降沿中的CS出發串行行輸出
    begin
       // init
       if(reset) begin
         counter = 0;
       end

         if(!cs)  begin
            out  <= data[datalen-counter];
            if(counter = datalen) counter = 0;
            else counter = counter+1;
         else
           counter = 0;
         end
    end

    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規則

    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷