2021届联发科数字IC----提前批

笔试体验极差极差!!!!!!

1、在这里插入图片描述
这个题使用的是卡诺图。在这里插入图片描述

2、在这里插入图片描述
这个题最开始想的是用双目表达式写的。
Y = [A ? 0 : (C ? 0 : 1)] : 1 ? B
但是做到这步了,不知道怎么继续了。就换成下面这个了,对前面的两个选择器加上一个中间信号。在这里插入图片描述
3、在这里插入图片描述
在这里插入图片描述在这里插入图片描述这个题主要考的是无毛刺时钟切换电路。
图中的DFF1和DFF3是不能去除的,这是为了为了同步信号。针对两个异步时钟源产生的反馈信号以及异步信号SELECT,对选择信号进行同步处理,这样即使是两个异步的时钟源进行切换,也可以避免亚稳态的产生。
在时钟的下降沿寄存选择信号(SELECT)可确保在任一时钟处于高电平时输出端不会发生变化,从而防止斩波输出时钟(意思是下降沿寄存,可以保证下降沿到来之前输出端保持不变,这样就不会斩断当前时钟了)。 从一个时钟的选择到另一个时钟的反馈使开关能够在开始传播下一个时钟之前等待取消选择当前时钟,从而避免任何毛刺(意思是即使当前SELECT突然变化了,也必须等待到当前时钟的下降沿到来才能去使当前时钟无效,这一段时间就避免了毛刺
在这里插入图片描述
这个题的画图思路应该是在B那里开始画,然后回到A
4、请说明IC前端整合(RTL to Netlist)所包含的流程,并简要说明一下Synthesis的主要任务,以及Synthesis的输入和输出。
(1)规格制定
(2)设计方案
(3)RTL代码
(4)功能验证
(5)逻辑综合
(6)STA
(7)形式验证

5、有两个空水壶,分别为5升和6升,请用两种方法得到3升的水。
方法(一):
(1)将5升的桶加满,倒入6升的空桶,此时6升还有1升的空间可以装水
(2)再将5升的桶加满,倒入6升的桶(1升的空间),此时5升的水还剩下4升,6升的桶满了
(3)将6升的水倒空,将5升桶里的水(4升)倒入6升的桶,此时6升的桶还剩下2升的空间
(4)将5升的桶装满水,倒入6升的桶(2升的空间),此时6升的水桶满了,5升的水桶,还剩下3升的水。

方法(二):
(1)将6升的桶装满水倒入5升的桶,此时6升的桶剩下1升的水
(2)将6升水桶中的水(1升的水)倒入5升的桶,此时5升的水桶有1升的水
(3)将6升桶加满水,倒入5升的水桶(有4升的空间),此时5升的水桶满了,6升的水桶还剩下2升的水
(4)将6升水桶的水(2升水)倒入5升的水桶,此时5升的水桶(有2升的水)
(5)将6升的水桶打满水,倒入5升的水桶(3升的空间),此时5升的水桶满了,6升的水桶剩下3升的水。

6、描述一下在学校所完成的主要项目的架构,并着重说明自己所完成部分的收获是什么?
随便说了

7、下面有4个人的名字分别是Li Fei、Liu Qiang、Zhang Ming、Tian Hua。写一个Perl程序,做到输入他们的姓,就能告诉这个人的名。
感觉这就是正则匹配,但是不会用Perl语言,进行正则匹配。网传的答案。在这里插入图片描述

9、有一套四位数加密系统,输入4位数以后会自动加密,加密规则如下:每位数字都加上5,然后用和除以10的余数,代替该数字,分别再将第一位和第四位进行交换,第二位和第三位进行交换。用C语言,写出此加密算法。

#include <stdio.h>
#include <math.h>
void main()
{
	int output;
	int input;
	int a;
	int b;
	int input_0;
	int input_1;
	int input_2;
	int input_3;
	printf("请输入4位数");
	scanf("%d \n",input);
	input_0 = input % 10;//求个位
	input_1 = input/10 %10;//求十位
	input_2 = input/100 %10;  //求百位
	input_3 = input/1000;   //是求千位数
	
	input_0 = (input_0 + 5) % 10;
	input_1 = (input_1 + 5) % 10;
	input_2 = (input_2 + 5) % 10;
	input_3 = (input_3 + 5) % 10;
	a = input_0;
	input_0 = input_3;
	input_3 = a;

	b = input_1;
	input_1 = input_2;
	input_2 = b;

	output = input_3 x 1000 + input_2 x 100 + input_1 x 10 + input_0;
	printf("输出后为:%d",output);
	
} 

8、用verilog实现以下逻辑,Interface signal如下:
input clk_ck
input rst_b
input req_in
output req_in_ack
input [31:0] data_in
output data_out_vld;
output [31:0] data_out
模块需求如下:模块名filter_data_store
当req_in和req_in_ack都为高时,说明本模块有能力接收data_in
当在data_in中找到数据32’ha1b9_0000,特殊字符前面的数据全部丢弃,特殊字符后面的数据全部保存到一个深度为4的sync_fifo中
当fifo为非空的时候,将数据读出到data_out上,data_out_vld指示数据的有效性。

这个题,主要考察的就是一个同步FIFO,req_in_ack这个信号刚开始半天想不出来怎么去产生,后来经过群里大佬指点觉得很有道理(这个应该是FIFO的非满信号)

module filter_data_store(
	input clk_ck,
	input rst_b,
	input req_in,
	input [31:0] data_in,
	output req_in_ack,
	output [31:0] data_out,
	output reg data_out_vld
);
reg [31:0] ram [3:0]; 
reg full_in;
reg [1:0] rp;
reg empty_in;
//当req_in和req_in_ack都有效时,产生一个标志信号
reg data_in_vld;
always @ (posedge clk_ck or negedge rst_b) begin
	if(!rst_b) begin
		data_in_vld <= 1'b0;
	end
	else if(req_in & req_in_ack) begin
		data_in_vld <= 1'b1;
	end
	else begin
		data_in_vld <= 1'b0;
	end
end

//产生一个FIFO的写使能
reg wr_en;
always @ (posedge clk_ck or negedge rst_b) begin
	if(!rst_b) begin
		wr_en <= 1'b0;
	end
	else if(data_in_vld) begin
		if(data_in==32'ha1b9_0000)
			wr_en <= 1'b1;
	end
	else begin
		wr_en <= 1'b0;
	end
end

//产生写地址
reg [1:0] wp;
always @ (posedge clk_ck or negedge rst_b) begin
	if(!rst_b) begin
		wp <= 2'b0;
	end
	else if(wr_en && ~full_in) begin
		wp <= wp + 1'b1;
	end
end
//写入数据
always @ (posedge clk_ck or negedge rst_b) begin
	if(!rst_b) begin
		ram[wp] <= 32'b0;
	end
	else if(wr_en && ~full_in) begin
		ram[wp] <= data_in;
	end
end
//产生写满信号
always @ (posedge clk_ck or negedge rst_b) begin
	if(!rst_b) begin
		full_in <= 1'b0;
	end
	else if((~rd && wr_en) && ((wp==rp-1)|(rp==2'd0 && wp==2'd3)) begin
		full_in <= 1'b1;
	end
	else if(full_in && rd) begin
		full_in <= 1'b0;
	end
end

//产生读地址
//data_out_vld
//读使能信号就是没有读空
always @ (posedge clk_ck or negedge rst_n) begin
	if(!rst_b) begin
		rp <= 2'd0;
		data_out_vld <= 1'b0;
	end
	else if(~empty_in) begin
		rp <= rp + 1'b1;
		data_out_vld <= 1'b1;
	end 
	else begin
		data_out_vld <= 1'b0;
	end
end

assign data_out = ram[rp];
//产生读空信号
always @ (posedge clk_ck or negedge rst_b) begin
	if(!rst_b) begin
		empty_in <= 1'b0;
	end
	else if((rp==wp-1 || (rp==2'd3 && wp==2'd0))&&(~wr_en && (~empty_in))) begin
		empty_in <= 1'b1;
	end
	else if(empty_in && wr_en) begin
		empty_in <= 1'b0;
	end
end

//产生req_in_ack
assign req_in_ack = full_in ? 1'b0 : 1'b1;
endmodule

这个代码没有仿真验证

有什么问题,请随时指出来,方便修改!!!!

猜你喜欢

转载自blog.csdn.net/weixin_43727437/article/details/107417415