2021大华笔试

tech2025-04-22  9

笔试没有监控,让我误以为是测评。。。

1、关于Verilog说法错误的是 B

always模块内部被赋值的信号必须是reg

generate描述的语句不可以被综合

reg型定义的信号不一定都被综合成触发器

当对不同时钟域之间设置false path,工具忽略对该时钟之间的路径进行分析

2、关于综合描述错误的是 D

综合就是把抽象设计中的一种表示转换成另一种表示的过程

综合就是将电路的高级语言转换成低级的,可与FPGA/CPLD相映射的功能网表文件

为实现系统的速度、面积、性能的要求,需要对综合加以约束,成为综合约束

综合可以理解为一种映射过程,并且这种映射关系是唯一的, 即综合结果是唯一的。

3. 下列方法中不能消除竞争冒险现象的是 D

接入滤波电容

修改逻辑设计

引入选通脉冲

使用组合逻辑

4、C语言代码题

5、如果对键盘上108个符号进行二进制编码,则至少需要几位二进制数码 A

7

6

5

4

6、请问{1,1}与下面哪个值相等 B

11

2'b11

64'h0000000100000001

64'h0000000000000003

7、C语言代码题

8、下列等式不正确的是

A'B+AB' = (A'+B')(A+B)

AB'+BC'+B'C+A'B=AB'+BC+A'C

A'B'C'+A'BC+ABC'+ABC=A'B'C'+BC+AC+AB

((A+B')+(A'+C'))AC+BC=B'+C'

9、FPGA基于(SRAM)结构实现,因此每次上电后必须进行一次配置

10、在下列程序中initial块执行完成后,A,B值分别为(31)(2)

reg [4:0] A; reg [2:0] B; initial begin A = 0; A = A-1; B = A; B= B + 3; end

11、带符号的6比特数据,赋值范围由(-32~31)

有符号数的取值范围为:-2^(n-1) ~ 2^(n-1)-1 (其中n为数据位数),当n=8时,数据取值范围:-128 ~ 127

正数的原码,反码,补码都相同,

数值原码反码补码符号位00000 00000000 00000000 0000010000 00010000 00010000 00010............01270111 11110111 11110111 11110

负数的原码,反码和补码不同,转化原理为:原码-------位取反(符号位不变)------->反码-------------+1----------->补码

数值原码反码补码符号位-11000 00011111 11101111 11111-21000 00101111 11011111 11101............1-1271111 11101000 00011000 00101-1281111 11111000 00001000 00011

12、触发器的时钟信号上升沿到来以前,其数据输入端的数据必须保持不变的时间叫做(建立时间)

13、逻辑门的输入端A、B和输出端F的波形如下图所示,其逻辑门表达式依次为_A__ 和_A'B'+AB__

14、将8进制数字17.24转换成2进制是()

1111.0101

15、假设两个异步时钟clk_a和clk_b,clk_a= 148.5M,clk_b=145M。如图,cIk_ b时钟域中一个8bit数据data通过data_valid标记有效,持续有效约8个时钟周期,该时间内数据保存稳定且不会变化,每40ms更新一次。 要求将clk_b时钟域该数据信号同步到clk_a时钟域,data_valid在clk_a时钟域持续1个时钟周期,请用你熟悉的hdl语言描述。设计中请用异步低复位。

参考链接:https://zhuanlan.zhihu.com/p/144888852

module AsynchronousClock( clk_a, clk_b, rst, data_valid, data, data_a, data_valid_a_rise ); input clk_a; input clk_b; input rst; input data_valid; input [7:0] data; output reg [7:0] data_a; reg rst_1; reg rst_n; always @(posedge clk_a or posedge rst) begin if (rst) begin // reset rst_1 <= 0; rst_n <= 0; end else begin rst_1 <= 1; rst_n <= rst_1; end end /*************跨时钟采样边沿**************/ reg [3:0] data_valid_a; output wire data_valid_a_rise; always @(posedge clk_a or negedge rst_n) begin if (!rst_n) begin // reset data_valid_a <= 4'd0; end else begin data_valid_a <= {data_valid_a[2:0],data_valid}; end end assign data_valid_a_rise = data_valid_a[2]&(~data_valid_a[3]); always @(posedge clk_a or negedge rst_n) begin if (!rst_n) begin // reset data_a <= 8'd0; end else begin data_a <= data_valid_a_rise? data : data_a; end end endmodule

 Teatbench测试代码:时间和题目对应不上,clk_a为快时钟,clk_b为慢时钟

`timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2020/09/08 09:06:07 // Design Name: // Module Name: AsynchronousClock_tb // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // // module AsynchronousClock_tb( ); reg clk_a; reg clk_b; reg rst; reg data_valid; reg [7:0] data; wire [7:0] data_a; wire data_valid_a_rise; AsynchronousClock AsynchronousClock( .clk_a(clk_a), .clk_b(clk_b), .rst(rst), .data_valid(data_valid), .data(data), .data_a(data_a), .data_valid_a_rise(data_valid_a_rise) ); always #5 clk_a = ~clk_a; always #6 clk_b = ~clk_b; initial begin clk_a = 1; clk_b = 1; rst = 0; data_valid = 0; #30 rst = 1; #30 rst = 0; data = 8'd1; #30 data_valid = 1; data = 8'd1; #30 data_valid = 0; #30 data_valid = 1; data = 8'd2; #30 data_valid = 0; #30 data_valid = 1; data = 8'd3; #30 data_valid = 0; #30 data_valid = 1; data = 8'd4; #30 data_valid = 0; end endmodule

16、请用D触发器实现个9分频的电路,设计中请用同步高复位。

(1)画出电路图

(2)用HDL语言描述

(1)

(2)

/*****9分频****/ module Div( clk, rst, div, outclk ); input clk; input rst; input [3:0] div; output outclk; /*******计数*******/ reg [3:0] count; always @(posedge clk) begin if (rst) begin // reset count <= 0; end else begin count <= (count > 7)?0:(count + 1); end end /*******分频*******/ reg clk_reg; always @(posedge clk) begin if (rst) begin // reset clk_reg <= 0; end else begin clk_reg <= ((count == 0)||(count == 4))?~clk_reg:clk_reg; endcase end end /*******下降沿采样*******/ reg clk_reg_r; always @(negedge clk) begin if (rst) begin // reset clk_reg_r <= 0; end else begin clk_reg_r <= clk_reg; end end assign outclk = (clk_reg||clk_reg_r); endmodule

17、对于同步fifo,已知写入侧每100个时钟最多写入60个数据,读出侧每4个时钟读出3个数据,fifo的深度至少为多少?

参考链接:https://blog.csdn.net/persistlzy/article/details/108393561

上面链接的场景9:

“背靠背”情况,此时最恶劣的情况是第一次100个写周期内后60个周期连续写入60个数据和第二次100个写周期内前60个周期连续写入60个数据,如下图所示。故上述最恶劣情况下的连续写入120个数据后FIFO内缓存数据最多。计算此时写入数据-该阶段读出数据即为FIFO的最小深度。

背靠背写入数据的时间为:t = 120T;

在此期间读取数据的个数:Nrd = 120T/4T*3 = 90;

所以用写入的数据减去读取的个数就为FIFO的深度:120 - 90 = 30

最新回复(0)