Verilog HDL|实验项目六例

Verilog HDL|实验项目六例实验一EDA设计软件的使用实验内容

大家好,欢迎来到IT知识分享网。

实验一 EDA 设计软件的使用

实验内容

实现1 位全加器

Verilog HDL|实验项目六例

图 1 在顶层编辑窗中设计好全加器 

程序代码

module MULT4B(RX,AX,BX);
	output [3:0] RX;	input [3:0] AX,BX;
	reg[7:0] TA,RX;     reg [3:0] TB;
 	  always @(AX or BX)
	begin
      RX=0;  TA=AX;  TB=BX;
 	  repeat(4)  begin
		if (TB[0])  begin RX=RX+TA;	end
 		  TA=TA<<1;	TB=TB>>1;     end
	  end
endmodule

实验仿真结果

Verilog HDL|实验项目六例Verilog HDL|实验项目六例 

实验二 组合逻辑电路设计 

实验内容

应用文本输入方式设计实现16-4 优先编码器,要求进行编译、仿真,仿真结果正确。掌握 CASE 语句和 IF语句的使用方法。应用文本输入方式设计实现 4-16 译码器,要求进行编译、仿真,仿真结果正确。

程序代码

4-16 译码器

/* 4-16 译码器 */
module CODE4_16(aa,bb);
	input [3:0] aa;
	output reg[15:0] bb;
	reg [15:0] bb;
	always@(aa)
	begin
	case(aa)
	4'b0000:OUT=16'b0000_0000_0000_0001;
	4'b0001:OUT=16'b0000_0000_0000_0001;
	4'b0010:OUT=16'b0000_0000_0000_0001;
	4'b0011:OUT=16'b0000_0000_0000_0001;
	4'b0100:OUT=16'b0000_0000_0000_0001;
	4'b0101:OUT=16'b0000_0000_0000_0001;
	4'b0110:OUT=16'b0000_0000_0000_0001;
	4'b0111:OUT=16'b0000_0000_0000_0001;
	4'b1000:OUT=16'b0000_0000_0000_0001;
	4'b1001:OUT=16'b0000_0000_0000_0001;
	4'b0000:OUT=16'b0000_0000_0000_0001;
	endcase
	end
endmodule

 16-4 优先编码器

/* 16-4 优先编码器 */
module CODE16_4(x,y,e);
	input wire [15:0] x ;
	output reg [3:0] y;
	output reg       e;
	integer i;
	integer j=0;
	always@(*)
		begin
			for(i=0;i<16;i=i+1)
				begin
					if(x[i]==1) y<=i;
					else		j=j+1;
				end
				if(j==16) e<= 1;
				else	  e<=0;
		end
endmodule

实验仿真结果

4-16 译码器

Verilog HDL|实验项目六例Verilog HDL|实验项目六例

16-4 优先编码器

Verilog HDL|实验项目六例

Verilog HDL|实验项目六例

实验三  N 进制计数器设计

实验内容

1.设计并实现一个带计数使能、进位输出及同步清 0 的增 1 二十进制计数器。

程序代码

module CNT20 (CLK,RST,EN,LOAD,COUT,DOUT,DATA);
	input CLK,EN,RST,LOAD;
	input[4:0] DATA;
	output[4:0] DOUT;
	output COUT;
	reg[4:0] Q1;  reg COUT;
	assign DOUT = Q1;
	always@(posedge CLK )
		begin
		if(!RST) Q1<=0;
		else if(EN) begin
			if(!LOAD) Q1<=DATA;
		else if(Q1<20) Q1<=Q1+1;
		else Q1<=5'b00000;end
		end
	always @(Q1)
		if(Q1==5'b10100) COUT = 1'b1;else COUT=1'b0;
endmodule

2.设计并实现一个带计数使能、置位功能及异步清 0 的增 1/减 1 的 8 位二进制计数器。

程序代码

module CNT8_2 (CLK,RST,EN,LOAD,DOUT,DATA,flag);
	input CLK,EN,RST,LOAD,flag;
	input[7:0] DATA;
	output[7:0] DOUT;
	reg[7:0] Q1; 
	assign DOUT = Q1;
	always@(posedge CLK or negedge RST )
			begin
			if(!RST) Q1<=0;
			else if(EN) begin
				if(!LOAD) Q1<=DATA;
				
			else if(flag==1)begin
				if(Q1<8'b11111111) Q1<=Q1+1;
			    else Q1<=8'b00000000;end
			else if(flag==0)begin
				if(Q1>8'b00000000) Q1<=Q1-1;
			    else Q1<=8'b11111111;end
			end
	     end
endmodule

实验仿真结果

带计数使能、进位输出及同步清 0 的增 1 二十进制计数器

Verilog HDL|实验项目六例Verilog HDL|实验项目六例

Verilog HDL|实验项目六例

一个带计数使能、置位功能及异步清 0 的增 1/减 1 的 8 位二进制计数器

Verilog HDL|实验项目六例Verilog HDL|实验项目六例Verilog HDL|实验项目六例

实验四 移位寄存器设计

实验内容

1.设计 6 位串入/并出左移移位寄存器

要求:输入的数据是每次一位依序进入,故输入、输出信号之间有 6 个 CLK 时间的延迟。为了过滤中间没用的数据,只读取完整的存储数据,可将取样脉冲的周期设定成 CLK 脉冲的六倍,也就是说,每经过 6 个 CLK 脉冲后再读取数据一次,便能每次读取都得到正确的数据。

程序代码

module SHIF6L(clk,din,dout);
	input clk;
	input din;
	output [5:0] dout;
	reg [5:0] dout;
	reg [5:0] qtemp;
	reg [2:0] temp;
 
	always@(posedge clk)
		begin
			if(temp<=5)
				begin
					qtemp <= {qtemp[4:0],din};
					temp <=temp+1;
				end
			else if(temp>5)  temp<=0;		
		end
	always@(temp)	
		begin
			if(temp>5) 
				dout<=qtemp;
		end
endmodule

2.设计 6 位并入/串出右移移位寄存器

要求:输入的数据是 6 位一次进入,每经过 1 个 CLK 脉冲后串行输出 1 位数据。

程序代码

module SHIF6R(clk,din,dout);
	input [5:0] din;
	input clk;
	output dout;
	wire dout;
	reg [5:0] qtemp;
	(* synthesis,keep *) wire en;
	reg [2:0] temp;
	always@(posedge clk )
		begin
			if(en == 1)qtemp <= din; 
				
			else qtemp <= {qtemp[0],qtemp[5:1]};		
		end
		assign en=(temp==5)? 1:0;
		assign dout = qtemp[0];
		
		always@(posedge clk)
		begin
		if(temp<5)temp <=temp+1;
		else temp<=0;
		end
endmodule

实验仿真结果

设计 6 位串入/并出左移移位寄存器

Verilog HDL|实验项目六例Verilog HDL|实验项目六例Verilog HDL|实验项目六例

设计 6 位并入/串出右移移位寄存器

Verilog HDL|实验项目六例Verilog HDL|实验项目六例

验五 用状态机设计实现 ADC0809 采样控制器

实验内容

1. 分析 ADC0809 采样控制器的时序,划分状态,并画出状态图,实现 VERILOG HDL 描述,进行仿真测试及硬件测试。

2. 利用 QuartusII 对例 10-2 进行文本编辑输入和仿真测试;给出仿真波形。最后进行引脚锁定并进行测试,硬件验证例 10-2 电路对 ADC0809 的控制功能。12

3. 测试步骤:建议选择电路模式 No.5,由对应的电路图可见, ADC0809 的转换时钟 CLK 已经事先接有 750kHz 的频率,引脚锁定为:START 接 PIO34,OE(ENABLE)接 PIO35,EOC接 PIO8,ALE 接 PIO33,状态机时钟 CLK 接 clock0,ADDA接 PIO32(ADDB 和 ADDC 都接 GND),ADC0809 的 8 位输出数 据线接 PIO23~PIO16,锁存输出 Q 显示于数码 8/数码7(PIO47~PIO40)。

4. 实验操作:将 GW48 EDA 系统左下角的拨码开关的 4、6、7 向下拨其余向上,即使 0809 工作使能,及使 FPGA 能接受来自 0809 转换结束的信号(对于 GW48-CK 系统,左下角选择插针处的“转换结束”和“A/D 使能”用二短路帽短接)。下载 ADC0809 中的 ADCINT.sof 到实验板的 FPGA 中;clock0 的短路帽接可选 12MHz、6MHz、65536Hz 等频率;按动一次右侧的复位键;用螺丝刀旋转 GW48 系统左下角的精密电位器,以便为 ADC0809 提供变化的待测模拟信号(注意,这时必须在例 8-2 中赋值:ADDA <= ‘1’,这样就能通过实验系统左下的 AIN1 输入端与电位器相接,并将信号输入 0809 的 IN1 端)。这时数码管 8 7 将显示 ADC0809 采样的数字值(16 进制),数据来自 FPGA 的输出。数码管 2 和 1 也将显示同样数据,此数据直接来自 0809 的数据口。实验结束后注意将拨码开关拨向默认:仅“4”向下。

程序代码

module ADDC0809(D,CLK,EOC,RST,ALE,START,OE,ADDA,Q,LOCK_T);
	input [7:0] D;
	input CLK,RST;
	input EOC;
	output ALE;
	output START,OE;
	output ADDA,LOCK_T;
	output [7:0] Q;
	reg ALE,START,OE;
	parameter s0=0,s1=1,s2=2,s3=3,s4=4;
	reg [4:0] cs,next_state;
	reg [7:0] REGL;reg LOCK;
	always@(cs or EOC) begin
		case (cs)
		  s0:begin ALE=0;START=0;OE=0;LOCK=0;
				  next_state<=s1; end
		  s1:begin ALE=1;START=1;OE=0;LOCK=0;
				  next_state<=s2; end
		  s2:begin ALE=0;START=0;OE=0;LOCK=0;
			if(EOC==1'b1) next_state<=s3; 
			else next_state<=s2;  end 
		  s3:begin ALE=0;START=0;OE=1;LOCK=0;
				next_state<=s4; end
		  s4:begin ALE=0;START=0;OE=1;LOCK=1;
				next_state<=s0; end
		  default:begin ALE=0;START=0;OE=0;LOCK=0;
				next_state<=s0; end
		endcase end
	always@(posedge CLK or posedge RST) begin
			if(RST) cs<=s0;else cs <=next_state; end
	always@(posedge LOCK) if(LOCK) REGL<=D;
	assign ADDA=1;assign Q=REGL;
	assign LOCK_T=LOCK;
	endmodule

实验仿真结果

Verilog HDL|实验项目六例Verilog HDL|实验项目六例

实验六 数字频率计设计

实验内容

设计 8 位十进制频率计,学习较复杂的数字系统设计方法。

程序代码

module FREQ_C ( CLK1Hz,Fin,DATOUT);
	input CLK1Hz;
	input Fin;
	output [31:0] DATOUT;
	wire CNT_EN;
	wire LOAD;
	wire reset;
	FTCTRL ftctrl (
		.CLKK(CLK1Hz),
		.RST_CNT(reset),
		.CNT_EN(CNT_EN),
		.LOAD(LOAD)
	);
	wire [3:0] DATA1;
	wire c1;
	COUNTER32 u1 (
		.CLR(reset),
		.ENABL(CNT_EN),
		.Fin(Fin),
		.DOUT(DATA1),
		.COUT(c1)
	);
	
	wire [3:0] DATA2;
	wire c2;
	COUNTER32 u2 (
		.CLR(reset),
		.ENABL(CNT_EN),
		.Fin(c1),
		.DOUT(DATA2),
		.COUT(c2)
	);
	
	wire [3:0] DATA3;
	wire c3;
	COUNTER32 u3 (
		.CLR(reset),
		.ENABL(CNT_EN),
		.Fin(c2),
		.DOUT(DATA3),
		.COUT(c3)
	);	
	
	wire [3:0] DATA4;
	wire c4;
	COUNTER32 u4 (
		.CLR(reset),
		.ENABL(CNT_EN),
		.Fin(c3),
		.DOUT(DATA4),
		.COUT(c4)
	);
	
	wire [3:0] DATA5;
	wire c5;
	COUNTER32 u5 (
		.CLR(reset),
		.ENABL(CNT_EN),
		.Fin(c4),
		.DOUT(DATA5),
		.COUT(c5)
	);
	
	wire [3:0] DATA6;
	wire c6;
	COUNTER32 u6 (
		.CLR(reset),
		.ENABL(CNT_EN),
		.Fin(c5),
		.DOUT(DATA6),
		.COUT(c6)
	);
	
	wire [3:0] DATA7;
	wire c7;
	COUNTER32 u7 (
		.CLR(reset),
		.ENABL(CNT_EN),
		.Fin(c6),
		.DOUT(DATA7),
		.COUT(c7)
	);
	
	wire [3:0] DATA8;
	wire c8;
	COUNTER32 u8 (
		.CLR(reset),
		.ENABL(CNT_EN),
		.Fin(c7),
		.DOUT(DATA8),
		.COUT(c8)
	);
	
	wire [31:0] DATOUT;
	wire [31:0] DAIN;
	 assign DAIN ={DATA8,DATA7,DATA6,DATA5,DATA4,DATA3,DATA2,DATA1};
	
	REG32B reg32b(
		.LK(LOAD),
		.DIN(DAIN),
		.DAT32(DATOUT)
	);
Endmodule


module 	COUNTER32 (CLR,	ENABL,	Fin,	DOUT, COUT);
	input CLR;
	input ENABL;
	input Fin;
	output  COUT;
	output [3 :0] DOUT;
	reg [3 :0] DOUT;
	reg COUT;
	always @ (posedge Fin or posedge CLR )
		if (CLR)
			DOUT<=0;
		else if (ENABL==1)
		  begin
             if( DOUT<9) 
			   DOUT<=DOUT +1;
		    else
			  DOUT<=0;
		  end
		  
		always @(DOUT)
		   if (DOUT==9)	
		      COUT<=1;
		     else
		      COUT<=0;	
endmodule

 
module FTCTRL (CLKK,CNT_EN,RST_CNT,LOAD);
        input CLKK;
        output CNT_EN,RST_CNT,LOAD;
        wire   CNT_EN,LOAD;
        reg RST_CNT,Div2CLK;
        always @ (posedge CLKK)
               Div2CLK <= ~Div2CLK;
        always @(CLKK or Div2CLK)
               begin 
                      if (CLKK == 1'b0 & Div2CLK == 1'b0)
                             RST_CNT <= 1'b1;
                      else 
                             RST_CNT <= 1'b0;
               end
        assign LOAD   =  ~Div2CLK;
        assign CNT_EN =  Div2CLK;
endmodule
 
 
module REG32B (LK, DIN, DAT32);
 
input LK;
input [9:0] DIN;
output [9:0] DAT32;
reg [9:0] DAT32;
always @ (posedge LK)
		if(LK)
			DAT32<=DIN;
		else
			DAT32<=DAT32;
endmodule

实验仿真结果

Verilog HDL|实验项目六例Verilog HDL|实验项目六例Verilog HDL|实验项目六例Verilog HDL|实验项目六例

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/21349.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信