2944|10

94

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

Verilog 代码,问题出在哪,小白求助,在线等 [复制链接]

10芯积分
本帖最后由 zhaironghui 于 2015-10-22 11:26 编辑

大家好,接触 Verilog 时间不长,遇到一个问题,真心求教。谢谢
背景:想把 AD 输出的 8 位并行数据在 CPLD 中进行并串转换,并在 DSP 提供的 串行时钟 CLKR1 和 帧同步(片选)信号 FSR1 的控制下,将串行数据经 DR1 引脚输出
问题:综合能通过,但经过波形仿真,DR1 输出的数据总是不对

代码如下:
//
module spi(
         output reg clk_ad,

    //SPI_1,方向:CPLD-->DSP        
         output reg DR1,
         input FSR1,
         input CLKR1,
         
         input clk_in,
         input [7:0]data_in       //AD输入cpld的8位数据
        );
         
         reg[4:0]temp;
//add        
         reg[7:0]data_to_dsp;     //用于数据缓存
        reg[8:0]data_to_dspp;

//AD的时钟由有源晶振4分频得到,10/4=2.5M
always @(posedge clk_in) begin
         temp<=temp+1'd1;
         if(temp==1)
                 begin
                         clk_ad<=~clk_ad;
                         temp<=0;
end

         else
                         clk_ad<=clk_ad;
end

//AD输入到CPLD的数据转移到寄存器data_to_dsp中
always @(posedge clk_ad) begin
         data_to_dsp<=data_in;               
end

//CPLD到DSP的SPI实现(SPI1)
always @(negedge CLKR1) begin
         if(!FSR1)
                         begin
                                   data_to_dspp[8:0] <= {data_to_dsp[7:0],1'b0};
                                 DR1 <= data_to_dspp[8];
     end
end

endmodule

最佳答案

查看完整内容

楼主你好,我也是FPGA的初学者,而且是自学...我说说我的一点理解吧,说错的地方请楼主和路过的大神轻拍 我觉得问题出在这句上: begin data_to_dspp[8:0]
此帖出自FPGA/CPLD论坛

最新回复

可以参考明德扬点拨FPGA基础视频,视频里有verilog视频的讲解。  详情 回复 发表于 2015-10-27 10:46
点赞 关注
 

回复
举报

372

帖子

0

TA的资源

一粒金砂(高级)

沙发
 
本帖最后由 coyoo 于 2015-10-22 11:31 编辑

1、CLKR1也是2.5M?2、AD采样数据并转串的时候使用的是CLKR1,该时钟与ADC的时钟的关系不确定;建议加一个异步FIFO
此帖出自FPGA/CPLD论坛

点评

我波形仿真的时候,给 CLKR1 的也是 2.5MHz  详情 回复 发表于 2015-10-22 11:39
 
 

回复

94

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
本帖最后由 zhaironghui 于 2015-10-22 11:43 编辑
coyoo 发表于 2015-10-22 11:29
1、CLKR1也是2.5M?2、AD采样数据并转串的时候使用的是CLKR1,该时钟与ADC的时钟的关系不确定;建议加一个 ...

我波形仿真的时候,给 FSR1 的是 2.5MHz,给 CLKR1 的是 40MHz

波形仿真.png (12.41 KB, 下载次数: 0)

波形仿真.png
此帖出自FPGA/CPLD论坛
 
 
 

回复

372

帖子

0

TA的资源

一粒金砂(高级)

4
 
建议用ModelSim仿真看看,波形仿真没怎么用过
此帖出自FPGA/CPLD论坛

点评

不会写 testbench 额  详情 回复 发表于 2015-10-22 15:19
 
 
 

回复

94

帖子

0

TA的资源

一粒金砂(中级)

5
 
coyoo 发表于 2015-10-22 15:05
建议用ModelSim仿真看看,波形仿真没怎么用过

不会写 testbench 额
此帖出自FPGA/CPLD论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(中级)

6
 
楼主你好,我也是FPGA的初学者,而且是自学...我说说我的一点理解吧,说错的地方请楼主和路过的大神轻拍
我觉得问题出在这句上:
begin
       data_to_dspp[8:0] <= {data_to_dsp[7:0],1'b0};
       DR1 <= data_to_dspp[8];
end
以data_to_dsp为1010_1010为例,我猜楼主的意思是用1'b0把data_to_dsp里的数据一位一位挤出去,所以data_to_dspp会变成这样:1010_1010_0,然后dr1就把最高位取走了,但问题是data_to_dsp一直是1010_1010的话,data_to_dspp会一直是1010_1010_0,所以dr1取到的永远是data_to_dsp的最高位。我觉得如果加一句,变成这样:
begin
       data_to_dspp[8:0] <= {data_to_dsp[7:0],1'b0};
       data_to_dsp<=data_to_dspp[7:0];
       DR1 <= data_to_dspp[8];
end
第一个时钟输出还是最高位1,但是这时候data_to_dsp变成了0101_0100_0,下个时钟来的时候你就能取到想要的0了。不知道我这样理解对不对,请过路大神指点。
另外提出几点疑问,如果我上面说的是对的,存在两个个问题,
1.是不是要个计数器看看数据都挤出去了就停了吧;
2.这句话:
always @(posedge clk_ad) begin
         data_to_dsp<=data_in;               
end
会在每个时钟把data_to_dsp刷一遍,这样两个时钟相同的话,可能还是一直取到数据的最高位那个1....

以上。
此帖出自FPGA/CPLD论坛

点评

首先感谢你的解答指出了程序的问题所在,没有实现移位功能,这样改代码应该没有问题, 我程序中每个 FSR1(2.5MHz) 的低电平对应 8 个 CLKR1(40MHz) 的周期,(即 CLKR1 的频率为 FSR1 的 16 倍,也为 clk_ad(2  详情 回复 发表于 2015-10-26 21:43
"pouty7447"应该指出了问题所在,之前没有仔细看代码。 其实应该没有必要定义一个data_to_dspp,即将data_to_dsp与data_to_dspp合并;还是只需要一句话: data_to_dsp[8:0]  详情 回复 发表于 2015-10-25 09:28
 
 
 

回复

372

帖子

0

TA的资源

一粒金砂(高级)

7
 
本帖最后由 coyoo 于 2015-10-25 09:31 编辑
pouty7447 发表于 2015-10-24 11:30
楼主你好,我也是FPGA的初学者,而且是自学...我说说我的一点理解吧,说错的地方请楼主和路过的大神轻拍
...

"pouty7447"应该指出了问题所在,之前没有仔细看代码。
其实应该没有必要定义一个data_to_dspp,即将data_to_dsp与data_to_dspp合并;还是只需要一句话:
data_to_dsp[8:0] <= {data_to_dsp[7:0],1'b0};

当然前面定义的时候:reg[8:0] data_to_dsp
当然,数据采集的时钟频率,以及每个数据什么时候开始转换,且何时转换结束,都是需要后续考虑的问题。
此帖出自FPGA/CPLD论坛

点评

恩,谢谢你,从代码上看的确没有实现移位功能,实现移位功能后还要考虑你说的这几个问题  详情 回复 发表于 2015-10-26 21:29
 
 
 

回复

94

帖子

0

TA的资源

一粒金砂(中级)

8
 
coyoo 发表于 2015-10-25 09:28
"pouty7447"应该指出了问题所在,之前没有仔细看代码。
其实应该没有必要定义一个data_to_dspp,即将data ...

恩,谢谢你,从代码上看的确没有实现移位功能,实现移位功能后还要考虑你说的这几个问题
此帖出自FPGA/CPLD论坛
 
 
 

回复

94

帖子

0

TA的资源

一粒金砂(中级)

9
 
pouty7447 发表于 2015-10-22 11:08
楼主你好,我也是FPGA的初学者,而且是自学...我说说我的一点理解吧,说错的地方请楼主和路过的大神轻拍
...

首先感谢你的解答指出了程序的问题所在,没有实现移位功能,这样改代码应该没有问题,
我程序中每个 FSR1(2.5MHz) 的低电平对应 8 个 CLKR1(40MHz =2.5 MHz*16) 的周期,(即 CLKR1 的频率为 FSR1 的 16 倍,也为 clk_ad(2.5MHz) 的 16 倍),所以这样改理论上应该是对的。
此帖出自FPGA/CPLD论坛
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(初级)

10
 
可以参考明德扬点拨FPGA基础视频,视频里有verilog视频的讲解。
此帖出自FPGA/CPLD论坛

点评

好的,谢谢  详情 回复 发表于 2015-10-27 16:54
 
 
 

回复

94

帖子

0

TA的资源

一粒金砂(中级)

11
 
gjlkgln4534 发表于 2015-10-27 10:46
可以参考明德扬点拨FPGA基础视频,视频里有verilog视频的讲解。

好的,谢谢
此帖出自FPGA/CPLD论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表