【9】Verilog练习-串口指令处理器
我的学记|刘航宇的博客

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

刘航宇
3年前发布 /正在检测是否收录...
温馨提示:
本文最后更新于2022年11月29日,已超过850天没有更新,若内容或图片失效,请留言反馈。

理论:

图片[1] - 【9】Verilog练习-串口指令处理器 - 我的学记|刘航宇的博客
图片[2] - 【9】Verilog练习-串口指令处理器 - 我的学记|刘航宇的博客
图片[3] - 【9】Verilog练习-串口指令处理器 - 我的学记|刘航宇的博客

代码

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

现象

图片[4] - 【9】Verilog练习-串口指令处理器 - 我的学记|刘航宇的博客

© 版权声明
THE END
喜欢就支持一下吧
点赞 2 分享 赞赏
评论 抢沙发
取消