找回密码
 注册
关于网站域名变更的通知
查看: 216|回复: 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 编辑 4 p. B# C. C" R4 Y
    . _3 y. |3 ?& }. z1 Z/ a. l
    • `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# ]5 U# f4 h! Y, F# ~  b; |1 o$ d

    该用户从未签到

    2#
    发表于 2020-6-1 20:13 | 只看该作者
    问题不好解答,因为需求不明确。
      z3 e; x( Y8 i0 J) _$ P//------------------------! E9 [2 v  o  V' M2 ~3 v( X
    01.Line38~Line135:对data第一次赋值$ X& h0 s; [' f+ |# B4 W# x# }& G- k
    02.Line137~Line143:对data第二次赋值4 S- ?' f9 |$ S, \
    这两次赋值以哪次为准?还是不同的变量赋值?这勉强算语法错误了。5 t0 o9 ^! T+ h+ T8 j1 i( i( N9 ]
    感觉,只能说感觉,想配置一个计数器,在不同mode下实现递增/递减功能。
    6 d7 y, o0 y2 i$ s' }7 [# J) \% ?( ?9 y% ?7 `' h( P8 b
    //------------------------
    7 l0 z6 l1 E+ ]* K' [& J先解决上述语法问题。
    6 u9 I" i4 c( ~, i& Q再解决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- R0 k, j5 F# A; ^3 o, L
    问题不好解答,因为需求不明确。
    5 ^- `) [! G& P//------------------------6 y- P' R1 S: B+ L! }2 m
    01.Line38~Line135:对data第一次赋值

    5 I( r* L3 s, D) `& |9 L0 g是想配置一个计数器,不同模值下加减,可以赋初值。但是第一次赋值和第二次赋值的时间不一样,一次是随时钟加减,一次是load初值,这样有问题吗?仿真出来data一直是0* Y3 j7 A. P% {0 ^
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

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

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

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

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