FPGA作为从机给STM32发送数据,仿真可以通过,实际却不行。
本帖最后由 thy110 于 2017-11-20 17:18 编辑我以114个数据为一组,给stm32发送数据,仿真可以看出数据都发送出去的了,但是接受的数据却不正确,接收的都是114个相同的数据,求助啊
module SPI_Test(
input clk,
input rst_n,
input SCK,
input CS,
input MOSI,
output MISO,
input rx,
output tx);
reg spi_ad ; //存储发送的ASIC字符
reg txd_data;
reg spi_cnt;
regspi_stat;
always@(CS)
begin //定义发送的字符
if(spi_stat == 0) begin
spi_ad<=65; //存储字符 A
spi_ad<=68; //存储字符 D
spi_ad<=49; //存储字符 1
spi_ad<=58; //存储字符 :
spi_ad<=0; //存储字符 正负
spi_ad<=48; //存储字符 个位
spi_ad<=46; //存储字符 .
spi_ad<=48; //存储字符 小数点后一位
spi_ad<=48; //存储字符 小数点后二位
spi_ad<=48; //存储字符 小数点后三位
spi_ad<=48; //存储字符 小数点后四位
spi_ad<=86; //存储字符 V
spi_ad<=32; //存储字符 空格
spi_ad<=32; //存储字符 空格
spi_ad<=65; //存储字符 A
spi_ad<=68; //存储字符 D
spi_ad<=50; //存储字符 2
spi_ad<=58; //存储字符 :
spi_ad<=0; //存储字符 正负
spi_ad<= 48; //存储字符 个位
spi_ad<=46; //存储字符 .
spi_ad<=48; //存储字符 小数点后一位
spi_ad<=48; //存储字符 小数点后二位
spi_ad<=48; //存储字符 小数点后三位
spi_ad<=48; //存储字符 小数点后四位
spi_ad<=86; //存储字符 V
spi_ad<=32; //存储字符 空格
spi_ad<=32; //存储字符 空格
spi_ad<=65; //存储字符 A
spi_ad<=68; //存储字符 D
spi_ad<=51; //存储字符 3
spi_ad<=58; //存储字符 :
spi_ad<=0; //存储字符 正负
spi_ad<=48; //存储字符 个位
spi_ad<=46; //存储字符 .
spi_ad<=48; //存储字符 小数点后一位
spi_ad<=48; //存储字符 小数点后二位
spi_ad<=48; //存储字符 小数点后三位
spi_ad<=48; //存储字符 小数点后四位
spi_ad<=86; //存储字符 V
spi_ad<=32; //存储字符 空格
spi_ad<=32; //存储字符 空格
spi_ad<=65; //存储字符 A
spi_ad<=68; //存储字符 D
spi_ad<=52; //存储字符 4
spi_ad<=58; //存储字符 :
spi_ad<=0; //存储字符 正负
spi_ad<=48; //存储字符 个位
spi_ad<=46; //存储字符 .
spi_ad<=48; //存储字符 小数点后一位
spi_ad<=48; //存储字符 小数点后二位
spi_ad<=48; //存储字符 小数点后三位
spi_ad<=48; //存储字符 小数点后四位
spi_ad<=86; //存储字符 V
spi_ad<=32; //存储字符 空格
spi_ad<=32; //存储字符 空格
spi_ad<=65; //存储字符 A
spi_ad<=68; //存储字符 D
spi_ad<=53; //存储字符 5
spi_ad<=58; //存储字符 :
spi_ad<=0; //存储字符 正负
spi_ad<=48; //存储字符 个位
spi_ad<=46; //存储字符 .
spi_ad<=48; //存储字符 小数点后一位
spi_ad<=48; //存储字符 小数点后二位
spi_ad<=48; //存储字符 小数点后三位
spi_ad<=48; //存储字符 小数点后四位
spi_ad<=86; //存储字符 V
spi_ad<=32; //存储字符 空格
spi_ad<=32; //存储字符 空格
spi_ad<=65; //存储字符 A
spi_ad<=68; //存储字符 D
spi_ad<=54; //存储字符 6
spi_ad<=58; //存储字符 :
spi_ad<=0; //存储字符 正负
spi_ad<=48; //存储字符 个位
spi_ad<=46; //存储字符 .
spi_ad<=48; //存储字符 小数点后一位
spi_ad<=48; //存储字符 小数点后二位
spi_ad<=48; //存储字符 小数点后三位
spi_ad<=48; //存储字符 小数点后四位
spi_ad<=86; //存储字符 V
spi_ad<=32; //存储字符 空格
spi_ad<=32; //存储字符 空格
spi_ad<=65; //存储字符 A
spi_ad<=68; //存储字符 D
spi_ad<=55; //存储字符 7
spi_ad<=58; //存储字符 :
spi_ad<=0; //存储字符 正负
spi_ad<=48; //存储字符 个位
spi_ad<=46; //存储字符 .
spi_ad<=48; //存储字符 小数点后一位
spi_ad<=48; //存储字符 小数点后二位
spi_ad<=48; //存储字符 小数点后三位
spi_ad<=48; //存储字符 小数点后四位
spi_ad<=86; //存储字符 V
spi_ad<=32; //存储字符 空格
spi_ad<=32; //存储字符 空格
spi_ad<=65; //存储字符 A
spi_ad<=68; //存储字符 D
spi_ad<=56; //存储字符 8
spi_ad<=58; //存储字符 :
spi_ad<=0; //存储字符 正负
spi_ad<=48; //存储字符 个位
spi_ad<=46; //存储字符 .
spi_ad<=48; //存储字符 小数点后一位
spi_ad<=48; //存储字符 小数点后二位
spi_ad<=48; //存储字符 小数点后三位
spi_ad<=48; //存储字符 小数点后四位
spi_ad<=86; //存储字符 V
spi_ad<=32; //存储字符 空格
spi_ad<=32; //存储字符 空格
spi_ad<=10; //换行符
spi_ad<=13; //回车符
end
end
wireCS_n;
reg CS_r0,CS_r1;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
CS_r0 <= 1'b0;
CS_r1 <= 1'b0;
end
else
begin
CS_r0 <= CS;
CS_r1 <= CS_r0;
end
end
assign CS_n = (~CS_r0 & CS_r1)? 1'b1:1'b0;
always@( CS_n )//CS边缘检测下降沿
begin
if(!rst_n) begin
spi_cnt<=0;
spi_stat <= 0;
end
else if(spi_cnt == 114) begin
spi_cnt <= 0;
spi_stat <= 0;
end
else if(CS_n & !CS )begin
txd_data <= spi_ad;
spi_cnt <= spi_cnt + 1'b1;
spi_stat <= 1;
end
end
wire SCK_n,SCK_p;
SPI_SCK u1(
.clk(clk),
.rst_n(rst_n),
.SCK(SCK),
.SCK_n(SCK_n),
.SCK_p(SCK_p));
SPI_TX u4(
.clk(clk),
.rst_n(rst_n),
.SCK_n(SCK_n),
.CS(CS),
.txd_data(txd_data),
.MISO(MISO));
endmodule
感脚软件仿真是功能验证,实际不行是硬件不通{:titter:}猜的 用真实的示波器,测量你可以测到的波形来比对看看 本帖最后由 ArthurBruin 于 2017-11-20 20:46 编辑
楼主的Verilog水平还有待加强,以下几点问题:
1. 即便是testbench测试程序也不能出现语法问题:前面是组合逻辑always@(CS),而中间spi_ad 用"<="如何同步?肯定会出现时序问题的;
2. 原则上Verilog代码不管是可综合的还是testbench都应该同步至clk上,这里面你又是组合逻辑又是时序逻辑,又没状态机同步,如何控制时序? 你可以把你要发的数据放在mif文件里作为ROM的初始值,然后从ROM里往出读试试。 spi从机没那么复杂把? 拿逻辑分析仪抓一下波形看看。 解决了,我理解错了,spi主机直接连续发过来114*8个时钟,而我写成了不连续的114*8时钟,对spi理解不透测啊 ArthurBruin 发表于 2017-11-20 20:35
楼主的Verilog水平还有待加强,以下几点问题:
1. 即便是testbench测试程序也不能出现语法问题:前面是组合 ...
好的,O(∩_∩)O谢谢,Verilog还不是很熟,还要多练啊
页:
[1]