longsky1985 发表于 2016-2-25 09:06:52

verilog中case语句执行不正常

最近在学习verilog,使用是XILINX的XC3S50AN,在测试过程中遇到一个低级问题,case语句没有按照预期输出结果。目的通过对CLK分频,控制LED闪烁。同时使用了if语句和case语句做对比。目前if语句可以正常驱动LED闪烁,case语句控制的LED不闪烁。

请大家指点一下语法哪里不对。

代码如下:

longsky1985 发表于 2016-2-25 09:07:42

代码如下:
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date:    17:38:58 02/24/2016
// Design Name:
// Module Name:    case_test
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module case_test(CLK,LED
    );
input CLK;
output reg LED;

reg count;
reg list;
reg j;
reg i;
always @ (posedge CLK)
begin

        if(j==4'd0)
                begin
                j<=j+1'b1;               
                end
        else if(j==4'd1)
                begin
                j<=j+1'b1;
                end
        else if(j==4'd2)
                begin
                j<=j+1'b1;
                end
        else if (j==4'd3)
        begin
                j<=4'd0;
                if(count==24'd1000000)
                begin
                        LED<=~LED;
                        count<=24'd0;
                end
                else
                        count<=count+1'b1;
        end
        else
                j<=4'd0;
       

       
       
end
///////////////////////////////////////////////////
always @(posedge CLK)
case(i)
        4'd0:
                i<=i+1'd1;
        4'd1:
                i<=i+1'd1;
        4'd2:
                i<=i+1'd1;
        4'd3:
        begin
                i<=4'd0;
        if(list==24'd1000000)
                begin
                LED<=~LED;
                list<=24'd0;
                end
        else
                list<=list+1'd1;
        end
       
endcase

endmodule

辰星和月 发表于 2016-2-25 09:06:53

你的复位信号呢?

McuPlayer 发表于 2016-2-25 09:17:58

用modelsim仿真一下,看下波形,再找问题在哪里

longsky1985 发表于 2016-2-25 09:44:54

辰星和月 发表于 2016-2-25 09:06
你的复位信号呢?

加上复位信号,运行就正常了
增加的语句如下:
always @(posedge CLK or negedge RSTn)
if(!RSTn)
begin
        i<=4'd0;
        list<=24'd0;
end

是不是always语句必须要增加复位信号?

jm2011 发表于 2016-2-25 09:47:40

在case里面加上default试试:
default: i <= 0;

应该是复位的问题;

辰星和月 发表于 2016-2-25 10:03:23

longsky1985 发表于 2016-2-25 09:44
加上复位信号,运行就正常了
增加的语句如下:
always @(posedge CLK or negedge RSTn)


复位信号在硬件设计里面是必须的。不信你自己翻翻数电书。

zhonghua_li 发表于 2016-2-25 10:59:55

不要复位信号也可以。加一个 default就可以了。

justdomyself 发表于 2016-2-25 18:54:37

要有一个初始状态啊

huke08@126.com 发表于 2016-2-25 22:20:40

初始状态未指定,你增加的复位语句根本目的也是提供一个初始状态

longsky1985 发表于 2016-2-25 22:30:41

谢谢大家的指点,解决了我的疑惑。

dengterry 发表于 2016-2-25 23:22:30

reg变量默认值为x 不定;
wire变量默认值为z 高阻。

honeybear 发表于 2016-2-25 23:53:52

这就是verilog和c语言开发的区别
页: [1]
查看完整版本: verilog中case语句执行不正常