当前位置:   article > 正文

【Verilog设计与实现】2ASK调制解调、2FSK调制解调_2ask解调verilog

2ask解调verilog

一、2ASK调制与解调

  • 2ASK调制

  • Verilog源代码
  1. module modulate_2ASK(clk , rst , x, y);
  2. input clk,rst;
  3. input x;
  4. reg [1:0] cnt;
  5. reg carry = 0;
  6. output y; //wire类型
  7. //第一步:分频得到载波信号序列:carry,(4分频)
  8. always@(posedge clk)
  9. begin
  10. if(!rst) //rst低电平有效:置位为0可以重置cnt、carry初值
  11. begin
  12. cnt <= 0;
  13. carry <= 0;
  14. end
  15. else
  16. begin //高电平:3、0;低电平:1、2
  17. if(cnt == 3 ) //先判断cnt是否为3: 令carry =1
  18. begin
  19. cnt <= 0;
  20. carry <= 1;
  21. end
  22. else if(cnt == 0) //0: 令carry = 1
  23. begin
  24. carry <= 1;
  25. cnt <= cnt + 1;
  26. end
  27. else //1、2: 令carry = 0
  28. begin
  29. cnt = cnt + 1;
  30. carry <= 0;
  31. end
  32. end
  33. end
  34. //第二步:基带信号x、载波信号carry,&&
  35. assign y = x && carry;
  36. endmodule
  • testbench
  1. `timescale 100ns/1ps //time scale = 0.1us
  2. module TB_ASK_Modulate();
  3. reg CLK, START, X;
  4. //parameter initTime = 30; //start after initTime
  5. parameter period = 2;
  6. modulate_2ASK Obj(.clk(CLK), .rst(START), .x(X));
  7. /* period = 0.2us */
  8. initial
  9. begin
  10. CLK = 0;
  11. //#initTime;
  12. forever
  13. #(period/2) CLK = ~CLK;
  14. end
  15. /* ASK_CLK */
  16. initial
  17. begin
  18. START=0;
  19. @(posedge CLK);
  20. START=1;
  21. end
  22. /* testbench */
  23. initial
  24. begin
  25. X=0;
  26. #50 X=1; // 1 delay for 5us
  27. #50 X=0; // 0 delay for 5us
  28. #50 X=1; // 1 delay for 10us
  29. #100 X=0; // 0 delay for 10us
  30. #100 X=1; // 1 delay for 5us
  31. #50 X=0; // 0 delay for 10us
  32. #100 X=1; // 1 delay for 5us
  33. #50 X=0; //0 delay forever
  34. end
  35. endmodule

  • 2ASK解调

  1. module demodulate_2ASK( clk,rst , y, x );
  2. input clk,rst;
  3. input y; //调制信号
  4. output reg x; //解调后信号,原始基带信号
  5. reg [3:0] cnt;
  6. reg [2:0] m; //记录采样过程中"1"的个数
  7. reg yy; //yy
  8. //计数器 0 ~ 11,一直循环累加
  9. always@(posedge clk)
  10. begin
  11. yy <= y;
  12. if(!rst)
  13. begin
  14. cnt <= 0;
  15. end
  16. else
  17. begin
  18. if(cnt == 11)
  19. cnt <= 0;
  20. else
  21. cnt <= cnt +1; // 000、001、···、007
  22. end
  23. end
  24. //采样判决
  25. always@(posedge clk)
  26. begin
  27. if(cnt == 11) //cnt=11,m重置为0
  28. begin
  29. m <= 0;
  30. end
  31. else
  32. begin
  33. if(cnt == 10) //cnt=11,开始采样判决
  34. begin
  35. if(m <= 2)
  36. x <= 0;
  37. else //只要 m 超过 2, 就判决为1
  38. x <= 1;
  39. end
  40. else if(yy == 1)
  41. m <= m + 1; //cnt:0 ~ 5,都在累加
  42. end
  43. end
  44. endmodule
  • testbench
  1. `timescale 100ns/1ps //time scale = 0.1us
  2. module TB_ASK_Demodulate();
  3. reg CLK, START, X;
  4. //parameter initTime = 30; //start after initTime
  5. parameter period = 2;
  6. demodulate_2ASK Obj(.clk(CLK), .rst(START), .y(X));
  7. /* period = 0.2us */
  8. initial
  9. begin
  10. CLK = 0;
  11. //#initTime;
  12. forever
  13. #(period/2) CLK = ~CLK;
  14. end
  15. /* ASK_CLK */
  16. initial
  17. begin
  18. START=0;
  19. @(posedge CLK);
  20. START=1;
  21. end
  22. /* testbench */
  23. initial
  24. begin
  25. X=0;
  26. #50 X=1; // 1 delay for 5us
  27. #50 X=0; // 0 delay for 5us
  28. #50 X=1; // 1 delay for 10us
  29. #100 X=0; // 0 delay for 10us
  30. #100 X=1; // 1 delay for 5us
  31. #50 X=0; // 0 delay for 10us
  32. #100 X=1; // 1 delay for 5us
  33. #50 X=0; //0 delay forever
  34. end
  35. endmodule

二、2FSK调制解调

  • 2FSK调制

  1. module modulate_2FSK(clk,rst , x, y);
  2. input clk, rst;
  3. input x;
  4. output y;
  5. reg [1:0] cnt1;
  6. reg cnt2;
  7. reg y_f1, y_f2; // 2个不同频率的信号
  8. // 利用2位计数器cnt1实现4分频,分频之后的信号为y_f1
  9. always@(posedge clk or negedge rst)
  10. begin
  11. if(!rst) // rst是低电平有效
  12. begin
  13. cnt1 <= 0;
  14. y_f1 <= 0;
  15. end
  16. else
  17. begin
  18. if(cnt1 == 2'b11) //0、1、2、3、 0、1、2、3 、···
  19. begin
  20. cnt1 <= 0;
  21. y_f1 <= ~y_f1;
  22. end
  23. else
  24. cnt1 <= cnt1 + 1;
  25. end
  26. end
  27. // 利用1位计数器cnt2实现2分频,分频之后的信号为f2
  28. always@(posedge clk or negedge rst)
  29. begin
  30. if(!rst) //rst是低电平有效
  31. begin
  32. cnt2 <= 0;
  33. y_f2 <= 0;
  34. end
  35. else
  36. begin
  37. if(cnt2 == 2'b1)
  38. begin
  39. cnt2 <= 0;
  40. y_f2 <= ~y_f2;
  41. end
  42. else
  43. cnt2 <= cnt2 + 1;
  44. end
  45. end
  46. assign y = (x==1)? y_f1 : y_f2;
  47. endmodule

  • 2FSK解调

  1. module demodulate_2FSK(clk,rst , x, y);
  2. input clk, rst;
  3. input y;
  4. output reg x;
  5. reg clk1;
  6. reg temp;
  7. reg [3:0] cnt1;
  8. reg [3:0] cnt2;
  9. //计数器,cnt1计数变量:记录clk下调制信号‘0’电平个数
  10. always@(posedge clk or negedge rst)
  11. begin
  12. if(!rst)
  13. cnt1 <= 0;
  14. else
  15. begin
  16. if(!y)
  17. cnt1 <= cnt1 + 1;
  18. else
  19. cnt1 <= 0;
  20. end
  21. end
  22. //比较器,temp变量:记录‘0’电平个数大于6的数量,采样
  23. always@(posedge clk or negedge rst)
  24. begin
  25. if(!rst)
  26. temp <= 0;
  27. else
  28. begin
  29. if(cnt1 > 6) //若clk时钟下调制信号中的‘1’电平个数大于6
  30. temp <= 1; //temp置为‘1
  31. else
  32. temp <= 0;
  33. end
  34. end
  35. //20分频作为采样频率
  36. always@(posedge clk or negedge rst)
  37. begin
  38. if(!rst)
  39. begin
  40. cnt2 <= 0;
  41. clk1 <= 0;
  42. end
  43. else
  44. begin
  45. if(cnt2 == 9)
  46. begin
  47. clk1 <= ~clk1;
  48. cnt2 <= 0;
  49. end
  50. else
  51. cnt2 <= cnt2 + 1;
  52. end
  53. end
  54. //调制信号是在clk1的上升沿下的temp状态
  55. always@(posedge clk1 or negedge rst)
  56. begin
  57. if(!rst)
  58. x <= 0;
  59. else
  60. x <= temp;
  61. end
  62. endmodule

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/482401
推荐阅读
相关标签
  

闽ICP备14008679号