新手 求助 T T
2011年11月18日 11:14 发布者:面壁
小弟刚开始学习CPLD,编写程序时候遇到个问题没办法解决 跪求高手助我!!!要求的功能是这样的,(8位)并形信号转换为串形信号。并形信号在CS拉低时锁存,CS拉低之后的CLK触发将锁存的信号在一个引脚串形输出。
另外,CS拉高以后要忽略CLK信号,而CS在低位时的CLK 的数量不一定为8。
要用VERILOG,实现。
小弟尝试过几种办法均告失败,似乎问题出现在CS拉低和CLK拉高时的连接冲突。
网友评论
面壁 2011年11月18日
哦 抱歉 代码 写了挺多种的 下面发几个 多谢各位大侠了!:}
哦 抱歉 代码 写了挺多种的 下面发几个 多谢各位大侠了!:}
面壁 2011年11月18日
module spi02( data,clk,cs,miso_o );
//input
input clk;
input cs;
input data;
wire data;
//output
output miso_o;
reg miso_o;
//reg
reg counter;
reg data_read;
always@(negedge cs) //cs下降沿出发并形数据载入
begin
data_read<= data;
data_read<= data;
data_read<= data;
data_read<= data;
data_read<= data;
data_read<= data;
data_read<= data;
data_read<= data;
end
always@(posedge clk) //cs的下降沿中的CS出发串行行输出
begin
if(!cs)
begin
data_read <= {data_read,1'b0}; //移位
miso_o<=data_read;
end
end
endmodule
这是最初的代码,直接了当的描述要实现的功能。但是编译时报如下错
Error (10028): Can't resolve multiple constant drivers for net "data_read" at spi02.v(33)
Error (10029): Constant driver at spi02.v(18)
Error (10028): Can't resolve multiple constant drivers for net "data_read" at spi02.v(33)
Error (10028): Can't resolve multiple constant drivers for net "data_read" at spi02.v(33)
Error (10028): Can't resolve multiple constant drivers for net "data_read" at spi02.v(33)
。。。。。。
module spi02( data,clk,cs,miso_o );
//input
input clk;
input cs;
input data;
wire data;
//output
output miso_o;
reg miso_o;
//reg
reg counter;
reg data_read;
always@(negedge cs) //cs下降沿出发并形数据载入
begin
data_read<= data;
data_read<= data;
data_read<= data;
data_read<= data;
data_read<= data;
data_read<= data;
data_read<= data;
data_read<= data;
end
always@(posedge clk) //cs的下降沿中的CS出发串行行输出
begin
if(!cs)
begin
data_read <= {data_read,1'b0}; //移位
miso_o<=data_read;
end
end
endmodule
这是最初的代码,直接了当的描述要实现的功能。但是编译时报如下错
Error (10028): Can't resolve multiple constant drivers for net "data_read" at spi02.v(33)
Error (10029): Constant driver at spi02.v(18)
Error (10028): Can't resolve multiple constant drivers for net "data_read" at spi02.v(33)
Error (10028): Can't resolve multiple constant drivers for net "data_read" at spi02.v(33)
Error (10028): Can't resolve multiple constant drivers for net "data_read" at spi02.v(33)
。。。。。。
面壁 2011年11月18日
看上去错误似乎是 两个ALWAYS事件中都对data_read 的连接方式作出要求,而且这两种连接方式有冲突。
因此,我增加了一个FLAG 来避免冲突。程序如下:
module spi02(
data
,clk,cs,miso_o
);
//input
input clk;
input cs;
input data;
wire data;
//output
output miso_o;
reg miso_o;
//reg
reg counter;
reg data_read;
reg flag;
always@( negedge cs )
begin
data_read<= data;
data_read<= data;
data_read<= data;
data_read<= data;
data_read<= data;
data_read<= data;
data_read<= data;
data_read<= data;
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,1'b0};
miso_o<=data_read;
end
end
endmodule
我希望通过 FLAG来告诉他当 两个触发同时发生时 先做哪个。但是好像不起作用。
报错还多了一个:
Error (10028): Can't resolve multiple constant drivers for net "flag" at spi02.v(34)
看上去错误似乎是 两个ALWAYS事件中都对data_read 的连接方式作出要求,而且这两种连接方式有冲突。
因此,我增加了一个FLAG 来避免冲突。程序如下:
module spi02(
data
,clk,cs,miso_o
);
//input
input clk;
input cs;
input data;
wire data;
//output
output miso_o;
reg miso_o;
//reg
reg counter;
reg data_read;
reg flag;
always@( negedge cs )
begin
data_read<= data;
data_read<= data;
data_read<= data;
data_read<= data;
data_read<= data;
data_read<= data;
data_read<= data;
data_read<= data;
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,1'b0};
miso_o<=data_read;
end
end
endmodule
我希望通过 FLAG来告诉他当 两个触发同时发生时 先做哪个。但是好像不起作用。
报错还多了一个:
Error (10028): Can't resolve multiple constant drivers for net "flag" at spi02.v(34)
面壁 2011年11月18日
最后我索性把 两个信号放在一个ALWAYS里
always@( cs or clk )
begin
if (!cs)
begin
if(!flag)
begin
data_read<= data;
data_read<= data;
data_read<= data;
data_read<= data;
data_read<= data;
data_read<= data;
data_read<= data;
data_read<= data;
flag<=1;
end
else
begin
data_read <= {data_read,1'b0};
miso_o<=data_read;
end
end
else
begin
flag<=1;
end
end
endmodule
最后我索性把 两个信号放在一个ALWAYS里
always@( cs or clk )
begin
if (!cs)
begin
if(!flag)
begin
data_read<= data;
data_read<= data;
data_read<= data;
data_read<= data;
data_read<= data;
data_read<= data;
data_read<= data;
data_read<= data;
flag<=1;
end
else
begin
data_read <= {data_read,1'b0};
miso_o<=data_read;
end
end
else
begin
flag<=1;
end
end
endmodule
面壁 2011年11月18日
没有报错 但是仿真无法得到波形!!!
各位路过的师傅们帮帮忙啊!
小弟刚进坛子,只有点积分奖励,跪谢了!!!
没有报错 但是仿真无法得到波形!!!
各位路过的师傅们帮帮忙啊!
小弟刚进坛子,只有点积分奖励,跪谢了!!!
yangwenguan 2015年02月16日
头皮发麻..... fpga的逻辑观念比c更严谨
`define datalen (8-1)
module spi02( reset, data, clk, cs, miso_o );
//input
input reset
input clk;
input cs;
input data;
//wire data;
//output
output miso_o;
reg out;
//reg
reg counter;
//reg 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;
if(counter = datalen) counter = 0;
else counter = counter+1;
else
counter = 0;
end
end
头皮发麻..... fpga的逻辑观念比c更严谨
`define datalen (8-1)
module spi02( reset, data, clk, cs, miso_o );
//input
input reset
input clk;
input cs;
input data;
//wire data;
//output
output miso_o;
reg out;
//reg
reg counter;
//reg 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;
if(counter = datalen) counter = 0;
else counter = counter+1;
else
counter = 0;
end
end
写出你的程序来让大家看看呀