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

2019-07-15 21:29发布

这个程序是用串口发送一个指定的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):
  目前仿真可以通过  但是还是串口调试助手还是没数据   求解答啊   弄不出来今晚都睡不着了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
amaj136
1楼-- · 2019-07-16 02:41
 精彩回答 2  元偷偷看……
amaj136
2楼-- · 2019-07-16 04:52
仿真出错是 end_cnt1  add_cnt1  add_cnt0  end_cnt0这几个信号没预先定义
rh1994
3楼-- · 2019-07-16 09:01
amaj136 发表于 2017-8-15 20:38
仿真出错是 end_cnt1  add_cnt1  add_cnt0  end_cnt0这几个信号没预先定义

嗯嗯   但是定义了之后下载板子还是没有   我现在再看看仿真波形找找错误
amaj136
4楼-- · 2019-07-16 14:16
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]取进来。
rh1994
5楼-- · 2019-07-16 18:14
amaj136 发表于 2017-8-15 20:51
always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        txd

这两个的波特率不是都是 一样的吗 ,都是间隔 5208个cnt0 送一个数,  我改过之后还是不行 。。
  
纷乱的光
6楼-- · 2019-07-16 21:12
 精彩回答 2  元偷偷看……

一周热门 更多>