找回密码
 注册
关于网站域名变更的通知
查看: 204|回复: 2
打印 上一主题 下一主题

用verilog写计数器,为什么输出一直是0?

[复制链接]
  • TA的每日心情
    难过
    2019-11-19 16:03
  • 签到天数: 1 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2020-6-1 20:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

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

    x
    本帖最后由 TheWorld 于 2020-6-1 20:13 编辑 ; \/ \8 A; I. W. T9 B" _
    : }& Z) d5 p: J" {. e9 O
    • `timescale 1ps / 1ps
    • //////////////////////////////////////////////////////////////////////////////////
    • // Company:
    • // Engineer:
    • //
    • // Create Date: 2020/05/21 21:24:26
    • // Design Name:
    • // Module Name: counter
    • // Project Name:
    • // Target Devices:
    • // Tool Versions:
    • // Description:
    • //
    • // Dependencies:
    • //
    • // Revision:
    • // Revision 0.01 - File Created
    • // Additional Comments:
    • //
    • //////////////////////////////////////////////////////////////////////////////////
    • module counter(
    •     input [3:0] data_in,
    •     input load,
    •     input [1:0] mod_sel,
    •     input dir_sel,
    •     input en,
    •     input rst,
    •     input clk,
    •    // output reg [3:0] out,
    •     output reg [3:0] data);
    •    // reg [3:0] init;
    •     reg clr;
    •     always@(posedge clk)
    •     begin
    •       if(rst || clr)
    •       begin
    •         data<=4'b0000;
    •       end
    •       else
    •       begin
    •         if(en)
    •         begin
    •           //out<=data;
    •           case({mod_sel,dir_sel})           //use mod_sel to select mod
    •             001:                //mod 8, increase
    •             begin
    •               if(data<=4'b0110)
    •               begin
    •                 data<=data+1;
    •               end
    •               else
    •               begin
    •                 data<=0;
    •               end
    •             end
    •             000:                //mod 8, decrease
    •             begin
    •               if(data>4'b000)
    •               begin
    •                 data<=data-1;
    •               end
    •               else
    •               begin
    •                 data<=4'b0111;
    •               end
    •             end
    •             011:                //mod 10, increase
    •             begin
    •               if(data<=4'b1000)
    •               begin
    •                 data<=data+1;
    •               end
    •               else
    •               begin
    •                 data<=0;
    •               end
    •             end
    •             010:                //mod 10, decrease
    •             begin
    •               if(data>4'b0000)
    •               begin
    •                 data<=data-1;
    •               end
    •               else
    •               begin
    •                 data<=4'b1001;
    •               end
    •             end
    •             101:                 //mod 16, increase
    •             begin
    •               if(data<=4'b1110)
    •               begin
    •                 data<=data+1;
    •               end
    •               else
    •               begin
    •                 data<=0;
    •               end
    •             end
    •             100:                 //mod 16, decrease
    •             begin
    •               if(data>4'b0000)
    •               begin
    •                 data<=data-1;
    •               end
    •               else
    •               begin
    •                 data<=4'b1110;
    •               end
    •             end
    •             default:                  //avoid mistakes in default case
    •             begin
    •               data<=4'b0000;
    •             end
    •           endcase
    •        // out<=data;
    •         end
    •           else
    •           data<=4'b0000;
    •       end
    •       end
    •       always@(posedge clr)
    •       begin
    •         if(load==1)
    •           data<=data_in;
    •         else
    •           data<=4'b0000;
    •       end             //load initial value
    •       always@(mod_sel[0] or mod_sel[1])
    •       begin
    •         clr<=1'b1;
    •       end            //reset when the mod is reset
    • endmodule
        I3 K# U3 H1 g

    该用户从未签到

    2#
    发表于 2020-6-1 20:13 | 只看该作者
    问题不好解答,因为需求不明确。
    5 s6 Y5 T# [) L7 V& Q. w//------------------------4 l- ]4 C2 f  ~- m3 x' R- b
    01.Line38~Line135:对data第一次赋值
    & ~  J8 u7 I0 `- {3 V02.Line137~Line143:对data第二次赋值+ r! u8 z: i/ D2 `
    这两次赋值以哪次为准?还是不同的变量赋值?这勉强算语法错误了。
    # j% N3 e! G; T6 l感觉,只能说感觉,想配置一个计数器,在不同mode下实现递增/递减功能。+ y& u: H7 b7 ?

    6 Y* F$ e& p$ d( B# r//------------------------
    2 R) b2 o' ?+ W6 B( ?9 {先解决上述语法问题。
    $ k1 N( F7 q6 @6 d再解决Line137~Line148的赋值问题,一般事件触发使用阻塞赋值语句,而你用的非阻塞复制(依赖于时序)。

    点评

    是想配置一个计数器,不同模值下加减,可以赋初值。但是第一次赋值和第二次赋值的时间不一样,一次是随时钟加减,一次是load初值,这样有问题吗?仿真出来data一直是0  详情 回复 发表于 2020-6-1 20:14
  • TA的每日心情
    难过
    2019-11-19 16:03
  • 签到天数: 1 天

    [LV.1]初来乍到

    3#
     楼主| 发表于 2020-6-1 20:14 | 只看该作者
    bookbook 发表于 2020-6-1 20:13+ Y! t  Q9 r$ U; \9 o& F; t, d2 }
    问题不好解答,因为需求不明确。
    2 f5 K* R' G/ ]; _# Z: [2 i//------------------------" c: ~8 s% B. H& }3 V$ _
    01.Line38~Line135:对data第一次赋值

    . k0 a# t% \+ }是想配置一个计数器,不同模值下加减,可以赋初值。但是第一次赋值和第二次赋值的时间不一样,一次是随时钟加减,一次是load初值,这样有问题吗?仿真出来data一直是0
    , R* b' r6 x! F
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-8-21 07:13 , Processed in 0.125000 second(s), 27 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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