FPGA笔试题解析(五):串并转换与奇分频电路

举报
李锐博恩 发表于 2021/07/15 02:55:01 2021/07/15
【摘要】 题目:使用状态机实现序列检测器? 序列检测器的状态机实现,以前的博文写的很多,这里贴出两个简单易懂的,看需要的部分即可: 序列检测器的Moore状态机实现 序列检测器的Mealy状态机实现 题目:用Verilog设计串专并电路? 在下面这篇博文中,包含串转并以及并转串的思路:移位寄存器专题 1. module left_shifter_reg(clk, din,...

题目:使用状态机实现序列检测器?

序列检测器的状态机实现,以前的博文写的很多,这里贴出两个简单易懂的,看需要的部分即可:

序列检测器的Moore状态机实现

序列检测器的Mealy状态机实现


题目:用Verilog设计串专并电路?

在下面这篇博文中,包含串转并以及并转串的思路:移位寄存器专题


  
  1. 1. module left_shifter_reg(clk, din, dout);
  2. 2. input clk;
  3. 3. input din;
  4. 4. output [7:0] dout;
  5. 5. wire [7:0] dout;
  6. 6. reg [7:0] qtemp;
  7. 7. always @ (posedge clk)
  8. 8. begin
  9. 9. qtemp <= {qtemp[6:0], din}; //每次输入一位
  10. 10. end
  11. 11. assign dout = qtemp; //并行输出
  12. 12.
  13. 13. endmodule

并转串


  
  1. 1. module right_shifter_reg(clk, en, din, dout);
  2. 2. input [7:0] din;
  3. 3. input en,clk;
  4. 4. output dout;
  5. 5. reg dout;
  6. 6. reg [7:0] qtemp;
  7. 7. always @(posedge clk)
  8. 8. begin
  9. 9. if(en == 1)
  10. 10. qtemp <= din;
  11. 11. else
  12. 12. begin
  13. 13. dout <= qtemp[0];
  14. 14. qtemp <= {qtemp[0], qtemp[7:1]};
  15. 15. end
  16. 16. end
  17. 17.
  18. 18. endmodule

题目:设计分频电路?

二分频:https://blog.csdn.net/Reborn_Lee/article/details/85254025


  
  1. module clkdiv2(
  2. input ClkIn,
  3. input rst,
  4. output ClkOut
  5. );
  6. reg ClkOut;
  7. always@(posedge ClkIn)
  8. begin
  9. if(rst) ClkOut = 1'b0;
  10. else ClkOut = ~ClkOut;
  11. end
  12. endmodule

奇偶分频:https://blog.csdn.net/Reborn_Lee/article/details/81298123

先看简单的偶分频电路设计,以10分频为例,意思就是频率降低10倍,那么周期就增大10倍,这样我只需要在原来时钟五倍周期时候翻转一次即可实现10分频电路,这是思路,具体实现时,我们使用计数器来完成10分频电路,计数器的初值为0,每到一个时钟上升沿计数一次并判断是否计数达到要求。

那么计数要求是多少呢?

当然是4,当计数器计数到4,也就是第4个上升沿到来时,要等到下一个上升沿到来判断计数是否到4,同时翻转时钟,这就达到了目的,具体代码移植以前的博文:


  
  1. //偶分频电路的Verilog HDL设计(10分频为例)
  2. module even_freq_div(clk, rst, clk_div10,cnt);
  3. input clk;
  4. input rst;
  5. output clk_div10;
  6. reg clk_div10;
  7. output [2:0] cnt; //输出cnt的原因是为了看到计数次数,便于分析仿真结果。
  8. reg [2:0] cnt;
  9. always @(posedge clk)
  10. begin
  11. if(rst) //复位信号有效;
  12. begin
  13. cnt <= 0; //计数器清零
  14. clk_div10 <= 0; //输出清零;
  15. end
  16. else //复位信号无效;
  17. begin
  18. if(cnt == 4) //每一次时钟上升沿到来时,都检查一次计数值是否达到4;
  19. begin
  20. clk_div10 <= ~clk_div10;
  21. cnt <= 0; //计数器计数到4后,重新清零;计数值为4意味着已经计了5个周期,这时10分频时钟翻转一次;
  22. end
  23. else //如果计数器未计数到4,则来一个上升沿加1,同时分频时钟继续保持原值不变。
  24. begin
  25. cnt <= cnt + 1;
  26. clk_div10 <= clk_div10; //否则继续保持;
  27. end
  28. end
  29. end
  30. endmodule

功能仿真:

可以数数看,恰好是十分频。

接着看奇分频,且为占空比为50%的奇分频电路,以5分频为例:

表面上说,应该对被分频时钟计数2.5个时钟周期翻转一次,但如何计数2.5个周期是一个问题,有人可能会说,上升沿下降沿同时计数,想法很丰满,同样的反面教材:


  
  1. //奇分频电路的Verilog HDL设计(5分频为例)
  2. module odd_freq_div(clk, rst, clk_div, cnt);
  3. input clk;
  4. input rst;
  5. output clk_div;
  6. reg clk_div;
  7. output [2:0] cnt; //输出cnt的原因是为了看到计数次数,便于分析仿真结果。
  8. reg [2:0] cnt;
  9. wire clk1;
  10. assign clk1 = ~clk; //相位与clk相差180°;
  11. always @(posedge clk or posedge clk1)
  12. begin
  13. if(rst) //复位信号有效;
  14. begin
  15. cnt <= 0; //计数器清零
  16. clk_div <= 0; //输出清零;
  17. end
  18. else //复位信号无效;
  19. begin
  20. if(cnt == 4) //每一次时钟上升沿到来时,都检查一次计数值是否达到4;
  21. begin
  22. clk_div <= ~clk_div;
  23. cnt <= 0; //计数器计数到4后,重新清零;
  24. end
  25. else //如果计数器未计数到4,则来一个上升沿加1,同时分频时钟继续保持原值不变。
  26. begin
  27. cnt <= cnt + 1;
  28. clk_div <= clk_div; //否则继续保持;
  29. end
  30. end
  31. end
  32. endmodule

功能仿真图:

至于其他幺蛾子,见原博文:https://blog.csdn.net/Reborn_Lee/article/details/81298123#%E5%89%8D%E8%A8%80%EF%BC%9A

正确的分频电路见链接:【FPGA】分频电路设计(Verilog HDL设计)


  
  1. `timescale 1ns / 1ps
  2. //
  3. // Company:
  4. // Engineer: CSDN 李锐博恩
  5. //
  6. // Create Date: 2019/07/28 15:15:27
  7. // Design Name:
  8. // Module Name: FRE_DIV5
  9. //
  10. module FRE_DIV5(
  11. input clk,
  12. input rst_n,
  13. output clk_div5
  14. );
  15. reg [2:0] div_cnt;
  16. always@(posedge clk or negedge rst_n) begin
  17. if(~rst_n) begin
  18. div_cnt <= 0;
  19. end
  20. else if(div_cnt <4) begin
  21. div_cnt <= div_cnt + 1;
  22. end
  23. else
  24. div_cnt <= 0;
  25. end
  26. reg clk_div_r, clk_div_rr;
  27. always@(posedge clk or negedge rst_n) begin
  28. if(~rst_n) begin
  29. clk_div_r <= 1;
  30. end
  31. else if(div_cnt == 1) begin
  32. clk_div_r <= ~clk_div_r;
  33. end
  34. else if(div_cnt == 4) begin
  35. clk_div_r <= ~clk_div_r;
  36. end
  37. else clk_div_r <= clk_div_r;
  38. end
  39. always@(negedge clk or negedge rst_n) begin
  40. if(~rst_n) begin
  41. clk_div_rr <= 1;
  42. end
  43. else clk_div_rr <= clk_div_r;
  44. end
  45. assign clk_div5 = clk_div_r | clk_div_rr;
  46. endmodule

 

 

 

 

 

 

 

 

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/88095465

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。