HDBits刷题2: Circuit

1.combinational logic: 组合逻辑

1.1 basic gates: 基本逻辑门

wire

解答:

module top_module (input in,output out);assign out = in;
endmodule

GND

解答:

module top_module (output out);assign out = 1'b0;
endmodule

NOR

解答:

module top_module (input in1,input in2,output out);assign out = ~(in1 | in2);
endmodule

another gate

module top_module (input in1,input in2,output out);assign out = in1 & ~in2;
endmodule

two gates

注: 有个圈的是同或门XNOR, 没有圈的是异或门XOR.

module top_module (input in1,input in2,input in3,output out);assign out = in3 ^ (~in1 ^ in2);
endmodule

more logic gates

练习: 同时创建多个逻辑门, 使用两个输入a和b构建组合逻辑电路. 一共7个输出, 每个输出用逻辑门驱动. 分别实现and/or/xor/nand/nor/xnor/anotb(最后一个为 a and-not b).

注: anotb逻辑为a & (~b). 以下是chatGPT对anotb的解释.

解答

module top_module( input a, b,output out_and,output out_or,output out_xor,output out_nand,output out_nor,output out_xnor,output out_anotb
);assign out_and = a&b;assign out_or = a|b;assign out_xor = a^b;assign out_nand = ~(a&b);assign out_nor = ~(a|b);assign out_xnor = ~a^b;assign out_anotb = a&~b;endmodule

7420 chip

module top_module ( input p1a, p1b, p1c, p1d,output p1y,input p2a, p2b, p2c, p2d,output p2y );assign p1y = ~(p1a&p1b&p1c&p1d);assign p2y = ~(p2a&p2b&p2c&p2d);
endmodule

truth tables

module top_module( input x3,input x2,input x1,  // three inputsoutput f   // one output
);assign f = (~x3&x2&~x1)|(~x3&x2&x1)|(x3&~x2&x1)|(x3&x2&x1);endmodule

two-bit equality

练习: 当A=B的时候输出z为1, 否则为0.

module top_module ( input [1:0] A, input [1:0] B, output z ); assign z = (A == B) ? 1 : 0;
endmodule

simple circuit A

module top_module (input x, input y, output z);assign z = (x^y) & x;
endmodule

simple circuit B

module top_module ( input x, input y, output z );assign z = ~x^y;
endmodule

combine circuits A and B

练习: 搭建如下电路, 子模块为前两题中的A和B.

module top_module (input x, input y, output z);wire a1o;wire b1o;wire a2o;wire b2o;A IA1(x,y,a1o);B IB1(x,y,b1o);A IA2(x,y,a2o);B IB2(x,y,b2o);assign z = (a1o|b1o)^(a2o&b2o);
endmodulemodule A (input x, input y, output z);assign z = (x^y) & x;
endmodulemodule B ( input x, input y, output z );assign z = ~x^y;
endmodule

ring or vibrate?

module top_module (input ring,input vibrate_mode,output ringer,       // Make soundoutput motor         // Vibrate
);assign ringer = (ring & ~vibrate_mode)? 1 : 0;assign motor = (ring & vibrate_mode)? 1 : 0; 
endmodule

thermostat

练习: A heating/cooling thermostat controls both a heater (during winter) and an air conditioner (during summer). Implement a circuit that will turn on and off the heater, air conditioning, and blower fan as appropriate.

The thermostat can be in one of two modes: heating (mode = 1) and cooling (mode = 0). In heating mode, turn the heater on when it is too cold (too_cold = 1) but do not use the air conditioner. In cooling mode, turn the air conditioner on when it is too hot (too_hot = 1), but do not turn on the heater. When the heater or air conditioner are on, also turn on the fan to circulate the air. In addition, the user can also request the fan to turn on (fan_on = 1), even if the heater and air conditioner are off.

Try to use only assign statements, to see whether you can translate a problem description into a collection of logic gates.

module top_module (input too_cold,input too_hot,input mode,input fan_on,output heater,output aircon,output fan
); assign fan = fan_on || (mode && too_cold) || (~mode && too_hot);assign heater = mode && too_cold;assign aircon = ~mode && too_hot;endmodule

3-bit population count

练习:A "population count" circuit counts the number of '1's in an input vector. Build a population count circuit for a 3-bit input vector.

module top_module( input [2:0] in,output [1:0] out );assign out = &in ? 3 : (^in ? 1 : (in ? 2 : 0));
//&in == 1 means in == 3'b111;
//^in == 1 means there are odd number of '1' 
//in == 0 means there is no "1"
endmodule

gates and vectors

练习:

out_both: 指示输入vector的某一bit及其左边相邻的一个bit是否均为1. 例如当in[3:2] == 2'b11时, out_both[2] == 1.

out_any:指示输入vector的某一bit及其右边相邻的一个bit中, 是否有为1的bit. 例如当in[2]和in[1] 中至少有一位为1时, out_any[2] == 1.

out_different:指示输入vector的某一bit及其左边相邻的一个bit是否相等, 规定in[3]左侧bit为in[0].

module top_module( input [3:0] in,output [2:0] out_both,output [3:1] out_any,output [3:0] out_different );//按位操作assign out_both = in[3:1] & in[2:0];assign out_any = in[3:1] | in[2:0];assign out_different = in[3:0] ^ {in[0], in[3:1]};
endmodule

even longer vectors

练习: 上一题的延伸, vector长度增加.

module top_module( input [99:0] in,output [98:0] out_both,output [99:1] out_any,output [99:0] out_different );assign out_both = in[99:1] & in[98:0];assign out_any = in[99:1] | in[98:0];assign out_different = in[99:0] ^ {in[0], in[99:1]};
endmodule

1.2 Multiplexers:复用器(数据选择器)

2-to-1 multiplexer

练习:Create a one-bit wide, 2-to-1 multiplexer. When sel=0, choose a. When sel=1, choose b.

module top_module( input a, b, sel,output out ); assign out = sel ? b : a;
endmodule

2-to-1 bus multiplexer

练习:Create a 100-bit wide, 2-to-1 multiplexer. When sel=0, choose a. When sel=1, choose b.

module top_module( input [99:0] a, b,input sel,output [99:0] out );assign out = sel ? b : a;
endmodule

9-to-1 multiplexer

练习:Create a 16-bit wide, 9-to-1 multiplexer. sel=0 chooses a, sel=1 chooses b, etc. For the unused cases (sel=9 to 15), set all output bits to '1'.

Expected solution length: Around 15 lines.

module top_module( input [15:0] a, b, c, d, e, f, g, h, i,input [3:0] sel,output [15:0] out );always @(*)begincase(sel)0: out = a;1: out = b;2: out = c;3: out = d;4: out = e;5: out = f;6: out = g;7: out = h;8: out = i;default: out = 16'hffff;endcaseend
endmodule

256-to-1 multiplexer

练习:Create a 1-bit wide, 256-to-1 multiplexer. The 256 inputs are all packed into a single 256-bit input vector. sel=0 should select in[0], sel=1 selects bits in[1], sel=2 selects bits in[2], etc.

module top_module( input [255:0] in,input [7:0] sel,output out );assign out = in[sel]; //还可以这样写???nb
endmodule

256-to-1 4-bit multiplexer

练习:Create a 4-bit wide, 256-to-1 multiplexer. The 256 4-bit inputs are all packed into a single 1024-bit input vector. sel=0 should select bits in[3:0], sel=1 selects bits in[7:4], sel=2 selects bits in[11:8], etc.

注意:代码中注释了一段会报错的写法, 报错如下:

Error (10734): Verilog HDL error at top_module.v(5): sel is not a constant File: /home/h/work/hdlbits.9892329/top_module.v Line: 5.

题目给的提示: 即①太多选择不适合用case语句; ②vector索引可以为变量,但需要综合器明白被选择的位宽是常量, 注释中的写法就不能满足该条件; ③可以用verilog-2001中的bit slicing方法来处理.

查阅到别人的三种解法, 均附在代码中.

module top_module( input [1023:0] in,input [7:0] sel,output [3:0] out );//assign out = in[4*sel+3:4*sel]; //会报错的写法, 以下是三种通过sim的写法.//assign out = in[4*sel+3 -:4]; //从4*sel+3往下的连续4bit//assign out = in[4*sel +:4]; //从4*sel往上的连续4bitassign out = {in[sel*4+3],in[sel*4+2],in[sel*4+1],in[sel*4]};
endmodule

1.3 Arithmetic Circuits

half adder

练习:Create a half adder. A half adder adds two bits (with no carry-in) and produces a sum and carry-out.

module top_module( input a, b,output cout, sum );//assign cout = a && b;//assign sum = a ^ b;assign {cout, sum} = a + b; 
endmodule

full adder

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

3-bits binary adder : 例化full_adder解决

后面简单的题就不写了, 一直搞这种题浪费时间.

signed addition overflow: 二进制补码相加的溢出检测

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

kmap3: 无关项可以考虑也可以不考虑

module top_module(input a,input b,input c,input d,output out  ); 
assign out = a | ~b&c ;
endmodule

K-map implemented with a multiplexer

实现一下电路, 输入为c和d, 输出为mux_in[3:0].

module top_module (input c,input d,output [3:0] mux_in
); always @(*)begincase({c,d})2'b00: mux_in = 4'b0100;2'b01: mux_in = 4'b0001;2'b11: mux_in = 4'b1001;2'b10: mux_in = 4'b0101;default: mux_in = 0;endcaseend
endmodule

2.Sequential Logic

2.1 latchs and flip-flops

detect an egde

只检测上升沿

module top_module (input clk,input [7:0] in,output [7:0] pedge
);reg [7:0] in_d;always @(posedge clk)begin//延一拍in_d <= in;   endwire [7:0] burst;assign burst = in & ~in_d;//上升跳变的检测: 0-1integer i;always @(posedge clk)begin//跳变来临时将输出置1, 否则输出为0for(i = 0; i<8; i++)beginif(burst[i]) pedge[i] <= 1;else pedge[i] <= 0;endendendmodule

detect both egde

检测上升沿和下降沿

module top_module (input clk,input [7:0] in,output [7:0] anyedge
);reg [7:0] in_d;always @(posedge clk)begin//延一拍in_d <= in;   endwire [7:0] burst;assign burst = (in & ~in_d) | (~in & in_d);//上升下降跳变的检测: 0-1 (异或)integer i;always @(posedge clk)begin//跳变来临时将输出置1, 否则输出为0for(i = 0; i<8; i++)beginif(burst[i]) anyedge[i] <= 1;else anyedge[i] <= 0;endend
endmodule

edge capture register

实现输入信号的下降沿检测, 检测输出保持, 除非被reset为0

moduletop_module(input clk,input reset,input [31:0] in,output [31:0] out
);reg [31:0] in_d;always @(posedge clk)begin//延一拍in_d <= in;   endwire [31:0] nburst;assign nburst = ~in & in_d;//下降跳变的检测: 0-1integer i;always @(posedge clk)begin//跳变来临时将输出置1, 否则输出为0if(reset) out <= 0;else beginfor(i = 0; i<32; i++)beginout[i] <= nburst[i] ? 1 : out[i];endendend
endmodule

dual-edge triggered flip-flop

双边沿触发器, 一开始的思路也是q1/q2分别用上升沿/下降沿触发, 但用了q = q1|q2的逻辑, 参考帖子并画图后意识到自己写的逻辑有问题. 用assign q = clk? q1:q2是对的.

module top_module (input clk,input d,output q
);reg q1,q2;always @(posedge clk)beginq1 <= d;       endalways @(negedge clk)beginq2 <= d;       endassign q = clk? q1:q2; 
endmodule

下面是大佬提供的另外一种方法, 点击跳转, 根本想不到, 学习一下

双边沿触发器的理解参考另一篇文章, 点击跳转

module top_module (input   clk,input   d,output  q
);
reg   q1,q2;
always @(posedge clk) beginq1 <= d ^ q2;
end
always @(negedge clk) beginq2 <= d ^ q1;
end
assign q = q1 ^ q2; //q = q1 ^ q2 = (d ^ q2) ^ q2 = q1 ^ (d ^ q1) = dendmodule

Counter1-12

题目什么意思没搞懂, 跳了, 解答可以参考这篇文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/26666.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

stm32f103rct6使用内部晶振作为时钟源

目录 正点原子库函数1.void SystemInit(void)2.FLASH3.宏定义4.查看5.延时6.最终结果7.精准延时尝试&#xff08;失败&#xff09; HAL库函数1 宏定义2 时钟配置3 main函数中调用4 例子代码 寄存器版本&#xff08;跑通串口&#xff09;代码示波器查看波特率 正点原子库函数 s…

Esight | 类比ChatGPT的AI助理

很多行业内的小伙伴都在使用我们的低功耗分析设备mPower1203&#xff0c;它为大家在产品功耗的分析评估和优化上提供了很大的帮助&#xff0c;也为产品的工厂自动化提供了便捷的应用。为了更好的服务于研发工程师&#xff0c;配套的上位机工具Esight集成了ChatGPT【AI助理】的功…

0101壳-手写springboot-springboot系列

文章目录 1 前言1 创建我们自己的pringboot模块1.1 引入相关依赖1.1 启动类注解1.2 启动类 2 测试模块3 启动测试结语 1 前言 springboot有以下作用&#xff1a; 简化配置&#xff1a;Spring Boot提供了一组预定义的自动配置选项&#xff0c;可以快速地配置应用程序&#xff…

网络:chrome抓包

Network面板 按F12或者CTRLSHIFTI就可以召唤出这个面板 控制器&#xff1a;控制面板的外观和功能过滤器&#xff1a;过滤请求列表中显示的资源概览&#xff1a;显示HTTP请求、响应的时间轴请求列表&#xff1a;默认按照请求的先后时间排序&#xff0c;每选择一个请求还会跳出…

用ChatGPT高效学习:7天入门Python网络爬虫

以前不懂编程&#xff0c;但经常要从互联网上批量下载一些文件图片视频、收集整理数据等&#xff0c;手工操作耗时耗力。用ChatGPT入门了Python编程后&#xff0c;就寻思着可以再利用ChatGPT入门网络爬虫。 先让ChatGPT给我列出一个学习计划&#xff1a; 我有一些Python编程基…

Oracle 发力 MySQL,MariaDB 成功上市,大规模融资锐减 | 解读数据库的 2022

又一年过去了&#xff0c;生活还在继续&#xff0c;现在是反思去年数据库世界所发生事件的绝佳时机。 链接&#xff1a;https://ottertune.com/blog/2022-databases-retrospective/ 声明&#xff1a;本文为 CSDN 翻译&#xff0c;未经允许禁止转载。 作者 | Andy Pavlo 译者 | …

【GPT-4 ChatGPT】第 2 章 :深入了解GPT-4 和 ChatGPT API

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

Python基于Oxford-IIIT Pet Dataset实现宠物识别系统

先看效果&#xff1a; Oxford-IIIT Pet Dataset是一个不错的数据集&#xff0c;牛津官方整理出来的一个关于各种猫和狗的数据集&#xff0c;可以很方便被我们用来做图像识别或者是图像分割类型的任务&#xff0c;这里我们主要是做图像识别的应用。 官方介绍如下所示&#xff1a…

Python用户管理系统,宠物管理系统

用户管理系统 surface """ #三引号是Python的注释符号&#xff0c;但也可以作为字符串输出 **************************************** 用户管理系统 **************************************** 1、注册新用户 2、用户登录 3、用户注销 4、用户信息显示 5、退…

基于涂鸦智能的宠物喂食器

基于涂鸦智能的宠物喂食器 一、开发计划二、涂鸦三明治开发套件涂鸦三明治 Wi-Fi MCU 通信板喇叭涂鸦三明治H桥直流电机驱动功能板涂鸦三明治直流供电电源板MCU主控板 三、产品开发1、产品创建进入涂鸦IoT平台创建产品选择对应的功能点和设备面板下载SDK 2、MCU SDK移植对串口寄…

宠物领养平台的分析与实现

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 文末获取源码 项目编号:BS-PT-052 运行环…

智能宠物项圈app开发解决方案

智能宠物项圈app开发解决方案&#xff0c;今天主要介绍的就是智能宠物项圈app开发方案中的功能。它的功能主要有多重定位&#xff0c;实时定位、出入范围提醒&#xff0c;踪迹随时可寻、远程呼唤、电子围栏、活动监测等&#xff0c;接下来我就来全面的介绍一下。 智能宠物项圈a…

宠物店会员管理系统| 宠物店小程序

国内养宠家庭非常多&#xff0c;推动着国内宠物市场发展&#xff0c;而围绕宠物的细分行业&#xff0c;如宠物食品、宠物用品/医疗/美容/婚介/殡葬等&#xff0c;2019年我国宠物市场规模达2024亿元&#xff0c;预计2023年&#xff0c;市场规模将突破4000亿元左右。 未来的宠物市…

智能宠物饲养系统设计

word完整版可点击如下下载>>>>>>>> 智能宠物饲养系统设计.rar-其它文档类资源-CSDN下载1、资源内容&#xff1a;毕业设计lun-wenword版10000字&#xff1b;开题报告&#xff0c;任务书2、学习目标&#xff1a;快速更多下载资源、学习资料请访问CSDN下…

宠物服务App功能简介

随着时代的变革与发展人们的生活变得越来越好&#xff0c;也变的越来越多样化。物质生活的满足后&#xff0c;人们开始找寻其他的一些兴趣爱好&#xff0c;让自己的生活变的更加多彩&#xff0c;有人种花、有人养鸟、有人养猫、有人养狗等等。不管是养什么都是需要细心照顾才能…

线上宠物领养系统

实现功能 客户端&#xff1a;客户可以查询数据库的宠物信息并根据查询的宠物信息选择自己喜欢的宠物进行领养。 服务器&#xff1a;服务器实现了对管理员相关信息的保存&#xff0c;管理员必须输入正确的用户名和密码才能对数据库信息进行增删改查等操作。服务器也可以直接对数…

软件官网页面模板

此项目由Htmlcss结构搭建而成 里面自适应移动端而做出调整 上代码: 使用了该模板的请将出处表明 项目结构 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" conte…

(学习笔记)使用CHATGPT写的前端页面模板

一、学生管理系统的登录页面 写一个好看的学生管理系统的登录页面&#xff0c;学生使用用户名和密码进行登录 <!DOCTYPE html> <html> <head><title>Student Management System - Login</title><style>body {font-family: Arial, sans-s…

如何将ChatGPT用到Facebook的文案生产中?

ChatGPT 是一款由 OpenAI 所开发的大型语言模型&#xff0c;它可以生成高质量、自然流畅的文本&#xff0c;具有很强的语言理解和生成能力。这使得它成为了一个非常有用的工具&#xff0c;可以应用于许多领域中&#xff0c;包括文案生产。 Facebook 是全球最大的社交媒体平台之…

转载。1AGI 14个关键问题

信息爆炸的 10 篇 AGI 访谈&#xff0c;我们从中整理了 14 个关键问题 原创 Founder Park Founder Park 2023-04-16 19:00 发表于北京 自从 GPT-4 发布以来&#xff0c;媒体高度关注 OpenAI 和其内外部相关人士&#xff0c;重要角色的视频、播客和文章访谈频频出现。为了节省…