原创 玉露和金风,袅袅云中燕——前仿真小试牛刀

2010-6-3 04:00 2757 12 14 分类: FPGA/CPLD

编了一个串口接收的小程序,死活不工作。万般无奈之下,求助仿真。不学不知道,一学发现,原来很好学。尤其是前仿真,简单好用。把那个不听话的小程序在仿真里一遛,不禁暗暗叫好。先看源程序


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 


`timescale 1ns / 1ps


module rxd(clk,rx,rx_reg);   


 


input clk;       


input rx; 


output reg[7:0]rx_reg;  //显示收到的数据


 


reg clk_bps,rx_1,rx_2,flag_rx;


reg [3:0]num_rx = 4'b0;


reg [12:0]cnt = 13'b0;


//parameter reference="13"'b1000_0010_0011;       //2083*9600=<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />20M


parameter reference="13"'b0000_0000_0001; //testbench


 


always @ (posedge clk)


if(cnt == reference)       cnt <= 13'b0;


else                                 cnt <= cnt+13'b1;


//晶振跑得快,波特率时钟跑得慢,咱不必亦步亦趋,可以跑会歇会


 


always @ (posedge clk)


if(cnt == reference)       clk_bps <= 1'b1;


else                                 clk_bps <= 1'b0;


//该跑就跑,不跑咱就歇着 


 


always @ (posedge clk )


begin       rx_1 <= rx;


                rx_2 <= rx_1;


end


 


always @ (posedge clk )


if     (rx_1 == 0 && rx_2 == 1)


       flag_rx <= 1; 


//该喂孩子了


 


always @ (posedge clk_bps)


if (flag_rx == 1)


begin


       case (num_rx)


       4'd0:       rx_reg[0] <= rx;


       4'd1:       rx_reg[1] <= rx;    


       4'd2:       rx_reg[2] <= rx;    


       4'd3:       rx_reg[3] <= rx;   


       4'd4:       rx_reg[4] <= rx;   


       4'd5:       rx_reg[5] <= rx;   


       4'd6:       rx_reg[6] <= rx;   


       4'd7:       rx_reg[7] <= rx;     //每个都得喂


       endcase


       if(num_rx < 7)             


       num_rx <= num_rx+4'b1;     //为了防止偏心,特设移位机制


end


endmodule


 


仿真结果如下:


 


 点击看大图


 

咱给的是01H,可数据明显不对。点开各位,发现把起始位也弄到数据里去了。赋值应该慢一拍。最后一个always语句应该改为:


 


always @ (posedge clk_bps)


if (flag_rx == 1)


begin


case (num_rx)


       4'd1:       rx_reg[0] <= rx;


       4'd2:       rx_reg[1] <= rx;    


       4'd3:       rx_reg[2] <= rx;    


       4'd4:       rx_reg[3] <= rx;   


       4'd5:       rx_reg[4] <= rx;   


       4'd6:       rx_reg[5] <= rx;   


       4'd7:       rx_reg[6] <= rx;   


       4'd8:       rx_reg[7] <= rx;    


       endcase


if(num_rx < 8)             


       num_rx <= num_rx+4'b1;    


end


 


这下仿真结果变成这样了——


 



 点击看大图


 


可以看出其它各位都对,只有最高位不对,而且变化2次。再看看源程序,发现num_rx8就不再累加,导致最高位先正确赋值,然后又被停止位赋了一次。把上面的always语句中的if语句改成


 


if(num_rx < 9)             


       num_rx <= num_rx+4'b1;


 


再仿真


 

 点击看大图



 


一切正常。前仿真操作简单,但借助它可以看到程序运行的细节,因此仍不失为一件利器。也正因为简单,大家就更要早点学会它。


另外,观察仿真波形可以看出,verilog中变量如果不初始化,其值为x

文章评论2条评论)

登录后参与讨论

用户1584993 2010-6-3 15:04

博主这标题取的不错,呵呵

用户1122702 2010-6-3 09:29

最好学习使用modelsim之类的专业仿真工具~~~
相关推荐阅读
用户234619 2010-09-04 16:18
DCM之引狼入室终成狗
如果以Xilinx器件为载体学习FPGA,那么DCM的学习和使用无疑是一项基本技能。Xilinx大学计划书籍和有些学习板的教程都提供了室外版的DCM例程。该类例程通常是这么几步:1. 配置好IP核参数...
用户234619 2010-06-26 17:01
天热了
骄阳似火滚神州,羡慕南非值晚秋。家中球迷笑不止,“除非黛玉别春愁”! 三伏天马上就要来了,天气一天比一天热。“南非现在是秋天,挺好。”妻子听了笑个不停:“搞错了。难道你现在刚刚度过春天吗?!” ...
用户234619 2010-06-24 16:14
又是一年
 刘家窑桥风习习,伏日一来了无迹。风花漫卷雪月地,春去春回最真机。 从去年春天开始,每天在刘家窑坐班车去公司。早上空气清新,经常是凉风习习。后来到了夏天,情况开始发生改变。尤其是进入三伏之后,凉爽的感...
用户234619 2010-06-20 13:44
翻译About the SinalTap II Logic Analyser
自定义简称:ST II LAE:SinalTap II Logic Analyzer EditorST II LA:SinalTap II Logic AnalyzerST II:SinalTap I...
用户234619 2010-06-19 10:55
南非世界杯,激情唱响非洲大陆
世界杯来了,家里的球迷毫不客气地占据了电视机前的头把交椅。我和母亲默默地、自觉地落坐在左右两厢。当然,可以随时离开。凌晨的比赛没有几个人撑得住。恰逢端午假期,白天的频道有时就被切换到风云足球。忽然,电...
用户234619 2010-06-16 22:44
同为下降沿,用法却不同
串口接收和ps2接收均用到了下降沿检测,但是用法却不尽相同。哪不同?往下看。图1所示为串口接收的一个数据帧(8位数据,无校验)。当检测到下降沿后,串口接收启动。启动过程为:延时一个波特率周期;依次接收...
我要评论
2
12
关闭 站长推荐上一条 /2 下一条