查看原文
其他

秋招“笔试经”第七弹:华为硬件逻辑岗

相量子 达尔闻说 2021-01-17

不想错过我的推送,记得右上角-查看公众号-设为星标,摘下星星送给我!

目前笔试经固定在每周二更新,最近阶段集中为大家解析华为的各种题目,下周将给大家带来大华硬件岗的解析。如果大家有其他需求,可以进入秋招求职群,添加妮姐微信:459888529,注明:秋招


华为硬件逻辑岗的解析接着继续,今天让我们来看一下上次文末留下题目的解析。很多同学都说华为的题目太简单而且都是选择题不够刺激,这次我们就在本文的文末送上一道来自紫光展锐的编程题,让同学们换换口味。


11、属于组合逻辑电路的是(   )。(华为硬件逻辑实习岗)

A 全加器        B 移位寄存器 

C 计数器        D 触发器


12、在下列逻辑电路中,不是组合逻辑电路的是(   )。(华为硬件逻辑实习岗)

A 编码器         B D触发器

C 加法器         D 译码器


解析:11、12题属于同一种类型的题目,主要考察对基本时序逻辑电路和基本组合逻辑电路的了解。11题正确答案:A,12题正确答案:B。

首先我们先来看下如何用Verilog硬件描述语言来实现它们,并通过RTL视图以及波形图来看看他们的结构,来确定是组合逻辑电路还是时序逻辑电路。

全加器的Verilog代码:我们用最简单的一种方式实现全加器功能

//---------------------------------
01module   full_adder(
02 input   wire    [3:0]   in1,   //加数1
03 input   wire    [3:0]   in2,   //加数2
04 input   wire           cin,   //上一级的进位
05
06 output  wire    [3:0]   sum,   //两个数的加和
07 output  wire         cout   //加和后的进位
08);
09
10assign{cout, sum}= in1 + in2 + cin;
11
12endmodule
//---------------------------------

根据上面RTL代码综合出的RTL视图下所示:

ModelSim仿真的波形图如下所示:

点击图片可放大查看

移位寄存器的Verilog代码:常用于串-并,并-串转换

//---------------------------------
01module shift_register(
02  input   wire         sys_clk,
03  input   wire         sys_rst_n,
04  input   wire         din,
05 
06  output  reg     [3:0]   dout
07);
08
09//dout:串行输入的数据转成4bit并行后输出
10always@(posedge sys_clk ornegedge sys_rst_n)
11  if(sys_rst_n ==1'b0)
12      dout<=4'b0;
13  else   
14      dout<={din, dout[3:1]};    //右移
15
16endmodule
//---------------------------------

根据上面RTL代码综合出的RTL视图下所示:

ModelSim仿真的波形图如下所示:

点击图片可放大查看

计数器的Verilog代码:

//---------------------------------
01module   counter(
02 input   wire         sys_clk,  
03 input   wire         sys_rst_n,  
04
05 output  reg     [2:0]   cnt         
06);
07
08//cnt:计数器循环计数
09always@(posedge sys_clk ornegedge sys_rst_n)
10 if(sys_rst_n ==1'b0)
11      cnt<=3'b0;
12 else
13      cnt<= cnt +1'b1;
14     
15endmodule
//---------------------------------

根据上面RTL代码综合出的RTL视图下所示: 

ModelSim仿真的波形图如下所示:

点击图片可放大查看

触发器的Verilog代码:
//---------------------------------
01module   flip_flop(
02input   wire     sys_clk,  
03input   wire     sys_rst_n,  
04input   wire     in,  
05     
06output  reg     out    
07);
08
09//out:输入信号in经过D触发器后输出
10always@(posedge sys_clk ornegedge sys_rst_n)
11if(sys_rst_n ==1'b0)                   
12      out<=1'b0;
13else
14      out<= in;
15
16endmodule
//---------------------------------

根据上面RTL代码综合出的RTL视图下所示:

ModelSim仿真的波形图如下所示:

点击图片可放大查看

编码器的Verilog代码:

//---------------------------------
01module   incoder8_3(
02 input   wire[7:0]   in,  
03
04 output  reg [2:0]   out
05);
06 
07//out:根据8bit输入信号选择对应的3bit输出信号
08always@(*)
09 case(in)            
10      8'b0000_0001: out =3'b000;     
11      8'b0000_0010: out =3'b001;
12      8'b0000_0100: out =3'b010;
13      8'b0000_1000: out =3'b011;
14      8'b0001_0000: out =3'b100;
15      8'b0010_0000: out =3'b101;
16      8'b0100_0000: out =3'b110;
17      8'b1000_0000: out =3'b111;
18      default      : out =3'b000;    
19 endcase                                    
20
21endmodule
//---------------------------------

根据上面RTL代码综合出的RTL视图下所示:

ModelSim仿真的波形图如下所示:

点击图片可放大查看

译码器的Verilog代码:

//---------------------------------
01module   decoder3_8(
02 input   wire[2:0]  in,      
03
04 output  reg [7:0]   out    
05);
06 
07//out:根据3bit输入信号选择对应的8bit输出信号
08always@(*)
09 case(in)            
10      3'b000: out =8'b0000_0001;     
11      3'b001: out =8'b0000_0010;
12      3'b010: out =8'b0000_0100;
13      3'b011: out =8'b0000_1000;
14      3'b100: out =8'b0001_0000;
15      3'b101: out =8'b0010_0000;
16      3'b110: out =8'b0100_0000;
17      3'b111: out =8'b1000_0000;
18      default: out =8'b0000_0001;    
19 endcase                                    
20
21endmodule
//---------------------------------

根据上面RTL代码综合出的RTL视图下所示: 

ModelSim仿真的波形图如下所示:

点击图片可放大查看

我们通过把上面几个选项中的逻辑电路都用Verilog代码实现后,可以发现时序逻辑电路都会有时钟的输入,而在RTL视图中可以看到时序电路都生成了寄存器,而组合逻辑电路没有生成寄存器。希望大家可以通过Verilog代码、RTL视图和仿真的波形图更深入的理解硬件描述语言在数字电路设计中的优势以及和软件语言的不同。


13、双向数据总线常采用(   )构成。(华为硬件逻辑实习岗)

A 全加器          B 三态门

C 译码器          D 数据分配器 

解析:考察对基本总线的了解。

在双向数据总线中常采用三态门构成,因为器件免不了要进行输入输出数据,常规的输入和输出是分开的两个接口要不停的切换比较麻烦,这样优点是只要一个接口就可以输入输出比较节约逻辑资源,但缺点是三态门的处理没有常规两个I/O的方便,这里我们来看看怎样使用三态门,下图是三态门的结构。

当sda_en为高时,SDA作为输出口输出sda_out的数据;当sda_en为低时三态门是处于高阻态,这时SDA作为输入口把数据给sda_in。

全加器和译码器上面已经解释过,这里不再重复。我们简单说下数据分配器。上面的例子我们可以发现数据编码器和数据译码器实现的功能刚好是相反的,同样数据选择器和数据分配器也是这样的一对。数据选择器用于从多个输入数据中选择一个输出;而数据分配器则是将多个输入端输出到指定的输出端。

综上所述,本题正确答案为:B。


14、信号A、B均是4bit输入,C = A+B,请问信号C应该定义(   )bit。(华为硬件逻辑实习岗)

A 4           B 5

C 6           D 3 

解析:考察对基本数字电路中加法器的了解。

根据上面加法器的例子,我们可以看出两个数相加求和后的总位宽为其中加数最大的位宽再加1。两个加数的位宽分别为m和n,其相加后的总位宽可以表示为:[max(m , n) + 1],也有一些题目是让求多个数相加总位宽需要多少,我们同样可以转化为两个数求总位宽的问题。

还有些题目会考察两个相乘后的积的总位宽,其总位宽为两个数位宽之和。两个乘数的位宽分别为m和n,其相乘后的总位宽可以表示为:m+n。

本题正确答案为:B。


大家可以提前做一下下面的编程题,看看是否能够全部拿到这10分(相当于5道选择题的分值哦)。下一期我们将对这道编程题进行详细的解析,敬请期待,会做的小伙伴可以留言回复答案…… 

请用Verilog RTL描述如下图设计:以clk为基准,设计一个秒计数器,在指定的计数值产生中断,实时输出当前的秒数计数值。(紫光展锐数字IC岗)

<1> clk是时钟输入,频率为32.768KHz。

<2> rst_n是异步复位输入,低电平有效,复位整个系统,为高则整个系统开始工作,其上升沿已经同步于clk。

<3> start是启动信号,一个clk时钟周期的正脉冲,同步于clk。alarm[7:0]是配置信息,单位为秒,同步于clk。

<4> 工作模式:收到start后,秒计数器sec_cnt从零开始以秒为单位来记述,计数到alarm[7:0]指定的数值时,产生一个int pluse(时钟周期的正脉冲),秒数计数器回零并停止。

END

目前,我们安排的是每周二更新笔试经系列,计划涵盖的公司包含:华为,京东,大疆,商汤,中兴,CVTE,AMD,海康威视,黑金,汇顶等。(会陆续补充)

关于更新时间:每周二,如果同学们诉求高,很希望看到更多的分享,我们可以加番。
达尔闻 秋招“笔试经”系列:

第一弹:华为硬件逻辑岗

第二弹:海康威视硬件岗

第三弹:华为硬件逻辑岗

第四弹:华为硬件逻辑岗&通用硬件岗

第五弹:华为硬件逻辑岗&硬件通用岗

第六弹:华为硬件逻辑岗

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存