電子工程網(wǎng)

標題: 新手 求助 T T [打印本頁(yè)]

作者: 面壁    時(shí)間: 2011-11-18 11:14
標題: 新手 求助 T T
小弟剛開(kāi)始學(xué)習CPLD,編寫(xiě)程序時(shí)候遇到個(gè)問(wèn)題沒(méi)辦法解決 跪求高手助我。!
      要求的功能是這樣的,(8位)并形信號轉換為串形信號。并形信號在CS拉低時(shí)鎖存,CS拉低之后的CLK觸發(fā)將鎖存的信號在一個(gè)引腳串形輸出。
      另外,CS拉高以后要忽略CLK信號,而CS在低位時(shí)的CLK 的數量不一定為8。
      要用VERILOG,實(shí)現。


      小弟?chē)L試過(guò)幾種辦法均告失敗,似乎問(wèn)題出現在CS拉低和CLK拉高時(shí)的連接沖突。
作者: riverpeak    時(shí)間: 2011-11-18 11:51
寫(xiě)出你的程序來(lái)讓大家看看呀
作者: 面壁    時(shí)間: 2011-11-18 12:40
哦  抱歉  代碼 寫(xiě)了挺多種的 下面發(fā)幾個(gè)  多謝各位大俠了。簘
作者: 面壁    時(shí)間: 2011-11-18 12:59
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下降沿出發(fā)并形數據載入
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出發(fā)串行行輸出
begin
        if(!cs)
        begin
                data_read <= {data_read[6:0],1'b0}; //移位
                miso_o<=data_read[7];
        end
end

endmodule

這是最初的代碼,直接了當的描述要實(shí)現的功能。但是編譯時(shí)報如下錯
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)
。。。。。。
作者: 面壁    時(shí)間: 2011-11-18 13:10
看上去錯誤似乎是 兩個(gè)ALWAYS事件中都對data_read 的連接方式作出要求,而且這兩種連接方式有沖突。

因此,我增加了一個(gè)FLAG 來(lái)避免沖突。程序如下:
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

我希望通過(guò)  FLAG來(lái)告訴他當 兩個(gè)觸發(fā)同時(shí)發(fā)生時(shí) 先做哪個(gè)。但是好像不起作用。
報錯還多了一個(gè):
Error (10028): Can't resolve multiple constant drivers for net "flag" at spi02.v(34)
作者: 面壁    時(shí)間: 2011-11-18 13:28
最后我索性把 兩個(gè)信號放在一個(gè)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
作者: 面壁    時(shí)間: 2011-11-18 13:30
沒(méi)有報錯 但是仿真無(wú)法得到波形。!


各位路過(guò)的師傅們幫幫忙!
小弟剛進(jìn)壇子,只有點(diǎn)積分獎勵,跪謝了。!
作者: yangwenguan    時(shí)間: 2015-2-16 19:18
頭皮發(fā)麻..... fpga的邏輯觀(guān)念比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出發(fā)串行行輸出
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






歡迎光臨 電子工程網(wǎng) (http://selenalain.com/) Powered by Discuz! X3.4
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页