4-16译码器(always,case用法)

  • 4-16译码器学习记录

模块文件

 1 module decoder_4_16(
 2                a,
 3                b,
 4                c,
 5                d,
 6                out,
 7         );
 8       input a;
 9       input b;
10       input c;
11       input d;
12       output reg [15:0]out;//同时定义了out的长度,输入输出类型和数据类型,注意【15:0】长度放在名字前面,且从大到小。
13       
14       always@(*)begin//等价于always({a,b,c,d})  *号表示所有输入信号,不包括输出信号
15          case({a,b,c,d}) //case和endcase是固定搭配,但有多种情况的时候使用,十分方便
16               4'b0000:out=16'b0000_0000_0000_0001;             
17               4'b0001:out=16'b0000_0000_0000_0010;        // 位宽度'进制 数值 :赋值语句       
18               4'b0010:out=16'b0000_0000_0000_0100;        // 注意’是引号,不同了tinmescale。中间是用冒号连接赋值语句
19               4'b0011:out=16'b0000_0000_0000_1000;
20               4'b0100:out=16'b0000_0000_0001_0000;
21               4'b0101:out=16'b0000_0000_0010_0000;
22               4'b0110:out=16'b0000_0000_0100_0000;
23               4'b0111:out=16'b0000_0000_1000_0000;
24               4'b1000:out=16'b0000_0001_0000_0000;
25               4'b1001:out=16'b0000_0010_0000_0000;
26               4'b1010:out=16'b0000_0100_0000_0000;
27               4'b1011:out=16'b0000_1000_0000_0000;
28               4'b1100:out=16'b0001_0000_0000_0000;
29               4'b1101:out=16'b0010_0000_0000_0000;
30               4'b1110:out=16'b0100_0000_0000_0000;
31               4'b1111:out=16'b1000_0000_0000_0000;
32          endcase
33       end
34       
35 endmodule

仿真激励代码

`timescale 1ns/1ns

module decoder_4_16_tb();
    reg s_a;
    reg s_b;
    reg s_c;
    reg s_d;
    wire [15:0]s_out;
    
    decoder_4_16 decoder_4_16_simulation(
                   .a(s_a),
                   .b(s_b),
                   .c(s_c),
                   .d(s_d),
                   .out(s_out)
            );
    
   initial begin
       s_a=0;s_b=0;s_c=0;s_d=0;
       #100;
       s_a=0;s_b=0;s_c=0;s_d=1;
       #100;
       s_a=0;s_b=0;s_c=1;s_d=0;
       #100;
       s_a=0;s_b=0;s_c=1;s_d=1;
       #100;
       s_a=0;s_b=1;s_c=0;s_d=0;
       #100;
       s_a=0;s_b=1;s_c=0;s_d=1;
       #100;
       s_a=0;s_b=1;s_c=1;s_d=0;
       #100;
       s_a=0;s_b=1;s_c=1;s_d=1;
       #100;
       s_a=1;s_b=0;s_c=0;s_d=0;
       #100;
       s_a=1;s_b=0;s_c=0;s_d=1;
       #100;
       s_a=1;s_b=0;s_c=1;s_d=0;
       #100;
       s_a=1;s_b=0;s_c=1;s_d=1;
       #100;
       s_a=1;s_b=1;s_c=0;s_d=0;
       #100;
       s_a=1;s_b=1;s_c=0;s_d=1;
       #100;
       s_a=1;s_b=1;s_c=1;s_d=0;
       #100;
       s_a=1;s_b=1;s_c=1;s_d=1;
       #100;
       $stop;
    end

endmodule

  • 注意

1.always的用法

格式:always @(敏感信号)。可以直接用(*)代表所有输入信号,也可以是某一组特定信号({a,b,c}),也可以是某几个信号(a or b or c)。

用处:在时序电路中,always @(posedge Clk)表示上升沿触发,下降沿用negedge。如果需要加异步功能,写成always @(posedge Clk or posedge Reset)。用or连接。如果异步信号高电平有效,则Reset用上升沿posedge修饰,反之。同时把if(Reset==1)改为if(Reset==0),此外,异步判断语句必须在always第一句,首先判断。

注意事项:别在不同always块内为同一变量赋值。?别在同一always同时阻塞非阻塞赋值?描述组合用阻塞(电平敏感),描述时序用非阻塞(边沿敏感)。=或《=左边须为reg型。@()内不能同时含电平和边沿,不同同时含一个信号的上升下降?

2.case的用法

case-endcase 中加入并行判断结构和赋值语句。它的判断条件一般是互斥的,且没有优先级。

casez不考虑高阻态z。casex不考虑高阻态z和不定态x。注意case里面语句的格式和结构,见上面代码。        

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值