当前位置: 首页 > news >正文

上海市工程建设信息网官方网站互动平台有效学时

上海市工程建设信息网官方网站,互动平台有效学时,湘潭做网站价格 d磐石网络,电商网站建设开发小梅哥串口部分学习part2 串口通信接收原理串口通信接收程序设计与调试巧用位操作优化串口接收逻辑设计串口接收模块的项目应用案例串口通信接收原理 在采样的时候没有必要一直判断一个clk内全部都是高/低电平#xff0c;如果采用直接对中间点进行判断的话#xff0c;很有可能… 小梅哥串口部分学习part2 串口通信接收原理串口通信接收程序设计与调试巧用位操作优化串口接收逻辑设计串口接收模块的项目应用案例串口通信接收原理 在采样的时候没有必要一直判断一个clk内全部都是高/低电平如果采用直接对中间点进行判断的话很有可能出现中间点恰好电力失常等等因此可以采集多次样本其中样本数据频率高的值就是该段电平的值 **基本原理**采样 **技巧是**一位数据采多次统计得到高电平出现的次数次数多的就是该位的电平值。采样8次0123低电平4567为高电平 **起始位检测**通过边沿检测电路 串口通信接收程序设计与调试 波特率是指串口通信中单位时间传输的二进制位数eg115200对应的就是1s传输115200位即传输一位需要1000000000/115200,若进行采样频率为波特率的16倍则需要再除以16对应于每次的采样的时间由于内部时钟20ns的频率进行变化所以想要计算对应的采样次数就需要再除以20~ 源代码 module uart_byte_rx(input Clk,input Reset,input [2:0]Baud_Set,input uart_rx,output reg[7:0] Data,output reg RxDone);//边沿检测reg [1:0]uart_rx_r;always(posedge Clk)beginuart_rx_r[0]uart_rx;uart_rx_r[1]uart_rx_r[0];end//上升沿wire pedge_uart_rx;//assign pedge_uart_rx((uart_rx_r[0]0)(uart_rx_r[1]1));assign pedge_uart_rx(uart_rx_r2b01);//下降沿wire nedge_uart_rx;//assign pedge_uart_rx((uart_rx_r[0]1)(uart_rx_r[1]0));assign nedge_uart_rx(uart_rx_r2b10);//采样需要计数的位数reg [8:0] Bps_DR;always(*)case(Baud_Set)0:Bps_DR 1000000000/9600/16/20 - 1;1:Bps_DR 1000000000/19200/16/20 - 1;2:Bps_DR 1000000000/38400/16/20 - 1;3:Bps_DR 1000000000/57600/16/20 - 1;4:Bps_DR 1000000000/115200/16/20 - 1;default:Bps_DR 1000000000/9600/16/20 - 1;endcasewire bps_clk_16x;assign bps_clk_16x (div_cnt Bps_DR / 2); reg [8:0]div_cnt;always(posedge Clk or negedge Reset)beginif(!Reset)div_cnt0;else if(RX_EN)beginif(div_cntBps_DR)div_cnt0;elsediv_cntdiv_cnt1;endelsediv_cnt0; end//每位被分成16次频率采样所以一共检测10位则需要160位reg [7:0]bps_cnt;always(posedge Clk or negedge Reset)beginif(!Reset)bps_cnt0;else if(RX_EN)beginif(bps_clk_16x)beginif(bps_cnt159)bps_cnt0;elsebps_cntbps_cnt1;endelsebps_cntbps_cnt; endelsebps_cnt0;endreg[2:0]r_data[7:0];reg [2:0]sta_bit;reg [2:0]sto_bit;reg RX_EN; always(posedge Clk or negedge Reset)beginif(!Reset)RX_EN0;else if(nedge_uart_rx)RX_EN1;else if(RxDone || (sta_bit 4))RX_EN0;end//用于对数据赋值 always(posedge Clk or negedge Reset)beginif(!Reset)beginsta_bit0;sto_bit0;r_data[0]0;r_data[1]0;r_data[2]0;r_data[3]0;r_data[4]0;r_data[5]0;r_data[6]0;r_data[7]0;endelse if(bps_clk_16x)//中间位置取结果16次里面的5,6,7,8,9,10,11次数据begincase(bps_cnt)0:beginsta_bit0;sto_bit0;r_data[0]0;r_data[1]0;r_data[2]0;r_data[3]0;r_data[4]0;r_data[5]0;r_data[6]0;r_data[7]0;end5,6,7,8,9,10,11:sta_bitsta_bituart_rx;21,22,23,24,25,26,27: r_data[0] r_data[0] uart_rx;37,38,39,40,41,42,43: r_data[1] r_data[1] uart_rx;53,54,55,56,57,58,59: r_data[2] r_data[2] uart_rx;69,70,71,72,73,74,75: r_data[3] r_data[3] uart_rx;85,86,87,88,89,90,91: r_data[4] r_data[4] uart_rx;101,102,103,104,105,106,107: r_data[5] r_data[5] uart_rx;117,118,119,120,121,122,123: r_data[6] r_data[6] uart_rx;133,134,135,136,137,138,139: r_data[7] r_data[7] uart_rx;149,150,151,152,153,154,155: sto_bit sto_bit uart_rx;default:;endcaseendendalways(posedge Clk or negedge Reset)if(!Reset) Data 0; else if(bps_clk_16x (bps_cnt 159))beginData[0] (r_data[0] 4)?1b1:1b0;Data[1] (r_data[1] 4)?1b1:1b0;Data[2] (r_data[2] 4)?1b1:1b0;Data[3] (r_data[3] 4)?1b1:1b0;Data[4] (r_data[4] 4)?1b1:1b0;Data[5] (r_data[5] 4)?1b1:1b0;Data[6] (r_data[6] 4)?1b1:1b0;Data[7] (r_data[7] 4)?1b1:1b0;end always(posedge Clk or negedge Reset)beginif(!Reset)RxDone0;else if((div_cntBps_DR/2)(bps_cnt159))RxDone1;elseRxDone0;endendmodule 测试模块 timescale 1ns / 1ns module uart_byte_rx_tb();reg Clk;reg Reset;wire [2:0]Baud_Set;reg uart_rx;wire[7:0] Data;wire RxDone;assign Baud_Set4;uart_byte_rx uart_byte_rx(Clk,Reset,Baud_Set,uart_rx,Data,RxDone);initial Clk0;always #10 Clk!Clk;initial beginReset0;uart_rx1;#201; // Reset1; // uart_tx_byte(8h54); // (posedge RxDone); // #50000; // uart_tx_byte(8h32); // (posedge RxDone); // #50000; // uart_tx_byte(8h89); // (posedge RxDone); // #50000;Reset 1;#200; uart_tx_byte(8h5a);#90000;uart_tx_byte(8ha5);#90000;uart_tx_byte(8h86);#90000;$stop;$stop;endtask uart_tx_byte;input [7:0]tx_data;beginuart_rx1;#20;uart_rx0;#8680;uart_rxtx_data[0];#8680;uart_rxtx_data[1];#8680;uart_rxtx_data[2];#8680;uart_rxtx_data[3];#8680;uart_rxtx_data[4];#8680;uart_rxtx_data[5];#8680;uart_rxtx_data[6];#8680;uart_rxtx_data[7];#8680;uart_rx1;#8680;endendtask endmodule 仿真截图 巧用位操作优化串口接收逻辑设计 解释3’b000 3’b001 3’b010 3’b011 3’b100 3’b101 3’b110 3’b111判断是否大于等于4可以直接对第2位进行判断为1则大于等于为0则不大于 always(posedge Clk or negedge Reset)if(!Reset) Data 0; else if(bps_clk_16x (bps_cnt 159))beginData[0] (r_data[0] 4)?1b1:1b0;Data[1] (r_data[1] 4)?1b1:1b0;Data[2] (r_data[2] 4)?1b1:1b0;Data[3] (r_data[3] 4)?1b1:1b0;Data[4] (r_data[4] 4)?1b1:1b0;Data[5] (r_data[5] 4)?1b1:1b0;Data[6] (r_data[6] 4)?1b1:1b0;Data[7] (r_data[7] 4)?1b1:1b0;end //可以达到和上面同样的功能 // always(posedge Clk or negedge Reset) // if(!Reset) // Data 0; // else if(bps_clk_16x (bps_cnt 159))begin // Data[0] r_data[0][2]; // Data[1] r_data[1][2]; // Data[2] r_data[2][2]; // Data[3] r_data[3][2]; // Data[4] r_data[4][2]; // Data[5] r_data[5][2]; // Data[6] r_data[6][2]; // Data[7] r_data[7][2]; // end 串口接收模块的项目应用案例 使用串口来控制LED工作状态 题目使用串口发送指令到FPGA开发板来控制第7课第4个实验的开发板上的LED灯的工作状态 让LED灯按照指定的亮灭模式亮灭亮灭模式未知由用户随机指定。8个变化状态为一个循环每个变化状态的时间值可以根据不同的应用场景选择 如何使用串口接收8个字节的数据 收获 1上板调试时对于时钟计时问题最初counter0发现不满足counter就会一直自加直到加到32位的’hFFFFFFFF’才会清零 在实际板级运行的时候当我们的time值更新时25000000counter的值已经大于该值所以无法通过计数比较的方式清零只能一直自加下去直到32位计满了溢出清零然后才能正常的循环计数清零 这里涉及到一种编写技巧判断 if(i32) a0; 和if(i32) a0; 虽然结界点都是32但是对于第一种情况可以有效地避免当不满足条件时的及时清零对于第二种有的时候或许会有些小问题 2对于reset这种外部模块最好全部都定义成大写并且统一这样赋值的时候不容易出错模块内部的变量定义成小写 3在顶层模块中几乎除了输入输出以外的内部变量都要定义成wire类型代表内部的连线输入输出还是采用和以往相同的方法若底层是reg型则上层直接定义成output就可不用再定义成reg测试文件直接写出wire~ //counter_led_4中 always(posedge Clk or negedge Reset_n)if(!Reset_n)counter 0;else if(counter Time - 1)//这里由改成了counter 0;elsecounter counter 1b1;源代码 module uart_rx_ctrl_led(input Clk,input reset,input uart_rx,output Led);wire [7:0]Ctrl;wire [31:0]Time;wire [7:0]Data;wire RxDone;counter_led_4 counter_led_4(.Clk(Clk),.Reset_n(reset),.Ctrl(Ctrl),.Time(Time),.Led(Led));uart_byte_rx uart_byte_rx(.Clk(Clk),.Reset(reset),.Baud_Set(3d4),.uart_rx(uart_rx),.Data(Data),.RxDone(RxDone));uart_cmd uart_cmd(.clk(Clk),.reset(reset),.rx_data(Data),.rx_done(RxDone),.ctrl(Ctrl),.time_set(Time)); endmodule module counter_led_4(Clk,Reset_n,Ctrl,Time,Led );input Clk;input Reset_n;input [7:0]Ctrl;input [31:0]Time;output reg Led;reg [31:0]counter;always(posedge Clk or negedge Reset_n)if(!Reset_n)counter 0;else if(counter Time - 1)counter 0;elsecounter counter 1b1;reg [2:0]counter2;always(posedge Clk or negedge Reset_n)if(!Reset_n) counter2 0; else if(counter Time - 1)counter2 counter2 1b1;always(posedge Clk or negedge Reset_n)if(!Reset_n)Led 0;else case(counter2)0:Led Ctrl[0];1:Led Ctrl[1];2:Led Ctrl[2];3:Led Ctrl[3];4:Led Ctrl[4];5:Led Ctrl[5];6:Led Ctrl[6];7:Led Ctrl[7];default:Led Led;endcaseendmodulemodule uart_byte_rx(input Clk,input Reset,input [2:0]Baud_Set,input uart_rx,output reg[7:0] Data,output reg RxDone);//边沿检测reg [1:0]uart_rx_r;always(posedge Clk)beginuart_rx_r[0]uart_rx;uart_rx_r[1]uart_rx_r[0];end//上升沿wire pedge_uart_rx;//assign pedge_uart_rx((uart_rx_r[0]0)(uart_rx_r[1]1));assign pedge_uart_rx(uart_rx_r2b01);//下降沿wire nedge_uart_rx;//assign pedge_uart_rx((uart_rx_r[0]1)(uart_rx_r[1]0));assign nedge_uart_rx(uart_rx_r2b10);//采样需要计数的位数reg [8:0] Bps_DR;always(*)case(Baud_Set)0:Bps_DR 1000000000/9600/16/20 - 1;1:Bps_DR 1000000000/19200/16/20 - 1;2:Bps_DR 1000000000/38400/16/20 - 1;3:Bps_DR 1000000000/57600/16/20 - 1;4:Bps_DR 1000000000/115200/16/20 - 1;default:Bps_DR 1000000000/9600/16/20 - 1;endcasewire bps_clk_16x;assign bps_clk_16x (div_cnt Bps_DR / 2); reg [8:0]div_cnt;always(posedge Clk or negedge Reset)beginif(!Reset)div_cnt0;else if(RX_EN)beginif(div_cntBps_DR)div_cnt0;elsediv_cntdiv_cnt1;endelsediv_cnt0; end//每位被分成16次频率采样所以一共检测10位则需要160位reg [7:0]bps_cnt;always(posedge Clk or negedge Reset)beginif(!Reset)bps_cnt0;else if(RX_EN)beginif(bps_clk_16x)beginif(bps_cnt159)bps_cnt0;elsebps_cntbps_cnt1;endelsebps_cntbps_cnt; endelsebps_cnt0;endreg[2:0]r_data[7:0];reg [2:0]sta_bit;reg [2:0]sto_bit;reg RX_EN; always(posedge Clk or negedge Reset)beginif(!Reset)RX_EN0;else if(nedge_uart_rx)RX_EN1;else if(RxDone || (sta_bit 4))RX_EN0;end//用于对数据赋值 always(posedge Clk or negedge Reset)beginif(!Reset)beginsta_bit0;sto_bit0;r_data[0]0;r_data[1]0;r_data[2]0;r_data[3]0;r_data[4]0;r_data[5]0;r_data[6]0;r_data[7]0;endelse if(bps_clk_16x)//中间位置取结果16次里面的5,6,7,8,9,10,11次数据begincase(bps_cnt)0:beginsta_bit0;sto_bit0;r_data[0]0;r_data[1]0;r_data[2]0;r_data[3]0;r_data[4]0;r_data[5]0;r_data[6]0;r_data[7]0;end5,6,7,8,9,10,11:sta_bitsta_bituart_rx;21,22,23,24,25,26,27: r_data[0] r_data[0] uart_rx;37,38,39,40,41,42,43: r_data[1] r_data[1] uart_rx;53,54,55,56,57,58,59: r_data[2] r_data[2] uart_rx;69,70,71,72,73,74,75: r_data[3] r_data[3] uart_rx;85,86,87,88,89,90,91: r_data[4] r_data[4] uart_rx;101,102,103,104,105,106,107: r_data[5] r_data[5] uart_rx;117,118,119,120,121,122,123: r_data[6] r_data[6] uart_rx;133,134,135,136,137,138,139: r_data[7] r_data[7] uart_rx;149,150,151,152,153,154,155: sto_bit sto_bit uart_rx;default:;endcaseendendalways(posedge Clk or negedge Reset)if(!Reset) Data 0; else if(bps_clk_16x (bps_cnt 159))beginData[0] (r_data[0] 4)?1b1:1b0;Data[1] (r_data[1] 4)?1b1:1b0;Data[2] (r_data[2] 4)?1b1:1b0;Data[3] (r_data[3] 4)?1b1:1b0;Data[4] (r_data[4] 4)?1b1:1b0;Data[5] (r_data[5] 4)?1b1:1b0;Data[6] (r_data[6] 4)?1b1:1b0;Data[7] (r_data[7] 4)?1b1:1b0;end //可以达到和上面同样的功能 // always(posedge Clk or negedge Reset) // if(!Reset) // Data 0; // else if(bps_clk_16x (bps_cnt 159))begin // Data[0] r_data[0][2]; // Data[1] r_data[1][2]; // Data[2] r_data[2][2]; // Data[3] r_data[3][2]; // Data[4] r_data[4][2]; // Data[5] r_data[5][2]; // Data[6] r_data[6][2]; // Data[7] r_data[7][2]; // end always(posedge Clk or negedge Reset)beginif(!Reset)RxDone0;else if((div_cnt Bps_DR/2)(bps_cnt159))RxDone1;elseRxDone0;endendmodule//这里养成一个习惯在模块内部的信号用小写 module uart_cmd(input clk,input reset,input [7:0]rx_data,input rx_done,output reg [7:0]ctrl,output reg [31:0]time_set);reg [7:0] reg_data[7:0];always(posedge clk)beginif(rx_done)beginreg_data[7]rx_data;reg_data[6]reg_data[7];reg_data[5]reg_data[6];reg_data[4]reg_data[5];reg_data[3]reg_data[4];reg_data[2]reg_data[3];reg_data[1]reg_data[2];reg_data[0]reg_data[1];endendreg rx_rx_done;always(posedge clk)rx_rx_donerx_done;always(posedge clk or negedge reset)beginif(!reset)begintime_set0;ctrl0;endelse if(rx_rx_done)beginif((reg_data[0]8h55)(reg_data[1]8ha5)(reg_data[7]8hf0))begintime_set[7:0]reg_data[2];time_set[15:8]reg_data[3];time_set[23:16]reg_data[4];time_set[31:24]reg_data[5];ctrlreg_data[6];endendend endmodule 测试文件 timescale 1ns / 1psmodule uart_rx_ctrl_led_tb();reg Clk;reg reset;reg uart_rx;wire Led;uart_rx_ctrl_led uart_rx_ctrl_led(Clk,reset,uart_rx,Led);initial Clk 1;always#10 Clk ~Clk;initial beginreset 0;uart_rx 1;#201;reset 1;#200; uart_tx_byte(8h55);#90000;uart_tx_byte(8ha5);#90000;uart_tx_byte(8h55);#90000;uart_tx_byte(8ha5);#90000;uart_tx_byte(8h12);#90000;uart_tx_byte(8h34);#90000;uart_tx_byte(8h56);#90000;uart_tx_byte(8h78);#90000; uart_tx_byte(8h9a);#90000; uart_tx_byte(8hf0);#90000; uart_tx_byte(8h55);#90000;uart_tx_byte(8ha5);#90000;uart_tx_byte(8h9a);#90000;uart_tx_byte(8h78);#90000;uart_tx_byte(8h56);#90000;uart_tx_byte(8h34);#90000; uart_tx_byte(8h12);#90000; uart_tx_byte(8hf1);#90000; $stop;endtask uart_tx_byte;input [7:0]tx_data;beginuart_rx 1;#20;uart_rx 0;#8680;uart_rx tx_data[0];#8680;uart_rx tx_data[1];#8680;uart_rx tx_data[2];#8680;uart_rx tx_data[3];#8680;uart_rx tx_data[4];#8680;uart_rx tx_data[5];#8680;uart_rx tx_data[6];#8680;uart_rx tx_data[7];#8680;uart_rx 1;#8680; endendtask endmodule仿真截图
http://www.tj-hxxt.cn/news/221993.html

相关文章:

  • 网站模板安全管理系统线上推广平台
  • 网站没有域名哪个网站做logo设计师
  • 有什么网站可以做电子wordpress电子邮件要用什么
  • 陕西省建设厅注册中心网站wordpress自定义文章模板
  • 徐州鼓楼区建设网站wordpress 片刻主题
  • 快速网站建设价格wordpress 英文企业站
  • 网站开发初学wordpress更换默认播放器
  • dw设计一个简单网站学院评估 网站建设整改
  • 文化传媒公司 网站备案网站风险解除
  • c 做彩票网站张家口认证助手app
  • 工业设计相关网站食用油 网站 模板
  • php网站开发文档怎么写手机网站建设视频教程、
  • 昌江网站建设做图书出版 外国网站
  • 宜宾商城网站建设网站改版方案案例
  • eclipse 开发jsp网站开发网络整合营销理论是指什么
  • 网站搭建报价制作网页网站项目介绍
  • 青海建设银行的官方网站净水 技术支持 东莞网站建设
  • 网站做流量怎么赚钱的系统网站开发
  • 绘本借阅网站开发wordpress示例页面删除
  • 网站建设情况 报告医疗器械为什么做网站
  • 红酒网站建设方案2021智慧树互联网与营销创新
  • 火龙果写作网站河北建筑培训网登录
  • 重庆网站设计案例商城网站建设机构
  • 做wordpress总结淘客网站seo怎么做
  • 良品铺子网站建设设计wordpress后台登陆慢
  • 合肥在线网站泰州百度seo公司
  • 中交建设集团网站新闻房产网南京
  • 南京制作网页速成班东莞网站包年优化
  • 服装设计找图网站wordpress页面教程
  • 做公司的后台网站用什么软件好宁夏公路建设局网站