微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 请大家帮忙看看这种代码是不是正确的

请大家帮忙看看这种代码是不是正确的

时间:10-02 整理:3721RD 点击:
这个程序是用串口发送一个指定的8位数据给pc,用quartus编译没问题,但是下到板子里并不能实现用modelsim仿真时,说是 end_cnt1  add_cnt1  add_cnt0  end_cnt0  出了问题,  是不是这种赋值方式不对?
module uart(clk    ,
rst_n  ,
key,
txd,
tx_done
);
//参数定义
parameter      DATA_W =            8;

//输入信号定义
input               clk     ;
input               rst_n   ;
input                 key   ;
//input   [2:0]       baud_set;
//输出信号定义
output              txd     ;
output              tx_done ;
//输出信号reg定义
reg                 txd     ;
reg                tx_done  ;
//中间信号定义
wire   [13:0]       bps_cnt  ;
reg   [13:0]       cnt0     ;
reg   [2:0 ]       cnt1     ;   
wire  [9:0]       tx_data  ;
reg                flag     ;
wire   [7:0]        dout     ;
assign dout = 8'h12;
assign bps_cnt=5208;
/*
//组合逻辑写法
always@(*)begin
    case(baud_set)
        1:  bps_cnt <= 5208;      // baud=9600
        2:  bps_cnt <= 2604;      //      19200
        3:  bps_cnt <= 1302;       //     38400
        4:  bps_cnt <= 868 ;       //     57600
        5:  bps_cnt <= 434 ;       //     115200
    endcase
end
*/
// flag   
always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        flag<=0;
    end
    else if (key==0)begin
        flag <= 1;
    end
    else if (end_cnt1) begin
        flag <= 0;
    end
end                     
//时序逻辑写法   cnt0  分频时钟
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt0 <= 0;
    end
    else if(add_cnt0)begin
        if(end_cnt0)
            cnt0 <= 0;
        else
            cnt0 <= cnt0 + 1;
    end
end
assign add_cnt0 = flag==1;      
assign end_cnt0 = add_cnt0 && cnt0==bps_cnt-1 ;   

// 时序   cnt1   数10次
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt1 <= 0;
    end
    else if(add_cnt1)begin
        if(end_cnt1)  
            cnt1 <= 0;
        else
            cnt1 <= cnt1 + 1;
    end
end
assign add_cnt1 = end_cnt0 ;      
assign end_cnt1 = add_cnt1 && cnt1==9 ;   
assign tx_data={1'b1,dout,1'b0};
// 时序   dout
always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        txd <= 1'b1;
    end
    else if (end_cnt0)begin
        txd <= tx_data[cnt1];
    end
end
// 时序  tx_done
always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        tx_done <= 0;
    end
    else if(end_cnt1) begin
        tx_done <= 1;
    end
    else begin
        tx_done <= 0;
    end
end

endmodule



补充内容 (2017-8-15 21:49):
  目前仿真可以通过  但是还是串口调试助手还是没数据   求解答啊   弄不出来今晚都睡不着了

always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        txd <= 1'b1;
    end
    //else if (end_cnt0)begin
    else if (cnt0 == 1)begin
        txd <= tx_data[cnt1];
    end
end
看错 我以为你的bps_cnt为波特率的计数子,
另外 你的cnt1是bit计数吧 ? 需要计数到9.  但是你的cnt1只有3bit的位宽 。
需要改为reg  [3:0]  cnt1;

仿真出错是 end_cnt1  add_cnt1  add_cnt0  end_cnt0这几个信号没预先定义

嗯嗯   但是定义了之后下载板子还是没有   我现在再看看仿真波形找找错误

always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        txd <= 1'b1;
    end
    else if (end_cnt0)begin
        txd <= tx_data[cnt1];
    end
end
这里的end_cnt0  在bps_cnt==5207才有效。 应该要在bps_cnt==1时候就把tx_data[0]取进来。

这两个的波特率不是都是 一样的吗 ,都是间隔 5208个cnt0 送一个数,  我改过之后还是不行 。
  

可以用嵌入式逻辑分析仪看下时序对不对

signaltap 吗 ? 我试试 之前没用过

问题解决了吗?选个最佳答案吧

昨天学校停电了 ,今天才看到
这个我试了  还是不行

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top