当前位置: 代码迷 >> 综合 >> Verilog HDL|实验项目六例
  详细解决方案

Verilog HDL|实验项目六例

热度:59   发布时间:2023-11-21 12:39:45.0

实验一 EDA 设计软件的使用

实验内容

实现1 位全加器

图 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)beginRX=0;  TA=AX;  TB=BX;repeat(4)  beginif (TB[0])  begin RX=RX+TA;	endTA=TA<<1;	TB=TB>>1;     endend
endmodule

实验仿真结果

 

实验二 组合逻辑电路设计 

实验内容

应用文本输入方式设计实现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)begincase(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;endcaseend
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@(*)beginfor(i=0;i<16;i=i+1)beginif(x[i]==1) y<=i;else		j=j+1;endif(j==16) e<= 1;else	  e<=0;end
endmodule

实验仿真结果

4-16 译码器

16-4 优先编码器

实验三  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 )beginif(!RST) Q1<=0;else if(EN) beginif(!LOAD) Q1<=DATA;else if(Q1<20) Q1<=Q1+1;else Q1<=5'b00000;endendalways @(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 )beginif(!RST) Q1<=0;else if(EN) beginif(!LOAD) Q1<=DATA;else if(flag==1)beginif(Q1<8'b11111111) Q1<=Q1+1;else Q1<=8'b00000000;endelse if(flag==0)beginif(Q1>8'b00000000) Q1<=Q1-1;else Q1<=8'b11111111;endendend
endmodule

实验仿真结果

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

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

实验四 移位寄存器设计

实验内容

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)beginif(temp<=5)beginqtemp <= {qtemp[4:0],din};temp <=temp+1;endelse if(temp>5)  temp<=0;		endalways@(temp)	beginif(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 )beginif(en == 1)qtemp <= din; else qtemp <= {qtemp[0],qtemp[5:1]};		endassign en=(temp==5)? 1:0;assign dout = qtemp[0];always@(posedge clk)beginif(temp<5)temp <=temp+1;else temp<=0;end
endmodule

实验仿真结果

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

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

验五 用状态机设计实现 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) begincase (cs)s0:begin ALE=0;START=0;OE=0;LOCK=0;next_state<=s1; ends1:begin ALE=1;START=1;OE=0;LOCK=0;next_state<=s2; ends2: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; ends4:begin ALE=0;START=0;OE=1;LOCK=1;next_state<=s0; enddefault:begin ALE=0;START=0;OE=0;LOCK=0;next_state<=s0; endendcase endalways@(posedge CLK or posedge RST) beginif(RST) cs<=s0;else cs <=next_state; endalways@(posedge LOCK) if(LOCK) REGL<=D;assign ADDA=1;assign Q=REGL;assign LOCK_T=LOCK;endmodule

实验仿真结果

实验六 数字频率计设计

实验内容

设计 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));
Endmodulemodule 	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)beginif( DOUT<9) DOUT<=DOUT +1;elseDOUT<=0;endalways @(DOUT)if (DOUT==9)	COUT<=1;elseCOUT<=0;	
endmodulemodule 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;endassign LOAD   =  ~Div2CLK;assign CNT_EN =  Div2CLK;
endmodulemodule 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;elseDAT32<=DAT32;
endmodule

实验仿真结果