verilog 串口指令处理器

在这里插入图片描述
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

在这里插入图片描述


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值