侧边栏壁纸
    • 累计撰写 296 篇文章
    • 累计收到 520 条评论
    【9】Verilog练习-串口指令处理器
    我的学记|刘航宇的博客

    【9】Verilog练习-串口指令处理器

    刘航宇
    2022-06-23 / 0 评论 / 183 阅读 / 正在检测是否收录...

    理论:

    Test
    Test
    Test

    代码

    cmd_pro

    //指令处理器
    `timescale 1ns/10ps
    module cmd_pro(
                    clk,
                    res,
                    din_pro,
                    en_din_pro,
                    dout_pro,
                    en_dout_pro,
                    rdy
                    );
    input            clk;
    input            res;
    input[7:0]        din_pro;//指令和数据输入端口;
    input            en_din_pro;//输入使能;
    output[7:0]        dout_pro;//指令执行结果;
    output            en_dout_pro;//指令输出使能;
    output            rdy;//串口发送模块空闲标志,0表示空闲;
    
    parameter        add_ab=8'h0a;
    parameter        sub_ab=8'h0b;
    parameter        and_ab=8'h0c;
    parameter        or_ab=8'h0d;
    
    reg[2:0]        state;//主状态机寄存器(2^3个状态);
    reg[7:0]        cmd_reg,A_reg,B_reg;//存放指令、A和B;
    reg[7:0]        dout_pro;
    reg                en_dout_pro;
    
    always@(posedge clk or negedge res)
    if(~res)begin
        state<=0;cmd_reg<=0;A_reg<=0;B_reg<=0;dout_pro<=0;
        en_dout_pro<=0;
    end
    else begin
        case(state)
        0://等指令;
        begin
            en_dout_pro<=0;
            if(en_din_pro) begin
                cmd_reg<=din_pro;
                state<=1;
            end
        end
        1://收A;
        begin
            if(en_din_pro) begin
                A_reg<=din_pro;
                state<=2;
            end
        end
        2://收B;
        begin
            if(en_din_pro) begin
                B_reg<=din_pro;
                state<=3;
            end
        end    
        3://指令译码和执行
        begin
            state<=4;
            case(cmd_reg)
            add_ab: begin dout_pro<=A_reg+B_reg; end
            sub_ab: begin dout_pro<=A_reg-B_reg; end
            and_ab: begin dout_pro<=A_reg&B_reg; end
            or_ab: begin dout_pro<=A_reg|B_reg; end
            endcase
        end
        4://发送指令执行结果
        begin
            if(~rdy)begin
                en_dout_pro<=1;
                state<=0;
            end
        end
        default://
        begin
            state<=0;
            en_dout_pro<=0;
        end
        
        endcase
    end
    endmodule

    UART_top

    //串口指令处理器
    `timescale    1ns/10ps
    module UART_top(
                    clk,
                    res,
                    RX,
                    TX
                    );
    input            clk;
    input            res;
    input            RX;
    output            TX;
    
    wire[7:0]        din_pro;
    wire            en_din_pro;
    wire[7:0]        dout_pro;
    wire            en_dout_pro;
    wire            rdy;
    
    UART_Rxer UART_Rxer( 
                        .clk(clk),
                        .res(res),
                        .RX(RX),
                        .data_out(din_pro),
                        .en_data_out(en_din_pro)
                        );
    UART_TXer UART_TXer( 
                        .clk(clk),
                        .res(res),
                        .data_in(dout_pro),
                        .en_data_in(en_dout_pro),
                        .TX(TX),
                        .rdy(rdy)
                        );
    cmd_pro cmd_pro(
                    .clk(clk),
                    .res(res),
                    .din_pro(din_pro),
                    .en_din_pro(en_din_pro),
                    .dout_pro(dout_pro),
                    .en_dout_pro(en_dout_pro),
                    .rdy(rdy)
                    );
    endmodule
    //-----testbench of UART_top-----
    module UART_top_tb;
    reg                    clk,res;
    wire                RX;
    wire                TX;
    
    reg[45:0]            RX_send;//里面装有串口字节发送数据
    assign                RX=RX_send[0];//连接RX;
    reg[12:0]            con;
    
    UART_top UART_top(
                        clk,
                        res,
                        RX,
                        TX
                        );
                        
    initial begin
                        clk<=0;res<=0;RX_send<={1'b1,8'h09,1'b0,1'b1,8'h06,1'b0,1'b1,8'h0a,1'b0,16'hffff};
                        con<=0;
                #17        res<=1;
                #4000000    $stop;
    end
    always #5 clk<=~clk;
    always@(posedge clk)begin
      if(con==5000-1)begin
        con<=0;
      end
      else begin
        con<=con+1;
      end
      if(con==0)begin
        RX_send[44:0]<=RX_send[45:1];
        RX_send[45]<=RX_send[0]; 
      end
    end    
    
    endmodule

    现象

    2
    【IC设计】数字IC设计流程及学习指南
    « 上一篇 2022-07-06
    【8】Verilog练习-串口数据发送
    下一篇 » 2022-06-21

    评论 (0)

    取消