实验一 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