数字IC手撕代码-乐鑫科技笔试真题(4倍频)

 前言:

        本专栏旨在记录高频笔面试手撕代码题,以备数字前端秋招,本专栏所有文章提供原理分析、代码及波形,所有代码均经过本人验证。

目录如下:

1.数字IC手撕代码-分频器(任意偶数分频)

2.数字IC手撕代码-分频器(任意奇数分频)

3.数字IC手撕代码-分频器(任意小数分频)

4.数字IC手撕代码-异步复位同步释放

5.数字IC手撕代码-边沿检测(上升沿、下降沿、双边沿)

6.数字IC手撕代码-序列检测(状态机写法)

7.数字IC手撕代码-序列检测(移位寄存器写法)

8.数字IC手撕代码-半加器、全加器

9.数字IC手撕代码-串转并、并转串

10.数字IC手撕代码-数据位宽转换器(宽-窄,窄-宽转换)

11.数字IC手撕代码-有限状态机FSM-饮料机

12.数字IC手撕代码-握手信号(READY-VALID)

13.数字IC手撕代码-流水握手(利用握手解决流水线断流、反压问题)

14.数字IC手撕代码-泰凌微笔试真题

15.数字IC手撕代码-平头哥技术终面手撕真题

16.数字IC手撕代码-兆易创新笔试真题

17.数字IC手撕代码-乐鑫科技笔试真题(4倍频)

18.数字IC手撕代码-双端口RAM(dual-port-RAM)

        ...持续更新

 更多手撕代码题可以前往 数字IC手撕代码--题库


目录

题目描述

解决思路

二倍频

代码

波形

实现原理

四倍频

代码

testbench

波形


题目描述

        乐鑫科技考了好几次四倍频了,输入一个clk,要求输出一个clk_out,满足clk_out的频率是clk的四倍。

解决思路

        要注意的是,这里实现的是倍频,而不是分频,如果是分频的话很好实现,在笔者前期文章中对任意奇数分频、偶数分频、小数分频都做了具体介绍,但这里的倍频实现起来则需要一些不同于分频的技巧。

        这里实现的技巧就是利用组合逻辑的延时来实现倍频。 


二倍频

        在实现四倍频之前,我们先来实现二倍频。利用一小段组合逻辑clk_out = Q^clk来做延迟,然后Q的改变通过检测clk_out的上升沿来实现。实现代码如下:

代码

module double_f(
    input   clk     ,
    input   rstn    ,
    output  clk_out
);

reg Q;
reg [4:0] count;
always @(posedge clk_out or negedge rstn)begin
    if(!rstn)begin
        Q <= 0;
        count <= 1'd0;
    end
    else begin
        Q <= ~Q;
        count <= count + 1'b1;
    end
end

assign clk_out = Q ^ clk;

endmodule

波形

        通过计数器count可以看见,计数器每在clk_out的上升沿,计数器加1,从波形中我们可以看到计数器在每个clk的周期里,都加了两次1,也就是说clk_out的频率是clk频率的两倍,由此我们就实现了二倍频,只不过是占空比极小的二倍频。

实现原理

        初始化Q为0,在clk为低时, Q=0,clk=0所以,clk_out=Q^clk=0。在clk上升沿到来的瞬间,clk=1,Q=0,所以得到clk_out=Q^clk=1。从而clk_out的时钟上升沿到来,clk_out的时钟上升沿到来后,触发always语句块后的敏感事件列表,使得Q = ~Q;所以Q=1。右因为Q =1,clk=1,所以clk_out = Q ^clk=0,相当于产生了一个极小的脉冲。

        打开modelsim中仿真时间片的模式后,可以看见,clk上升沿时刻的数据变化和我们所描述分析的一致。下降沿同理。 


四倍频

        在理解了二倍频的实现原理(利用组合逻辑延时,配合always敏感事件列表创造极短脉冲)后,四倍频的实现也是同样的道理。

        只不过再二倍频的基础上, 再次二倍时,使用的参考时钟为第一次二倍频得到的时钟,譬如第一次二倍频产生的二倍时钟令其为clk_out_temp1,那么第二次做二倍频的时候,以clk_out_temp1为参考时钟,令clk_out_temp2 = Q1 ^ clk_out_temp1; 

代码

module four_f(
input clk     ,
input rstn    ,
output clk_out 
);

wire clk_out_temp1,clk_out_temp2;
reg Q,Q1;
reg [4:0] count;
always@(posedge clk_out_temp1 or negedge rstn)begin
  if(!rstn)begin
    Q <= 0;
  end 
  else begin
    Q <= ~Q;
  end
end

assign clk_out_temp1 = Q^clk;

always@(posedge clk_out_temp2 or negedge rstn)begin
  if(!rstn)begin
    Q1 <= 0;
  end 
  else begin
    Q1 <= ~Q1;
  end
end

assign clk_out_temp2 = Q1^clk_out_temp1;
assign clk_out = clk_out_temp1 ^ clk_out_temp2;

always @(posedge clk_out or negedge rstn)begin
  if(!rstn)begin
    count <= 1'd0;
  end
  else begin
    count <= count + 1'b1;
  end
end

endmodule



testbench

module test_four();

reg rstn,clk;
wire clk_out;

initial begin
  rstn  <= 1;
  clk   <= 0;
  #5
  rstn  <= 0;
  #20
  rstn  <= 1;
end    
  
always #5 clk = ~clk;

four_f u_four_f(
.clk    (clk)     ,
.rstn   (rstn)    ,
.clk_out(clk_out) 
);
 
endmodule

波形

        如何判断我们代码是否实现了二倍频呢?利用一个计数器,每在最终生成的clk_out时钟上升沿来进行计数器加1。 

always @(posedge clk_out or negedge rstn)begin
  if(!rstn)begin
    count <= 1'd0;
  end
  else begin
    count <= count + 1'b1;
  end
end

        从波形图可以看到,每一个clk时钟周期里,count计数器都加了4,也就是经历了4个clk_out的时钟上升沿,也即,每一个clk周期,对应四个clk_out周期,也就是实现了我们所说的时钟四倍频,只不过四倍频得到的时钟的占空比非常小(波形图上展示为尖峰脉冲)。


 更多手撕代码题可以前往 数字IC手撕代码--题库

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
乐鑫科技是一家专注于物联网芯片和解决方案的公司,它在C语言方面开展了一场笔试。C语言是一种广泛使用的、通用的高级编程语言,它为开发者提供了底层控制硬件的能力。 在乐鑫科技的C语言笔试中,可能会包含以下内容:基本语法、数据类型、运算符、控制结构、函数、数组、指针、结构体等。基本语法是最基础的部分,包括如何定义变量、如何使用注释、如何编写函数等。数据类型是C语言中的基本类型,包括整型、浮点型、字符型等,掌握不同数据类型的使用规则至关重要。运算符包括赋值运算符、算术运算符、关系运算符等,它们用于对数据进行操作和比较。控制结构包括条件语句(如if语句)和循环语句(如for循环),它们可以根据条件控制程序的执行流程。函数是C语言中的一个重要概念,它用于封装独立的功能模块,提高代码的可读性和重用性。数组是一组具有相同数据类型的元素的集合,指针则提供了直接访问内存地址的能力,结构体则用于组合多个不同类型的数据。 通过乐鑫科技的C语言笔试,考察者将能够了解到考生对C语言的掌握程度和编程能力。C语言是一门重要的编程语言,在物联网行业尤为重要,因此掌握C语言的基本知识和技能对于乐鑫科技的求职者来说是非常有帮助的。希望通过这场笔试,考生们能够展示出自己的才华和能力,为进一步的面试和招聘机会铺平道路。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不吃葱的酸菜鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值