芯路恒电子技术论坛

 找回密码
 立即注册
热搜: 合集
查看: 12041|回复: 6

串口发送模块8位转为16位程序,还请各位大佬指教

[复制链接]
  • TA的每日心情
    开心
    2018-10-29 19:43
  • 1

    主题

    2

    帖子

    9

    积分

    新手入门

    Rank: 1

    积分
    9
    QQ
    发表于 2018-10-30 11:15:32 | 显示全部楼层 |阅读模式
    //程序包括三个模块,第一个模块利用小梅哥uart_byte_rx程序,(每发送一个8位2进制数,产生一个Rx_Done信号),第三个模块使用ip核做一个dpram

    //程序要求:接收两个串口发送的8位2进制数据,组成16位2进制数,对Rx_Done信号计数,偶数次时,使能wren信号,写16位2进制到dpram中。

    1. //数据组合模块
    2. //作用:把两个8位二进制数组合为一个16位的二进制数
    3. module add(

    4. Clk,
    5. Rst_n,
    6. data_byte,
    7. Rx_Done,

    8. // cnt,
    9. // cnt_t,

    10. data,
    11. wraddress,
    12. wren
    13. );

    14. //端口例化
    15. input Clk;
    16. input Rst_n;
    17. input [7:0] data_byte;
    18. input Rx_Done;

    19. output wire [15:0] data;
    20. output wren;
    21. output reg[6:0]wraddress;

    22. wire Rx_Done;

    23. // output  cnt;
    24. // output  cnt_t;
    25. // reg data_byte;
    26. //两个寄存器 分别寄存第一个发送的8个字节数与第二个发送的8个字节数
    27. reg  [7:0] s1_data_byte;
    28. reg  [7:0] s2_data_byte;
    29. reg  [9:0] cnt;
    30.    reg  [1:0] cnt_t;
    31. reg  [15:0] data_value;



    32. //对Rx_Done进行计数
    33. always@(posedge Clk or negedge Rst_n)
    34.   if(!Rst_n)
    35.    cnt <= 9'b0;
    36.   else if(Rx_Done)
    37.    cnt <= cnt + 1'b1;
    38.   else
    39.    cnt <= cnt;
    40. //通过最后一位判断,计数的次数为计数还是偶数
    41. always@(posedge Clk or negedge Rst_n)
    42.   if(!Rst_n)
    43.    cnt_t <= 2'b0;
    44.   else if(Rx_Done)
    45.    case(cnt[0])
    46.    1: cnt_t = 1'b0;
    47.    0: cnt_t = 1'b1;
    48.    endcase
    49. //两个寄存器分别寄存第一个字节和第二个字节  
    50. always@(posedge Clk or negedge Rst_n)
    51.   if(!Rst_n)
    52.    begin
    53.    s1_data_byte <= 8'd0;
    54.    s2_data_byte <= 8'd0;
    55.    end
    56.   else if(cnt_t == 1)
    57.      begin
    58.    s1_data_byte <= data_byte;
    59.    s2_data_byte <= 8'd0;
    60.    end
    61.   else if(cnt_t == 0)
    62.      begin
    63.      s1_data_byte <= s1_data_byte;
    64.    s2_data_byte <= data_byte;
    65.    end
    66.   else
    67.      begin
    68.    s1_data_byte <= 8'd0;
    69.    s2_data_byte <= 8'd0;
    70.    end
    71. //组合两个字节
    72. always@(posedge Clk or negedge Rst_n)
    73.   if(!Rst_n)
    74.    data_value <= 16'd0;
    75.   else if(cnt_t == 0 )
    76.      begin
    77.    data_value[15:8] <= s1_data_byte;
    78.    data_value[7:0]  <= s2_data_byte;
    79.    end
    80.   else
    81.    data_value <= data_value;
    82.       
    83. //产生cnt_t,产生wren信号
    84.   
    85. // always@(posedge Clk or negedge Rst_n)
    86. //  if(!Rst_n)
    87. //   cnt_t <= 2'b0;
    88. //  else if(Rx_Done)
    89. //   case(cnt)
    90. //   1,3,5,7,9,11,13,15: cnt_t = 1'b0;
    91. //   2,4,6,8,10,12,14,16: cnt_t = 1'b1;
    92. //   endcase
    93.    
    94. //写地址自加设置,RX_Done为起始信号,每计数两次发送一次写使能信号
    95. always@(posedge Clk or negedge Rst_n)
    96.   if(!Rst_n)
    97.    wraddress <= 8'd0;
    98.   else if(cnt_t == 0)
    99.    wraddress <= wraddress + 1'b1;
    100.   else
    101.    wraddress <= wraddress;
    102.    
    103.   assign wren = cnt_t[0];
    104.   assign data = data_value[15:0];
    105. endmodule




    106. //仿真程序如下
    107. //目标要求:仿真出现8位数据合成16位,并且写地址自加
    108. `timescale 1ns/1ns
    109. `define clk_period 20
    110. module pwm_tb;

    111. reg Clk;
    112. reg Rst_n;
    113. wire Key_in;

    114. wire Rs232_Rx;

    115. wire Rs232_Tx;

    116. wire bps_clk;
    117. wire bps_cnt;

    118. reg [7:0] data_byte;
    119. reg send_en;
    120. wire [2:0]baud_set;
    121. // wire Tx_Done;
    122. // reg press;

    123. wire cnt;
    124. wire  [1:0] cnt_t;
    125.   
    126.   wire Rx_Done;
    127. //  wire [6:0]rdaddress;
    128.   wire [6:0]wraddress;
    129.   wire [15:0] data;

    130. assign baud_set = 3'd0;
    131. assign wren = 1'd1;

    132. // pwm pwm(
    133. //  
    134. //  .Clk(Clk),
    135. //  .Rst_n(Rst_n),
    136. //  
    137. //  .Key_in(Key_in),
    138. //  
    139. //  .Rs232_Rx(Rs232_Rx),
    140. //  .Rs232_Tx(Rs232_Tx)
    141. //);
    142. //例化接收串口数据模块,例化dpram模块,例化叠加模块
    143. uart_byte_rx uart_byte_rx(
    144.   .Clk(Clk),
    145.   .Rst_n(Rst_n),
    146.   .baud_set(3'd0),
    147.   .Rs232_Rx(Rs232_Rx),
    148.   .bps_clk(bps_clk),
    149.   .bps_cnt(bps_cnt),
    150.   .data_byte(rx_data),
    151.   .Rx_Done(Rx_Done)
    152. );

    153. add add(

    154.   .Clk(Clk),
    155.   .Rst_n(Rst_n),
    156.   .data_byte(data_byte),
    157.   .Rx_Done(Rx_Done),
    158.   .data(data),
    159.   
    160. //  .cnt(cnt),
    161. //  .cnt_t(cnt_t),
    162. //  
    163.   .wraddress(wraddress),
    164.   .wren(wren)
    165.      );
    166.    
    167.    
    168.   dpram dpram(
    169.   .clock(Clk),
    170.   .data(data),
    171.   .rdaddress(rdaddress),
    172.   .wraddress(wraddress),
    173.   .wren(wren),
    174.   .q()
    175. );
    176. //  ctrl ctrl(
    177. //  .Clk(Clk),
    178. //  .Rst_n(Rst_n),
    179. //  .Key_flag(Key_flag),
    180. //  .Key_state(Key_state),
    181. //  .Rx_Done(Rx_Done),         //接收结束信号
    182. //  .Tx_Done(Tx_Done),         //发送结束信号
    183. //  .rdaddress(rdaddress),      
    184. //  .wraddress(wraddress),
    185. //  .wren(1'b1),            
    186. //  .Send_en(Send_en)
    187. // );
    188. initial Clk = 1;
    189. always#(`clk_period/2)Clk = ~Clk;

    190. initial begin
    191.   Rst_n = 1'b0;
    192.   data_byte = 8'd11;
    193.   #(`clk_period*20 + 1 );
    194.   Rst_n = 1'b1;
    195.   #(`clk_period*50);
    196.   data_byte = 8'haa;
    197.   #(`clk_period*50);
    198.   data_byte = 8'h11;  
    199.     #(`clk_period*50);
    200.   data_byte = 8'haa;
    201.   #(`clk_period*50);
    202.   data_byte = 8'h11;  
    203.     #(`clk_period*50);
    204.   $stop;
    205. end

    206. endmodule
    复制代码



    [url=http://www.corecourse.cn/static/image/smiley/default/smile.gif]http://www.c
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2021-2-24 10:16
  • 431

    主题

    818

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    16150
    QQ
    发表于 2018-10-30 11:21:01 | 显示全部楼层
    没明白你想问啥
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-10-29 19:43
  • 1

    主题

    2

    帖子

    9

    积分

    新手入门

    Rank: 1

    积分
    9
    QQ
     楼主| 发表于 2018-10-30 11:26:45 | 显示全部楼层
    在仿真中,bps_clk,bps_cnt等信号没有波形,未出现Rx_Done信号未程序设计要求

    仿真出错

    仿真出错
    LKRPZFH_{E`B[J_H8XJFXQL.png
    [url=http://www.corecourse.cn/static/image/smiley/default/smile.gif]http://www.c
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2021-2-24 10:16
  • 431

    主题

    818

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    16150
    QQ
    发表于 2018-10-30 11:31:13 | 显示全部楼层
    你第一次做仿真吧,那么多input端口的信号没有写激励。你的tb中TX和RX都没有波形,怎么会有你想要的RX-DONE。建议先看看我们基于串口猎人的示波器这个章节,看看我们是如何进行系统级别的仿真的,在《FPGA自学笔记——设计与验证》一书中有讲到

    点评

    厉害  发表于 2018-10-30 20:27
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-6-29 15:57
  • 13

    主题

    246

    帖子

    3625

    积分

    超级版主

    Rank: 8Rank: 8

    积分
    3625
    发表于 2018-10-30 20:27:47 | 显示全部楼层
    学习到了
    回复

    使用道具 举报

  • TA的每日心情
    闭嘴
    2021-4-3 01:24
  • 1

    主题

    12

    帖子

    2177

    积分

    论坛元老

    Rank: 9Rank: 9Rank: 9

    积分
    2177
    发表于 2018-11-13 08:55:43 | 显示全部楼层
    学习到了,谢谢各位
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|小黑屋|Archiver|芯路恒电子技术论坛 |鄂ICP备2021003648号

    GMT+8, 2024-12-22 19:05 , Processed in 0.080548 second(s), 38 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

    快速回复 返回顶部 返回列表