4422|0

265

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

FPGA初步之串口仿真(仿真图附上) [复制链接]

对于一般比较小的程序,我们可以通过观察仿真波形来查看我们的设计,但当程序稍微复杂一点,面对着仿真波形,我们有时眼都看花了,说不定还把错误给漏了,真的得不尝失啊,别急,这时我们可以采用另一种重型武器—Verilog提供的那些用于仿真的语句。
前面我已经给出了串口发送和接收的源程序,现在我们就拿它小试一下。
仿真代码如下:
CODE:
`timescale 1ns/1ns

module UART_test();
reg rst_n;
reg clk50M;
wire txd;
wire rxd;

wire rxd_data_ready;
wire[7:0] rxd_data;
async_receiver u0(.rst_n(rst_n),.clk(clk50M),.rxd(rxd),
                  .rxd_data_ready(rxd_data_ready),.rxd_data(rxd_data));

reg txd_start;
reg[7:0] txd_data;
wire txd_busy;
async_transmitter u1(.rst_n(rst_n),.clk(clk50M),.txd_start(txd_start),
                     .txd_data(txd_data),.txd_busy(txd_busy),.txd(txd));

assign rxd=txd; //发送和接收对接,有点跳线的意思

//产生复位信号
initial
begin
   rst_n=1'b1;
   #20 rst_n=1'b0;
   #60 rst_n=1'b1;
end  

//产生时钟信号
parameter period_clk=10;
initial
begin
   clk50M=1'b0;
   forever #period_clk clk50M=~clk50M;
end

//循环发送数据0-255
reg[7:0] tr_data;
reg[7:0] cmp_data;
always@(negedge rst_n,posedge clk50M)
begin
    if(!rst_n)
    begin
        tr_data<=8'h00;
    end
    else
    begin
        if((txd_start==1'b0) && (txd_busy==1'b0))
        begin
            txd_start<=1'b1;
            txd_data<=tr_data;
            cmp_data<=tr_data;
            tr_data<=tr_data+1'b1;
            $display("write data is %d",tr_data);
        end
        else
            txd_start<=1'b0;
    end
end

//上升沿检测
reg rxd_ready1,rxd_ready2,rxd_ready3;
wire rxd_ready4;
always@(negedge rst_n,posedge clk50M)
begin
        if(!rst_n)
        begin
                rxd_ready1<=1'b0;
                rxd_ready2<=1'b0;
                rxd_ready3<=1'b0;
        end
        else
        begin
                rxd_ready1<=rxd_data_ready;
                rxd_ready2<=rxd_ready1;
                rxd_ready3<=rxd_ready2;
        end
end
assign rxd_ready4= rxd_ready2 & (!rxd_ready3);

//接收数据,同时和发送数据进行校对
always@(posedge clk50M)
begin
    if(rxd_ready4==1'b1)
    begin
        $display("receive data is %d",rxd_data);
        if(cmp_data==rxd_data)
        begin
            $display("(^_^)");
        end
        else
        begin
            $display("error is occur('_')");
        end
    end
end

endmodule这是我们进行仿真,在ModelSim的那个脚本窗口,我们可以看到如下信息,这个对于定位错误应该说是很有用的(^_^)。
此帖出自FPGA/CPLD论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表