Verilog刷题篇硬件工程师从0到入门1|基础语法入门
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Verilog刷题篇硬件工程师从0到入门1|基础语法入门相关的知识,希望对你有一定的参考价值。
Verilog从0到入门1
- 前言
- Q1:四选一多路器
- Q2:异步复位的串联T触发器
- Q3:移位运算与乘法
- Q4:移位运算与乘法
- Q5:位拆分与运算
- 总结:小白跟大牛都在用的好平台!
前言
- 硬件工程师近年来也开始慢慢吃香,校招进大厂年薪总包不下30-40w的人数一大把!而且大厂人数并没有饱和!
- 本期是【Verilog刷题篇】硬件工程师从0到入门1|基础语法入门,有不懂的地方可以评论进行讨论! - 推荐给大家一款刷题、面试的神器,我也是用这一款神器进行学习Verilog硬件代码的!
- 也欢迎大家去牛客查看硬件工程师招聘职位的各类资料,并进行提前批投递面试!
- 小白新手可以通过该神器进行日常的刷题、看大厂面经、学习计算机基础知识、与大牛面对面沟通~ 刷题的图片已经放在下面了~
Q1:四选一多路器
题目描述:
制作一个四选一的多路选择器,要求输出定义上为线网类型状态转换:
d0 11
d1 10
d2 01
d3 00
输入描述:输入信号 d1,d2,d3,d4 sel 类型 wire
输出描述:输出信号 mux_out 类型 wire
相关提示:
- 线网类型只能使用连续赋值语句进行赋值;
- 使用三元运算符 ?: 来实现四个信号的选择;
- 实现思路为:首先判断sel[0]的数值,再判断sel[1]的数值,即可判断出应当选择哪一个信号;
- 此外应当看清时序电路图中sel的数值和四个信号之间的对应关系,下表为该题目中对应关系。
案例代码:
`timescale 1ns/1ns
module mux4_1(
input [1:0]d1,d2,d3,d0,
input [1:0]sel,
output[1:0]mux_out
);
assign mux_out = sel[0]?(sel[1]?d0:d2):(sel[1]?d1:d3);
endmodule
Q2:异步复位的串联T触发器
题目描述:用verilog实现两个串联的异步复位的T触发器的逻辑,结构如图:
输入描述:输入信号 data, clk, rst 类型 wire 在testbench中,clk为周期5ns的时钟,rst为低电平复位
输出描述:输出信号 q 类型 reg
案例代码:
//先设计单独的t触发器,然后通过例化的方式串起来。 注意哦 output reg q 改成output wireq 。这是因为连线都要用wire 型
`timescale 1ns/1ns
module Tff_2 (
input wire data, clk, rst,
output wire q
);
//*************code***********//
wire q1;
TFF TFF_inst1(
.data (data),
.clk (clk),
.rst (rst),
.q (q1)
);
TFF TFF_inst2(
.data (q1),
.clk (clk),
.rst (rst),
.q (q)
);
//*************code***********//
endmodule
//T触发器设计
module TFF(
input wire data, clk, rst,
output reg q
);
always @(posedge clk or negedge rst)begin
if(!rst)
q <= 1b0;
else if(data == 1b0)
q <= q;
else if(data == 1b1)
q <= ~q;
end
endmodule
Q3:移位运算与乘法
题目描述:现在需要对输入的32位数据进行奇偶校验,根据sel输出检测结果
输入描述:输入信号 bus sel 类型 wire
输出描述:输出信号 check 类型 wire
案例代码:
`timescale 1ns/1ns
module odd_sel(
input [31:0] bus,
input sel,
output check
);
//*************code***********//
wire check_tmp;
// 单目运算符
assign check_tmp = ^bus;
// assign check = (sel == 1b1) ? check_tmp : ~check_tmp;
reg check_reg;
always @ (*) begin
if(sel) begin
check_reg = check_tmp;
end
else begin
check_reg = ~check_tmp;
end
end
assign check = check_reg;
//*************code***********//
endmodule
Q4:移位运算与乘法
题目描述:已知d为一个8位数,请在每个时钟周期分别输出该数乘1/3/7/8,并输出一个信号通知此时刻输入的d有效(d给出的信号的上升沿表示写入有效)
输入描述:输入信号 d, clk, rst 类型 wire 在testbench中,clk为周期5ns的时钟,rst为低电平复位
输出描述:输出信号 input_grant out 类型 reg
案例代码:
//要输出有效输入标志input_grant,考虑定义一个寄存器变量(cnt)用于计数。
//计数最大值就是乘法运算次数(四次),在一个计数周期内输入保持不变。
//当计数器为0时,input_grant=1,其余时刻保持低电平;将出入d赋值给寄存器reg_d;
//当计数器达到最大值时,计数器清零,其中计数器每次加一对应一次乘法运算。
`timescale 1ns/1ns
module vl4 (
input [7:0]d ,
input clk,
input rst,
output reg input_grant,
output reg [10:0]out
);
//*************code***********//
reg [1:0] cnt;
reg [7:0] reg_d;
//*******计数器初始化及赋值*******//
always@(posedge clk or negedge rst)
if(rst == 1b0)
cnt <= 2d0;
else if(cnt == 2d3)
cnt <= 2d0;
else
cnt <= cnt + 1b1;
//***数据寄存器(reg_d)和输入有效标志(input_grant)初始化及赋值***//
always@(posedge clk or negedge rst)
if(rst == 1b0)begin
reg_d <= 8d0;
input_grant <= 1b0;
end
else if(cnt == 2d0)begin
reg_d <= d;
input_grant <= 1b1;
end
else begin
reg_d <= reg_d;
input_grant <= 1b0;
end
//****乘法运算****//
always@(posedge clk or negedge rst)
if(rst == 1b0)
out <= 11d0;
else case (cnt)
2d0 : out <= d;
2d1 : out <= (reg_d<<2)-reg_d;
2d2 : out <= (reg_d<<3)-reg_d;
2d3 : out <= (reg_d<<3);
default : out <= 11d0;
endcase
//*************code***********//
endmodule
Q5:位拆分与运算
题目描述:
现在输入了一个压缩的16位数据,其实际上包含了四个数据[3:0] [7:4] [11:8] [15:12],
现在请按照sel选择输出四个数据的相加结果,并输出valid_out信号(在不输出时候拉低)
0: 不输出且只有此时的输入有效
1:输出[3:0]+[7:4]
2:输出[3:0]+[11:8]
3:输出[3:0]+[15:12]
输入描述:输入信号 d, clk, rst, 类型 wire,在testbench中,clk为周期5ns的时钟,rst为低电平复位
输出描述:输出信号 validout out ,类型 reg 。
案例代码:
//题中看到对于sel的不同情况,有几种不同的输出,首先考虑到用case语句。
//要注意的是,仅当sel为0时,输入信号有效,因此需要一个寄存器data_temp,在sel为0时对输入信号进行锁存。
//下一步编写代码:
//复位时,三个信号受到影响,即data_temp清零、validout清零、输出out清零;
//sel为0时,将输入的值锁存到data_temp中,同时validout拉低,输出out为0;
//sel为1时,validout拉高,同时将锁存后的data_temp按位进行输出out的运算;
//sel为2时,validout拉高,同时将锁存后的data_temp按位进行输出out的运算;
//sel为3时,validout拉高,同时将锁存后的data_temp按位进行输出out的运算。
`timescale 1ns/1ns
module data_cal(
input clk,
input rst,
input [15:0]d,
input [1:0]sel,
output reg [4:0]out,
output reg validout
);
reg [15:0]data_temp;
always@(posedge clk or negedge rst)
if(!rst)begin
out<=5d0;
validout<=1b0;
data_temp<=15d0;
end
else case(sel)
0:
begin
data_temp<=d;
out[4:0]<=5d0;
validout<=1b0;
end
1:
begin
validout<=1b1;
out[4:0]<=data_temp[3:0]+data_temp[7:4];
end
2:
begin
validout<=1b1;
out[4:0]<=data_temp[3:0]+data_temp[11:8];
end
3:
begin
validout<=1b1;
out[4:0]<=data_temp[3:0]+data_temp[15:12];
end
default:
begin
validout<=1b0;
out[4:0]<=5d0;
end
endcase
endmodule
总结:小白跟大牛都在用的好平台!
- 硬件工程师近年来也开始慢慢吃香,校招进大厂年薪总包不下30-40w的人数一大把!而且大厂人数并没有饱和!
- 本期是【Verilog刷题篇】硬件工程师从0到入门1|基础语法入门,有不懂的地方可以评论进行讨论!
另外这里不仅仅可以刷题,你想要的这里都会有,十分适合小白和初学者入门学习~
1、算法篇(398题):面试必刷100题、算法入门、面试高频榜单
2、数据结构篇(300题):都是非常经典的链表、树、堆、栈、队列、动态规划等
3、语言篇(500题):C/C++、java、python入门算法练习
4、SQL篇(82题):快速入门、SQL必知必会、SQL进阶挑战、面试真题
5、大厂笔试真题:字节跳动、美团、百度、腾讯…掌握经验不在惧怕面试!
服务器硬件工程师从入门到精通视频教程-基础篇发布了!
课程目标
了解服务器硬件的基本概念和分类方式,掌握服务器各个组成硬件的相关知识和技术,熟悉服务器硬件组装和软件安装流程,掌握常见品牌服务器主板的BIOS设置、固件更新以及板载RAID的配置方法,熟悉服务器操作系统和驱动程序的安装,掌握服务器远程管理功能的配置和使用,了解服务器硬件启动过程和常见硬件故障的排除。
适用人群
服务器硬件工程师、桌面支持工程师、系统运维工程师、系统集成工程师、网络管理员以及其它IT从业人员。
课程简介
一、为什么要制作《服务器硬件工程师从入门到精通》系列课程?
做为一名服务器硬件工程师,在刚刚接触到服务器硬件技术这块时,我自己曾经深受困扰,特别希望能够找到一套系统的服务器硬件技术指导教程,但是现实很无奈,在书店里,关于操作系统、数据库、编程语言、WEB开发、软件使用等方面的书比比皆是,却几乎找不到一本专门关于服务器硬件技术方面的书,即使偶尔能从个别书中看到一些关于服务器硬件方面的内容,也往往只是一些硬件理论上面的介绍,对人帮助不大。在网络上,情况会好一些,可以搜索到不少有关服务器硬件技术方面的内容,但是不够系统,内容比较散乱,对于内行人来说,可以根据自己的需要去选取自己所需要的内容,因为他们知道自己需要什么。但是对于想要学习服务器硬件技术的人来说,就无从下手,不知从何学起了,对此我自己深有感触, 一直希望可以制作一套系统的服务器硬件技术指导教程,既是对自己十年来学习工作经验的一个总结,也同时希望能够帮助到那些想要学习服务器硬件技术的人。
二、关于课程的规划
《服务器硬件工程师从入门到精通》系列课程分为多篇,首先会发布《基础篇》和《RAID篇》,后面会陆续推出其它篇,希望大家能够喜欢,大家的支持,是我努力的动力!
1、第一篇为《基础篇》,会详细讲解服务器硬件的基本概念和分类,服务器的硬件组成和相关技术,服务器的硬件组装和软件安装流程,服务器的BIOS设置和固件更新以及板载RAID的配置,服务器操作系统和驱动程序的安装,服务器远程管理功能配置,以及服务器硬件启动过程和常见硬件故障的排除。
2、第二篇为《RAID篇》,RAID技术是服务器硬件技术中非常重要的一块,所以拿出来单独来讲。在RAID篇中会详细讲解RAID的概念、各种RAID级别、各种板载RAID和主流厂商独立RAID卡的配置和RAID管理软件的使用,RAID驱动程序的加载和安装,以及RAID的各种注意事项。
3、后续的其它篇,会详细讲解国内外主流品牌服务器厂家的主流服务器产品,将从产品概述和性能参数、实物拆解安装、BIOS和RAID配置、操作系统和驱动程序的安装、远程管理功能使用等方面,尽可能多的实战讲解各个厂家的各种主流型号服务器。
三、怎么样学好本课程?
1、课程讲解采用“理论”+“实战”的方式,“理论”是“实战”的基础,非常的重要,但是“理论”往往又是枯燥的,希望大家能够耐下心来,把所有的课程从头到尾系统的学习完,有一些“问题”会在后面的课程中给出“答案”。“书读百遍,其义自见”,建议大家把教程多看几遍,期望只看一遍教程,就能成为高手,是不现实的。教程只是别人经验的总结,并不能代替大家的学习和积累,这一点还请大家明白!
2、无论什么教程,由于讲师对技术的理解和讲解侧重点的不同,也由于大家的基础和需求点的不同,想要做到面面俱到,实际上是很困难的,这一点也请大家理解。怎么解决这个问题呢?比较好办法就是以一套全面、系统的教程为基础,再结合其它相关的教程,相互补充,相互印证。现在网络上面的资源也非常的丰富,希望大家可以利用起来,百度一下是一个非常好的方法。
3、希望大家能从本教程,学到学习的方法,而不仅仅是教程的内容。最后提前预祝大家学习愉快,学有所得!
课程链接:服务器硬件工程师从入门到精通视频教程-基础篇
课程目录
以上是关于Verilog刷题篇硬件工程师从0到入门1|基础语法入门的主要内容,如果未能解决你的问题,请参考以下文章