HDLBits——Arithmetic Circuits

2023-10-07 22:30
文章标签 hdlbits circuits arithmetic

本文主要是介绍HDLBits——Arithmetic Circuits,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

HDLBits——Arithmetic Circuits


Problem 65 : Half adder (Hadd)

Requirement:

本题中需要实现一个 2 进制 1bit 加法器,加法器将输入的两个 1bit 数相加,产生两数相加之和以及进位。


Solution:
module top_module( input a, b,output cout, sum );assign {cout,sum} = a + b;endmodule

Problem 66 : Full adder (Fadd)

Requirement:

本题中需要实现一个 2 进制 1bit 全加器,全加器与上一题中的加法器的区别在于需要累加来自前级的进位。


Solution:
module top_module( input a, b, cin,output cout, sum );assign {cout,sum} = a + b + cin;endmodule

Timing Diagram:

image-20211202135657561


Problem 67 : 3-bit binary adder(Adder3 )

Requirement:

本题中需要通过实例化 3 个全加器,并将它们级联起来实现一个位宽为 3 bit 的二进制加法器。其实 3 bit 的加法器 cout 也只需要一位就够了,直接 assign {cout,sum} = a + b + cin。这里给了三位是暗示包括了每一位上的进位,即需要例化 3 个全加器模块,而不是一条 assign 语句。


Solution:
module top_module( input [2:0] a, b,input cin,output [2:0] cout,output [2:0] sum );add1 add1(a[0],b[0],cin,cout[0],sum[0]);  add1 add2(a[1],b[1],cout[0],cout[1],sum[1]);add1 add3(a[2],b[2],cout[1],cout[2],sum[2]);  endmodulemodule add1( input a, b, cin,output cout, sum );assign {cout,sum} = a + b + cin;endmodule
//also
assign sum = a ^ b ^ cin;
assign cout = a&b | a&cin | b&cin;

Timing Diagram:

image-20211202142005603


Problem 68 : Adder (Exams/m2014 q4j)

Requirement:

实现下图中的电路,一个 4-bit 全加器,FA:full adder 全加器。

image-20211202142912516


Solution:
module top_module (input [3:0] x,input [3:0] y, output [4:0] sum);assign sum = x + y;endmodule

verilog 的语法会自动将 x+y 扩展成 5 bit 数,但如果使用位连接符 {x+y},那么结果就会被限制为 4 bit 数。


Problem 69 : Signed addition overflow (Exams/ece241 2014 q1c)

Requirement:

有符号数相加的溢出问题,实现一个 2 进制 8bit 有符号数加法器,加法器将输入的两个 8bit 数补码相加,产生相加之和以及进位。


Solution:

方法一:判断变号与否。

有符号数溢出有两种情况:一是正正相加,产生负数;另一种情况是负负相加,产生正数。

module top_module (input [7:0] a,input [7:0] b,output [7:0] s,output overflow
); //assign s = a + b;assign overflow = (a[7]&b[7]&~s[7])|(~a[7]&~b[7]&s[7]);endmodule

方法二:判断数值位和符号位是否同时进位(双符号位)。

module top_module (input [7:0] a,input [7:0] b,output [7:0] s,output overflow
); wire [8:0] t;assign t = {a[7],a} + {b[7],b};assign s = t;assign overflow = t[8]^t[7];endmodule

Timing Diagram:

image-20211202150529471


Problem 70 100-bit binary adder

Requirement:

题目要求我们创建一个 100bit 的二进制的加法器,该电路共包含两个 100bit 的输入和一个 cin, 输出产生 sum 和 cout。


Solution:
module top_module( input [99:0] a, b,input cin,output cout,output [99:0] sum );assign {cout,sum} = cin + a + b;endmodule

虽然这样就足够简单了,但还是练习一下 for 循环吧。

always-for:

module top_module( input [99:0] a, b,input cin,output reg cout,output reg [99:0] sum );reg [99:0] cout100;integer i;always @(*) begin{cout100[0],sum[0]} = a[0] + b[0] + cin;for(i=1;i<100;i=i+1)begin{cout100[i],sum[i]} = a[i] + b[i] + cout100[i-1];endcout = cout100[99];endendmodule

generate-for:

module top_module( input [99:0] a, b,input cin,output cout,output [99:0] sum );wire [99:0] cout100;assign {cout100[0],sum[0]} = a[0] + b[0] + cin;genvar i;generatefor(i=1;i<100;i=i+1)begin:add100assign {cout100[i],sum[i]} = a[i] + b[i] + cout100[i-1];endendgenerateassign cout = cout100[99];endmodule

PS:例化时 begin 块要有标签名的原因:generate 循环中例化的模块名为add100[1].例化名,add100[2].例化名.……add100[99].例化名,这样就算例化名里没有 i,也不怕重复。


Problem 71 4-digit BCD adder

Requirement:

在本题中,题目给我们提供了一个 BCD 加法器名字为 bcd_fadd, 输入为两个 4bitBCD 码,一个 cin,产生输出为 sum 和 cout。

已知:

module bcd_fadd {input [3:0] a,input [3:0] b,input     cin,output   cout,output [3:0] sum );

Solution:
module top_module( input [15:0] a, b,input cin,output cout,output [15:0] sum );wire [4:0] cout16;assign cout16[0] = cin;genvar i;generatefor(i=0;i<4;i=i+1)begin:add16bcd_fadd bcd_fadd_i(a[4*i+:4],b[4*i+:4],cout16[i],cout16[i+1],sum[4*i+:4]);endendgenerateassign cout = cout16[4];endmodule

错过:不管多少位宽的加法,进位永远只有一位。




唯一的感受:困

这篇关于HDLBits——Arithmetic Circuits的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/160858

相关文章

【BNU】40719 Arithmetic Progressions【分块+FFT】

传送门:【BNU】40719 Arithmetic Progressions 题目分析: 用分块+FFT强行AC了这题…… 之前一直TLE……然后改了好久把姿势改的优美点了……终于过了…… 大概思路是:我们考虑分块,假设每一块的大小为S,一共分了B块然后我们分两种情况讨论: 1.第二个数在第i块,第一个数在(1~i-1)块内,第三个数在(i+1~B)块内。 2.至少两个数在同一块内。

[ABC369C] Count Arithmetic Subarrays

首先看了下题意 大致题意就是让你在长度为的序列找出所有的等差数列。 -----------------------------------------------------------------------------------------我是分界线 我的思路了,就是先从2开始计算等差数列,从3开始判断,如果是等差数列的话就继续累加,如果不是判断它是否是第一个等差数列,是就直接,如果

LeetCode 446. Arithmetic Slices II - Subsequence

一道长得一副dp的样子的dp题。 这道题难度不算特别大,因为看得出来肯定是dp题。因为,一个等差序列里面有好几个小的等差序列。 例如,2 4是一个等差序列,2 4 6是一个等差序列。 所以我们发现等差序列是可以扩展的。 那么就得到了,咱们的转移方程的一部分 dp[i][delta]=dp[j][delta]+1 dp[i][delta] = dp[j][delta] + 1

ABC 362 E - Count Arithmetic Subsequences

原题链接:E - Count Arithmetic Subsequences 题意:给出长度为n的数组,要求找出所有的等差数列,并且按照长度递增输出。 思路:dp,因为是要找出等差数列,并且这题的数据量极小,所以可以考虑设计dp数组,dp[i][j][k][v],i代表当前寻找的等差数列倒数第二项,j代表最后一项,k代表还需要寻找的长度,v代表当前判断的数,dp[i][j][k][v]代表以i

413. Arithmetic Slices 等差数列划分

https://leetcode-cn.com/problems/arithmetic-slices/description/ 思路:题目很冗长,实际上就是找有几个等差数列(长度大于3的).i作为序列头,从0开始到N-3遍历数组,首先找一个最短的等差序列(长度为3),找到后算出间距dist,再以j为序列尾,从i+3开始到N向后扩张,看等差序列是否还存在后续.只要找到一个间距不等于dist,表明在

POJ 3006 Dirichlet's Theorem on Arithmetic Progressions

分析: 这道题要先用筛法求出10^6以内的素数。。。。我竟然觉得数据太多没用这种方式,然后写出来的代码就运行超时了,呜呜……最后还是用的筛法 Description If a and d are relatively prime positive integers, the arithmetic sequence beginning with a and increasing b

cf——C. Arithmetic Progression

Everybody knows what an arithmetic progression is. Let us remind you just in case that an arithmetic progression is such sequence of numbers a1, a2, ..., an of length n, that the following cond

sonobe:针对IVC的fold arithmetic电路实例

1. 引言 近日,arnaucube发推宣称 在EVM链(Optimistic)上验证了首个Nova+CycleFold proof,对应开源代码实现见: https://github.com/privacy-scaling-explorations/sonobe(Rust + Solidity) sonobe为: 0xPARC和PSE团队联合开发的folding schemes库采用模块

SQL Server报错:Arithmetic overflow error converting expression to data type int.

一、问题描述 sql server(sql dw)查询一张表数据个数,使用count报错 select count(*) from test.test_t; 然后报错: SQL 错误 [8115] [S0002]: Arithmetic overflow error converting expression to data type int. 二、问题原因 数据量比较大,直

HDLbits 刷题 -- Exams/m2014 q3

Consider the function f shown in the Karnaugh map below. Implement this function. d is don't-care, which means you may choose to output whatever value is convenient. 译:考虑下面卡诺图中显示的函数f。 实现这个函数。D是