[X]关闭

在vivado上进行仿真不能正确显示结果的问题

文档创建者:Li2015
浏览次数:20373
最后更新:2016-02-05
 
在vivado上做了一个流水灯实验的仿真,仿真图像能显示输入值,但led显示的值却是XXXXXXXX,测试代码应该是正确的,估计是执行代码出了问题,由于楼主水平有限,故发贴请高手帮忙找出错误,现将代码粘贴如下:

顶层:
module runled_top(
    input iClk,
    input iRst_n,
    output [7:0] oLed
    );
wire    clk2hz_sig;

timer500ms timer500ms_inst(
    .iClk100mhz(iClk),
    .iRst_n(~iRst_n),
    .oClk2hz(clk2hz_sig)
);   
led_ctrl led_ctrl_inst(
    .iClk(clk2hz_sig),
    .iRst_n(~iRst_n),
    .oLed(oLed)
);
        
endmodule
时钟发生
module timer500ms(
input   iClk100mhz,
input    iRst_n,
output  reg oClk2hz  // period = 1/2s
);
reg [31:0] cnt2hz;
always @(posedge iClk100mhz) begin
//iClk100mhz=1;
//iRst_n
if(iRst_n==1'b0) begin
     oClk2hz <= 1'b0;
  cnt2hz <= 32'b0;
end
else begin
  if(cnt2hz==32'd25000000) begin
   cnt2hz <= 32'b0;
   oClk2hz <= ~ oClk2hz;
  end
else begin
cnt2hz <= cnt2hz + 1'b1;
oClk2hz <= oClk2hz;
end
end
end
endmodule
led控制模块:
module led_ctrl(
    input iClk,
    input iRst_n,
    output [7:0] oLed
    );
reg [7:0]   led;   

/*
\ 每个时钟上升沿,左移1bit,写法是为了实现循环左移
*/   
always @(posedge iClk) begin

    if(iRst_n==1'b0)
        led <= 8'b1;
    else
        led <= {led[6:0],led[7]};        

end   
assign  oLed = led;
   
endmodule

程序测试代码:
module aa_tb;
// Inputs
reg iClk;
reg iRst_n;

// Outputs
wire [7:0] oLed;

// Instantiate the Unit Under Test (UUT)
runled_top uut (
  .iClk(iClk),
  .iRst_n(iRst_n),
  .oLed(oLed)
  //.clk2hz_sig(clk2hz_sig)
);

initial begin
  // Initialize Inputs
  iClk = 0;
  iRst_n = 0;

  // Wait 100 ns for global reset to finish
  #100;
        
  // Add stimulus here
       iRst_n =1 ;
end
      always #10  iClk=~ iClk;
endmodule




最后的仿真图像如下:
file:///C:/Users/Administrator/Documents/Tencent%20Files/190782612/Image/C2C/%7B738HV7%7B%609)HVE~(%25WAIXSX.png

请高手帮忙查出错误,十分感谢。。。

发表评论已发布 10

Li2015

发表于 2015-11-7 20:14:49 | 显示全部楼层

这是仿真后的图像

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

uisrc

发表于 2015-11-7 21:11:51 | 显示全部楼层

是你复位信号有问题,我们已经帮你看过了,属于低级错误。后面技术会给你上传弄好的代码。
越努力越幸运!加油!

温暖西城

发表于 2015-11-8 15:01:13 | 显示全部楼层

timer500ms timer500ms_inst(
    .iClk100mhz(iClk),
   .iRst_n(~iRst_n),
    .oClk2hz(clk2hz_sig)
);   
led_ctrl led_ctrl_inst(
    .iClk(clk2hz_sig),
    .iRst_n(~iRst_n),
    .oLed(oLed)
);



时钟发生
module timer500ms(
。。。
if(iRst_n==1'b0) begin
     oClk2hz <= 1'b0;
  cnt2hz <= 32'b0;
end
else begin
建议这里去掉‘’~‘’,否则会把你饶懵。
时钟发生模块和LED模块的复位信号不能相同,当时钟模块有新的时钟输出时,LED模块才启动。时钟发生模块和LED模块的复位信号若相同,当时钟模块发生复位,LED由于没有时钟输入不能发生复位(敏感信号是时钟),当时钟模块产生新的时钟输出给LED,启动LED,此时复位信号已经发生变化,跳过初始状态,由于led没有初始状态,所以没有输出。所以我们需要给led部分一个新的复位信号。
修改后的代码如下(建议):
module runled_top(iClk,iRst_n,oLed,oClk2hz);
input iClk;
input iRst_n;
output [7:0] oLed;
output oClk2hz;

reg [7:0]led;
reg        [4:0]        cnt2hz;
reg   [8:0]  cnt;
reg  oClk2hz;
reg iRst_n2;
always @(posedge iClk) begin
  if(!iRst_n) begin
                oClk2hz <= 1'b0;
                cnt2hz <= 5'b0;
    end
  else if(cnt2hz==5'd10) begin
                        cnt2hz <= 5'b0;
                        oClk2hz <= ~ oClk2hz;
                end       
  else
    begin
        cnt2hz <= cnt2hz + 1'b1;
        oClk2hz <= oClk2hz;
    end
end   

//
always@(posedge iClk )begin
   if(!iRst_n)
          begin cnt<=8'd0;iRst_n2=0;end
        else if(cnt==8'd40)
         begin  cnt<=8'd40; iRst_n2=1;end
         else cnt<=cnt+1'b1;
end


always @(posedge oClk2hz) begin

    if(!iRst_n2)
          begin
        led[7:0] <= 8'h0000_0001;
                  end
    else begin
        led[7:0] <= {led[6:0],led[7]};     
         end

end   

assign  oLed=led;

endmodule

仿真结果:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

uisrc

发表于 2015-11-8 22:35:24 | 显示全部楼层

顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
越努力越幸运!加油!

Li2015

发表于 2015-11-10 09:15:39 | 显示全部楼层

温暖西城 发表于 2015-11-8 15:01
timer500ms timer500ms_inst(
    .iClk100mhz(iClk),
    .iRst_n(~iRst_n),

我按照你的代码又做了一遍,仿真出的图像还是不正确,led还是xxxxxxxx,这是哪里出了问题?你时钟和led的代码有没有改?可以给我看下么?

RZJM

发表于 2015-11-10 12:43:04 | 显示全部楼层

加上复位下降沿检测试试
module led_ctrl(
    input iClk,
    input iRst_n,
    output [7:0] oLed
    );
reg [7:0]   led;   
/*
\ 每个时钟上升沿,左移1bit,写法是为了实现循环左移
*/   
always @(posedge iClk or negedge iRst_n) begin
    if(iRst_n==1'b0)
        led <= 8'b1;
    else
        led <= {led[6:0],led[7]};        
end   
assign  oLed = led;
   
endmodule

我认为你仿真的时候时间没必要设置这么久啊,不然速度太慢
if(cnt2hz==32'd25000000) begin
   cnt2hz <= 32'b0;
   oClk2hz <= ~ oClk2hz;
  end

RZJM

发表于 2015-11-10 12:45:31 | 显示全部楼层

RZJM 发表于 2015-11-10 12:43
加上复位下降沿检测试试
module led_ctrl(
    input iClk,

修改后的代码连接:
http://pan.baidu.com/s/1i3ATgpv

Li2015

发表于 2015-11-11 16:15:10 | 显示全部楼层

RZJM 发表于 2015-11-10 12:45
修改后的代码连接:
http://pan.baidu.com/s/1i3ATgpv

你的程序没有问题,按照你的程序仿真出了正确的图像,但当我把工程下到板子里只有第一个小灯亮,约束文件也写了,不知道是什么原因。。
这是我的约束文件,我认为它是正确的。。

set_property PACKAGE_PIN Y9 [get_ports {iClk}]
set_property IOSTANDARD LVCMOS33 [get_ports {iClk}]

set_property PACKAGE_PIN T22 [get_ports {oLed[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {oLed[0]}]

set_property PACKAGE_PIN T21 [get_ports {oLed[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {oLed[1]}]

set_property PACKAGE_PIN U22 [get_ports {oLed[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {oLed[2]}]

set_property PACKAGE_PIN U21 [get_ports {oLed[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {oLed[3]}]

set_property PACKAGE_PIN V22 [get_ports {oLed[4]}]     
set_property IOSTANDARD LVCMOS33 [get_ports {oLed[4]}]


set_property IOSTANDARD LVCMOS33 [get_ports {oLed[5]}]
set_property PACKAGE_PIN W22 [get_ports {oLed[5]}]


set_property PACKAGE_PIN U19 [get_ports {oLed[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {oLed[6]}]


set_property IOSTANDARD LVCMOS33 [get_ports {oLed[7]}]
set_property PACKAGE_PIN U14 [get_ports {oLed[7]}]


set_property IOSTANDARD LVCMOS18 [get_ports {iRst_n}]
set_property PACKAGE_PIN P16 [get_ports {iRst_n}]


RZJM

发表于 2015-11-12 14:50:16 | 显示全部楼层

Li2015 发表于 2015-11-11 16:15
你的程序没有问题,按照你的程序仿真出了正确的图像,但当我把工程下到板子里只有第一个小灯亮,约束文件 ...

这个代码直接烧写一下试试。
http://pan.baidu.com/s/1jG8Pw4e
12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则