大家好,欢迎来到IT知识分享网。
实验一 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)
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
实验仿真结果
实验二 组合逻辑电路设计
实验内容
应用文本输入方式设计实现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 译码器
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 )
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 二十进制计数器
一个带计数使能、置位功能及异步清 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)
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 位串入/并出左移移位寄存器
设计 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) 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
实验仿真结果
实验六 数字频率计设计
实验内容
设计 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
实验仿真结果
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/21349.html