【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL3

奇偶校验

题目描述:现在需要对输入的32位数据进行奇偶校验,根据sel输出校验结果(1输出奇校验,0输出偶校验)

输入描述

输入信号   bus sel
类型 wire

输出描述

输出信号   check        
类型  wire

解题思路

当sel = 0时,其输出偶校验。即输入bus(32位数据)中有偶数个0时,check = 1,输入bus中有奇数个0时,check = 0;

当sel = 1时,其输出奇校验。即输入bus(32位数据)中有奇数个1时,check = 1,输入bus中有偶数个1时,check = 0;

方法1:使用always语句块

其中:我们来了解一下归约运算符(缩位运算符)的定义:

归约运算符按位进行逻辑运算,属于单目运算符。由于这一类运算符运算的结果是产生1位逻辑值,因而被形象地称为缩位运算符。

Verilog HDL中,缩位运算符包括&(与)、|(或)、^(异或)以及相应的非操作~&、~|、~^、^~。归约运算符的操作数只有一个

归约运算符的运算过程是:设a是一个4位的寄存器变量,它的4位分别是a[0], a[1], a[2], a[3]。当对a进行缩位运算时,先计算a[0]和a[1]的缩位运算,产生1位的结果,再将这个结果与a[2]进行运算,再与a[3]进行运算,最终只产生1位的结果。

`timescale 1ns/1ns
module odd_sel(
input [31:0] bus,
input sel,
output check
);
//*************code***********//

reg t; 
always @(*)
    if (sel)  //奇校验
        t = ^bus; //32位bus信号按位异或; 若为奇数个1,t=1; 若为偶数个1,t=0
    else
        t = ~^bus; //若为奇数个1,t=0; 若为偶数个1,t=1
assign check = t; 

//*************code***********//
endmodule
方法2:使用条件表达符

仅需一条assign语句

`timescale 1ns/1ns
module odd_sel(
input [31:0] bus,
input sel,
output check
);
//*************code***********//

assign check = sel ? ^bus : ~^bus;  
//*************code***********//
endmodule

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值