搜索
bottom↓
回复: 12

verilog中case语句执行不正常

[复制链接]

出0入0汤圆

发表于 2016-2-25 09:06:52 | 显示全部楼层 |阅读模式
最近在学习verilog,使用是XILINX的XC3S50AN,在测试过程中遇到一个低级问题,case语句没有按照预期输出结果。目的通过对CLK分频,控制LED闪烁。同时使用了if语句和case语句做对比。目前if语句可以正常驱动LED闪烁,case语句控制的LED不闪烁。

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

代码如下:

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 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 [1:0]LED;

reg [23:0]count;
reg [23:0]list;
reg [3:0]j;
reg [3:0]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[0]<=~LED[0];
                        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[1]<=~LED[1];
                list<=24'd0;
                end
        else
                list<=list+1'd1;
        end
       
endcase

endmodule

出0入0汤圆

发表于 2016-2-25 09:06:53 | 显示全部楼层
你的复位信号呢?

出0入0汤圆

发表于 2016-2-25 09:17:58 | 显示全部楼层
用modelsim仿真一下,看下波形,再找问题在哪里

出0入0汤圆

 楼主| 发表于 2016-2-25 09:44:54 | 显示全部楼层

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

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

出0入0汤圆

发表于 2016-2-25 09:47:40 | 显示全部楼层
在case里面加上default试试:
default: i <= 0;

应该是复位的问题;

出0入0汤圆

发表于 2016-2-25 10:03:23 | 显示全部楼层
longsky1985 发表于 2016-2-25 09:44
加上复位信号,运行就正常了
增加的语句如下:
always @(posedge CLK or negedge RSTn)

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

出0入0汤圆

发表于 2016-2-25 10:59:55 | 显示全部楼层
不要复位信号也可以。加一个 default就可以了。

出0入8汤圆

发表于 2016-2-25 18:54:37 来自手机 | 显示全部楼层
要有一个初始状态啊

出0入0汤圆

发表于 2016-2-25 22:20:40 | 显示全部楼层
初始状态未指定,你增加的复位语句根本目的也是提供一个初始状态

出0入0汤圆

 楼主| 发表于 2016-2-25 22:30:41 | 显示全部楼层
谢谢大家的指点,解决了我的疑惑。

出0入0汤圆

发表于 2016-2-25 23:22:30 | 显示全部楼层
reg变量默认值为x 不定;
wire变量默认值为z 高阻。

出0入0汤圆

发表于 2016-2-25 23:53:52 来自手机 | 显示全部楼层
这就是verilog和c语言开发的区别
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 02:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表