Verilog数字系统设计教程[第4版]夏宇闻——第三部分练习十

Verilog数字系统设计教程[第4版]夏宇闻——第三部分练习十

测试仿真流程

测试仿真环境为win系统下的quartus prime + modelsim
测试仿真流程参照我之前的教程
Verilog数字系统设计教程第4版夏宇闻——第三部分练习一

模块源代码

//----------P_S.v----------
`define YES 1
`define NO 0

module P_S(Dbit_out,link_S_out,data,nGet_AD_data,clk);
input clk;										//主时钟节拍
input nGet_AD_data;							//负电平有效时取并行数据控制信号线
input[7:0] data;								//并行输入的数据端口
output Dbit_out;								//串行位流的输出
output link_S_out;							//允许串行位流输出的控制信号

reg[3:0] state;								//状态变量寄存器
reg[7:0] data_buf;							//并行数据缓存器
reg link_S_out;								//串行位流输出的控制信号寄存器
reg d_buf;										//位缓存器
reg finish_flag;								//字节处理结束标志

assign Dbit_out = (link_S_out)?d_buf:0;//给出串行数据

always@(posedge clk or negedge nGet_AD_data)				//nGet_AD_data下降沿置数,寄存器清零,clk上跳沿送出位流
	if(!nGet_AD_data)
		begin
			finish_flag	<= 0;
			state			<= 9;
			link_S_out	<= `NO;
			d_buf			<= 0;
			data_buf		<= 0;
		end
	else
		case(state)
			9:
				begin
					data_buf		<= data;
					state			<= 10;
					link_S_out	<= `NO;
				end
			10:
				begin
					data_buf		<= data;
					state			<= 0;
					link_S_out	<= `NO;
				end
			0:
				begin
					link_S_out	<= `YES;
					d_buf			<= data_buf[7];
					state			<= 1;
				end
			1:
				begin
					d_buf			<= data_buf[6];
					state			<= 2;
				end
			2:
				begin
					d_buf			<= data_buf[5];
					state			<= 3;
				end
			3:
				begin
					d_buf			<= data_buf[4];
					state			<= 4;
				end
			4:
				begin
					d_buf			<= data_buf[3];
					state			<= 5;
				end
			5:
				begin
					d_buf			<= data_buf[2];
					state			<= 6;
				end
			6:
				begin
					d_buf			<= data_buf[1];
					state			<= 7;
				end
			7:
				begin
					d_buf			<= data_buf[0];
					state			<= 8;
				end
			8:
				begin
					link_S_out	<= `NO;
					state			<= 4'b1111;				//do nothing state
					finish_flag	<= 1;
				end
			default:
				begin
					link_S_out	<= `NO;
					state			<= 4'b1111;				//do nothing state
				end
		endcase
		
endmodule

//----------S_P.v----------
`timescale 1ns/1ns
`define YES 1
`define NO 0

module S_P(data,Dbit_in,Dbit_ena,clk);
output[7:0] data;								//并行数据输出口
input Dbit_in,clk;							//字节位流输出口
input Dbit_ena;								//字节位流使能输出口

reg[7:0] data_buf;
reg[3:0] state;								//状态变量寄存器
reg p_out_link;								//并行输出控制寄存器

assign data = (p_out_link==`YES)?data_buf:8'bz;

always@(negedge clk)
	if(Dbit_ena)
		case(state)
			0:
				begin
					p_out_link	<= `NO;
					data_buf[7]	<= Dbit_in;
					state			<= 1;
				end
			1:
				begin
					data_buf[6]	<= Dbit_in;
					state			<= 2;
				end
			2:
				begin
					data_buf[5]	<= Dbit_in;
					state			<= 3;
				end
			3:
				begin
					data_buf[4]	<= Dbit_in;
					state			<= 4;
				end
			4:
				begin
					data_buf[3]	<= Dbit_in;
					state			<= 5;
				end
			5:
				begin
					data_buf[2]	<= Dbit_in;
					state			<= 6;
				end
			6:
				begin
					data_buf[1]	<= Dbit_in;
					state			<= 7;
				end
			7:
				begin
					data_buf[0]	<= Dbit_in;
					state			<= 8;
				end
			8:
				begin
					p_out_link	<= `YES;
					state			<= 4'b1111;
				end
			default: state		<= 0;
		endcase
	else
		begin
			p_out_link	<= `YES;
			state			<= 0;
		end

endmodule

//----------sys.v----------
module sys(databus,use_p_in_bus,Dbit_out,Dbit_ena,nGet_AD_data,clk);
input nGet_AD_data;										//取并行数据的控制信号
input use_p_in_bus;										//并行总线用于输入数据的控制信号
input clk;													//主时钟
inout[7:0] databus;										//双向并行数据总线
output Dbit_out;											//字节位流输出
output Dbit_ena;											//字节位流输出使能

wire clk;
wire nGet_AD_data;
wire Dbit_out;
wire Dbit_ena;
wire[7:0] data;

assign databus = (!use_p_in_bus)?data:8'bzzzz_zzzz;

P_S m0(.Dbit_out(Dbit_out),.link_S_out(Dbit_ena),.data(databus),.nGet_AD_data(nGet_AD_data),.clk(clk));
S_P m1(.data(data),.Dbit_in(Dbit_out),.Dbit_ena(Dbit_ena),.clk(clk));

endmodule

测试模块代码

//----------sys.vt----------
`timescale 1 ns/ 1 ns

module sys_vlg_tst();
reg clk;
reg[7:0] data_buf;
reg nGet_AD_data;
reg D_Pin_ena;								//并行数据输入sys模块的使能信号寄存器
wire[7:0] data;
wire clk2;                            
wire Dbit_ena;

assign data = (D_Pin_ena)?data_buf:8'bz;

initial
	begin
		clk = 0;
		nGet_AD_data = 1;					//置取数据控制信号初始值为高电平
		data_buf = 8'b1001_1001;		//假设数据缓存器的初始值,可用于模拟并行数据的变化
		D_Pin_ena = 0;
	end
	
initial
	begin
		repeat(100)
			begin
				#(100*14+{$random}%23) nGet_AD_data=0;				//取并行数据并开始
				#(112+{$random}%12)	  nGet_AD_data=1;				//保持一定时间低电平后恢复高电平
				#({$random}%50)		  D_Pin_ena=1;					//并行数据输入sys模块的使能信号有效
				#(100*3+{$random}%5)	  D_Pin_ena=0;					//保持三个时钟周期后让出总线
				#333						  data_buf=data_buf+1;		//假设数据变化,可为下次取得不同的数据
				#(100*11+{$random}%1000);
			end
	end
	
always #(50+$random%2) clk = ~clk;	//主时钟的产生

sys i1 ( 
	.Dbit_ena(Dbit_ena),
	.Dbit_out(Dbit_out),
	.clk(clk),
	.databus(data),
	.nGet_AD_data(nGet_AD_data),
	.use_p_in_bus(D_Pin_ena)
);
                                                  
endmodule

结果波形

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值