UART_TXer 输出给上位机
项目场景:
// 2022-1-23 verilog学习
// 串口指令处理器
`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; //a+b
parameter sub_ab = 8'h0b; //a-b
parameter and_ab = 8'h0c; //a&b
parameter or_ab = 8'h0d; //a|b
reg[2:0] state; // 主状态机寄存器
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 // reg型变量清零
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 // rdy低表对方空闲,可发送
en_dout_pro <=1; // 发送使能拉高
state <= 0;
end
end
default://
begin
state<=0;
en_dout_pro <=0;
end
endcase
end
endmodule
// 2022-1-23 verilog学习
// 串口指令处理器 封装顶层 连线,全是wire
`timescale 1ns/10ps
module URAT_top(
clk,
res,
RX,
TX
);
input clk;
input res;
input RX;
output TX;
// 封装顶层,中间连线均为wire
wire[7:0] din_pro;
wire en_din_pro;
wire[7:0] dout_pro;
wire en_dout_pro;
wire rdy;
URAT_RXer URAT_RXer(
.clk(clk),
.res(res),
.RX(RX),
.data_out(din_pro), // data_out接din_pro
.en_data_out(en_din_pro)
);
URAT_TXer URAT_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
module URAT_top_tb;
reg clk,res;
wire RX;
wire TX;
reg[45:0] RX_send; // 里面装有串口字节发送数据
assign RX = RX_send[0]; // 连接RX
reg[12:0] con;
URAT_top URAT_top(
clk,
res,
RX,
TX
);
// 初值
initial begin
clk<=0;res<=0;con<=0;RX_send<={1'b1,8'h09,1'b0,1'b1,8'h06,1'b0,1'b1,8'h0a,1'b0,16'hffff}; //结束位,字节,起始位,空闲(往右输出)
#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
modelsim:
忘记
reg en_dout_pro;
en_dout_pro<=0; reg型变量清零
{1’b1,8’h09,1’b0,1’b1,8’h06,1’b0,1’b1,8’h0a,1’b0,16’hffff}
发送的数据 8’h09, 8’h06,发送的操作符8’h0a;
应该接收8’h0f:0000_1111
低位先接收,则波形为:起始位0+1111_0000