查看: 3815|回复: 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)
 楼主| 发表于 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
 楼主| 发表于 2011-11-18 13:30:03 | 显示全部楼层
没有报错 但是仿真无法得到波形!!!


各位路过的师傅们帮帮忙啊!
小弟刚进坛子,只有点积分奖励,跪谢了!!!
发表于 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
快速回复 返回顶部 返回列表