verilog练习

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITY SCHK IS

  PORT(DIN, CLK, CLR  :INSTD_LOGIC;--串行输入数据位/工作时钟/复位信号

        AB :OUTSTD_LOGIC_VECTOR(3DOWNTO0));--检测结果输出

END SCHK;

ARCHITECTURE behav OF SCHK IS

    SIGNAL Q :INTEGERRANGE0TO8;

    SIGNAL D :STD_LOGIC_VECTOR(7DOWNTO0);   --8位待检测预置数

BEGIN

    D <="11100101"  ;--8位待检测预置数:密码:E5H

 Com1:PROCESS( CLK, CLR )

  BEGIN

  IF CLR = '1' THEN    Q <=0;

  ELSIF  CLK'EVENTAND CLK='1' THEN--时钟到来时,判断并处理当前输入的位

     CASE Q IS

      WHEN0=>  IF DIN = D(7)THEN Q <=1;ELSE Q <=0;ENDIF;

      WHEN1=>  IF DIN = D(6)THEN Q <=2;ELSE Q <=0;ENDIF;

      WHEN2=>  IF DIN = D(5)THEN Q <=3;ELSE Q <=0;ENDIF;

      WHEN3=>  IF DIN = D(4)THEN Q <=4;ELSE Q <=0;ENDIF;

      WHEN4=>  IF DIN = D(3)THEN Q <=5;ELSE Q <=0;ENDIF;

      WHEN5=>  IF DIN = D(2)THEN Q <=6;ELSE Q <=0;ENDIF;

      WHEN6=>  IF DIN = D(1)THEN Q <=7;ELSE Q <=0;ENDIF;

      WHEN7=>  IF DIN = D(0)THEN Q <=8;ELSE Q <=0;ENDIF;

      WHENOTHERS=>  Q <=0;

            ENDCASE;

    ENDIF;

  ENDPROCESS;

  Com2:PROCESS( Q )                                 --检测结果判断输出

  BEGIN

      IF Q =8  THEN  AB <="0001";     --序列数检测正确,输出 "1"

      ELSE      AB <="0011";           --序列数检测错误,输出 "3"

      ENDIF;

  ENDPROCESS;

END behav ;

以下是一道 Verilog 练习题: 题目描述: 设计一个 4 位加法器,包括一个输入端 A,一个输入端 B,一个进位输入端 Cin,一个输出端 S 和一个进位输出端 Cout。输入和输出都是二进制数。如果输入的数位数不足 4 位,则在高位补 0。如果加法结果超出 4 位,则将最高位舍弃。 要求: 1. 设计一个模块 top,包含一个 4 位加法器模块 adder 和一个测试模块 testbench。 2. 在 testbench 中,通过在不同的时间点改变输入信号,模拟所有可能的输入情况,并将结果输出到终端。 3. 用 Verilog 编写代码,并使用任何 Verilog 编译器进行编译和仿真。 参考答案: 下面是一种可能的解法: ``` module adder(input [3:0] A, input [3:0] B, input Cin, output [3:0] S, output Cout); assign S = A + B + Cin; assign Cout = (S[4] == 1) ? 1 : 0; endmodule module testbench; reg [3:0] A, B; reg Cin; wire [3:0] S; wire Cout; adder uut(A, B, Cin, S, Cout); initial begin $monitor("A=%b, B=%b, Cin=%b, S=%b, Cout=%b", A, B, Cin, S, Cout); A = 4'b0000; B = 4'b0000; Cin = 0; #10; A = 4'b0000; B = 4'b0001; Cin = 0; #10; A = 4'b0001; B = 4'b0000; Cin = 0; #10; A = 4'b0001; B = 4'b0001; Cin = 0; #10; A = 4'b1111; B = 4'b0000; Cin = 0; #10; A = 4'b1111; B = 4'b0000; Cin = 1; #10; A = 4'b1111; B = 4'b1111; Cin = 0; #10; A = 4'b1111; B = 4'b1111; Cin = 1; #10; $finish; end endmodule ``` 在这个解法中,adder 模块用于实现 4 位加法器的逻辑,而 testbench 模块用于生成不同的输入信号,并将输出结果打印到终端。在 testbench 中,使用 initial 块定义了一系列输入信号和时间点,模拟了所有可能的输入情况。最后,使用 $finish 关闭仿真过程。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值