当前位置:文档之家› 数字系统设计实验三

数字系统设计实验三

实验四简易数字钟下载1、实验目的1)学习掌握数字系统综合设计方法。

2)学习掌握层次设计方法。

3)学习掌握设计下载方法。

4)学习掌握实验系统使用方法。

2、实验原理数字钟是对输入时基秒脉冲进行计数,依次输出秒数值、分数值、小时数值,从而确定时钟时间,其原理框图如下图所示。

Image简易数字钟原理图简易数字钟原理图实际的数字钟设计中还需要增加年月日的功能,这里框图中也省略了校时功能的结构。

3、实验内容1)选择XC2S200PQ208器件建立一个新的工程。

2)在上述工程中,采用VHDL语言的方法设计上述简易数字钟。

3)参考实验系统使用说明,按下列要求锁定引脚。

秒、分钟、小时由实验系统的J1、J2输出,显示输出的时分秒间隔一位数码管。

时钟输入由J7的1脚输入。

4)下载编程并验证设计结果。

4、实验设备1)清华同方PⅣ 2.4G\256M60G2)ISE 6.2i—Windows软件系统3)多功能EDA实验系统(V型)5、实验步骤1)写出简易数字钟的设计程序。

2)画出简易数字钟的仿真波形。

3)将程序下载到芯片中。

a.首先点击菜单Assignments->Device,选择Device family->Cyclone IV E,然后选择芯片型号Available device->EP4CE6F17C8。

b.进行管脚锁定,选择菜单Assignments->Pin Planner,在Location列下为输入\输出变量选择对应的管脚进行锁定。

c.选择快捷菜单进行编译Start Compilation,生成下载文件。

d.点击Tools->Programmere.点击Add Device,在Device->Cyclone IVE中,选择Devicename->EP4CE6F17f.点击Add File,点开Output_file文件夹,选择*.sof文件g.删除显示为none的EP4CE6F17文件h.点击Start,进行下载。

实验板的晶振为50MHZ,数码管扫描频率为1000HZ。

管脚锁定为:clk_in PIN_E1 //1HZ的时钟脉冲信号clr PIN_E15 //将时间设置为00:00:00clr1 PIN_E16 //将时间设置为19:58:58clr2 PIN_M16 //将时间设置为23:58:58led_dig[7] PIN_A5 //数码管显示led_dig[6] PIN_B8led_dig[5] PIN_A7led_dig[4] PIN_B6led_dig[3] PIN_B5led_dig[2] PIN_A6led_dig[1] PIN_A8led_dig[0] PIN_B7led_sel[5] PIN_A4 //数码管选择led_sel[4] PIN_B4led_sel[3] PIN_A3led_sel[2] PIN_B3led_sel[1] PIN_A2led_sel[0] PIN_B16、程序代码clock.vmodule clock (clk_1Hz,clr,clr1,clr2,secH,secL,minH,minL,houH,houL);input clk_1Hz;input clr,clr1,clr2;output [3:0] secH,secL,minH,minL,houH,houL;reg [3:0] secTempH,secTempL,minTempH,minTempL,houTempH,houTempL; reg warn;wire secLQ,secHQ,minLQ,minHQ,houLQ;always@(posedge clk_1Hz or negedge clr or negedge clr1 or negedge clr2)begin:P1//秒个位----------------------if(clr==1'b0)secTempL<=4'b0000;else if(clr1==1'b0)secTempL<=4'b1000;else if(clr2==1'b0)secTempL<=4'b1000;else beginif(secTempL==4'b1001)secTempL<=4'b0000;elsesecTempL<=secTempL+1'b1;endendassign secL=secTempL;assign secLQ=secTempL[3]&(~secTempL[2])&(~secTempL[1])&secTempL[0]; //秒十位-------------------------always@(posedge clk_1Hz or negedge clr or negedge clr1 or negedge clr2)begin:P2if(clr==1'b0)secTempH<=4'b0000;else if(clr1==1'b0)secTempH<=4'b0101;else if(clr2==1'b0)secTempH<=4'b0101;else beginif(secLQ==1'b1)beginif(secTempH==4'b0101)secTempH<=4'b0000;else secTempH<=secTempH+1'b1;endendendassign secH=secTempH;assign secHQ=(~secTempH[3])&secTempH[2]& (~secTempH[1])&secTempH[0]&secTempL[3]&(~secTempL[2])&(~secTempL[1])&secTempL[0];//secTempH=0101,secTempL=1001//分个位-----------------always@(posedge clk_1Hz or negedge clr or negedge clr1 or negedge clr2)begin:P3if(clr==1'b0)minTempL<=4'b0000;else if(clr1==1'b0)minTempL<=4'b1000;else if(clr2==1'b0)minTempL<=4'b1000;else beginif(secHQ==1'b1)beginif(minTempL==4'b1001)minTempL<=4'b0000;elseminTempL<=minTempL+1'b1;endendendassign minL=minTempL;assign minLQ=minTempL[3]&(~minTempL[2])& (~minTempL[1])&minTempL[0]&(~secTempH[3])&secTempH[2]&(~secTempH[1])&secTempH[0]&secTempL[3]&(~secTempL[2])&(~secTempL[1])&secTempL[0];//minTempL=1001,secTempH=0101,secTempL=1001//分十位------------------always@(posedge clk_1Hz or negedge clr or negedge clr1 or negedge clr2)begin:P4if(clr==1'b0)minTempH<=4'b0000;else if(clr1==1'b0)minTempH<=4'b0101;else if(clr2==1'b0)minTempH<=4'b0101;else beginif(minLQ==1'b1)beginif(minTempH==4'b0101)minTempH<=4'b0000;elseminTempH<=minTempH+1'b1;endendendassign minH=minTempH;assign minHQ=(~minTempH[3])&minTempH[2]& (~minTempH[1])&minTempH[0]&minTempL[3]&(~minTempL[2])&(~minTempL[1])&minTempL[0]&(~secTempH[3])&secTempH[2]&(~secTempH[1])&secTempH[0]&secTempL[3]&(~secTempL[2])&(~secTempL[1])&secTempL[0];//minTempH=0101,minTempL=1001,secTempH=0101,secTempL=1001//时个位--------------always@(posedge clk_1Hz or negedge clr or negedge clr1 or negedge clr2)begin:P5if(clr==1'b0)houTempL<=4'b0000;else if(clr1==1'b0)houTempL<=4'b1001;else if(clr2==1'b0)houTempL<=4'b0011;else beginif(minHQ==1'b1)beginif(houTempL==4'b1001)houTempL<=4'b0000;else if(houTempL==4'b0011&houTempH==4'b0010)houTempL<=4'b0000;elsehouTempL<=houTempL+1'b1;endendendassign houL=houTempL;assign houLQ=((~houTempH[3])&(~houTempH[2])&houTempH[1]&(~houTempH[0])&(~houTempL[3])&(~houTempL[2])&houTempL[1]&houTempL[0]|houTempL[3]&(~houTempL[2])&(~houTempL[1])&houTempL[0])&(~minTempH[3])&minTempH[2]&(~minTempH[1])&minTempH[0]&minTempL[3]&(~minTempL[2])&(~minTempL[1])&minTempL[0]&(~secTempH[3])&secTempH[2]&(~secTempH[1])&secTempH[0]&secTempL[3]&(~secTempL[2])&(~secTempL[1])&secTempL[0];//(houTempH=0010,houTempL=0011|houTempL=1001),minTempH=0101,minTempL=10 //时十位----------------always@(posedge clk_1Hz or negedge clr or negedge clr1 or negedgeclr2)begin:P6if(clr==1'b0)houTempH<=4'b0000;else if(clr1==1'b0)houTempH<=4'b0001;else if(clr2==1'b0)houTempH<=4'b0010;else beginif(houLQ==1'b1)beginif(houTempH==4'b0010&houTempL==4'b0011)houTempH<=4'b0000;elsehouTempH<=houTempH+1'b1;endendendassign houH=houTempH;endmodulefreq_div1.vmodule freq_div1(clk_in_50MHz,clk_out_1Hz,clk_out_1KHz);input clk_in_50MHz;output clk_out_1Hz,clk_out_1KHz;reg[25:0] temp_counter;always @ (posedge clk_in_50MHz)beginif(temp_counter == 26'd49_999_999)temp_counter <= 26'd0;elsetemp_counter <= temp_counter + 26'd1;endassign clk_out_1Hz = temp_counter[25];assign clk_out_1KHz = temp_counter[14];endmodulefreq_div.vmodule freq_div(clk_in_50MHz,clk_out_1Hz,clk_out_1KHz); input clk_in_50MHz;output clk_out_1Hz,clk_out_1KHz;reg clk_out_1Hz,clk_out_1KHz;reg[15:0] temp_counter_1KHz;reg[8:0] temp_counter_1Hz;reg temp_clk_out_1KHz;reg temp_clk_out_1Hz;//reg temp_counter_1Hz;parameter N_1KHz=50000;parameter N_1Hz=1000;always@(posedge clk_in_50MHz)if(N_1KHz%2==0)beginif(temp_counter_1KHz<N_1KHz/2-1)begintemp_counter_1KHz<=temp_counter_1KHz+1'b1; endelsebegintemp_counter_1KHz<=16'b0;temp_clk_out_1KHz<=~temp_clk_out_1KHz;endclk_out_1KHz<=temp_clk_out_1KHz;endalways@(posedge temp_clk_out_1KHz)if(N_1Hz%2==0)beginif(temp_counter_1Hz<N_1Hz/2-1)begintemp_counter_1Hz<=temp_counter_1Hz+1'b1; endelsebegintemp_counter_1Hz<=16'b0;temp_clk_out_1Hz<=~temp_clk_out_1Hz;endclk_out_1Hz<=temp_clk_out_1Hz;endendmoduledisplay.vmodule display(led_sel_in,secH,secL,minH,minL,houH,houL,led_dig,led_sel_out);input[5:0] led_sel_in;input[3:0] secH,secL,minH,minL,houH,houL;output[7:0] led_dig;output[7:0] led_sel_out;reg[7:0] led_dig;reg[3:0] dig_temp;assign led_sel_out=led_sel_in;always@(led_sel_in,secH,secL,minH,minL,houH,houL) begincase(led_sel_in)6'b111110:dig_temp<=secL;6'b111101:dig_temp<=secH;6'b111011:dig_temp<=minL;6'b110111:dig_temp<=minH;6'b101111:dig_temp<=houL;6'b011111:dig_temp<=houH;endcasecase(dig_temp)4'd0:led_dig<=8'b11000000; 4'd1:led_dig<=8'b11111001; 4'd2:led_dig<=8'b10100100; 4'd3:led_dig<=8'b10110000; 4'd4:led_dig<=8'b10011001; 4'd5:led_dig<=8'b10010010; 4'd6:led_dig<=8'b10000010; 4'd7:led_dig<=8'b11111000; 4'd8:led_dig<=8'b10000000; 4'd9:led_dig<=8'b10010000; endcaseendendmodulescanner.vmodule scanner(clk_in,led_sel); input clk_in;output[5:0] led_sel;reg[5:0] led_sel;integer i;always@(posedge clk_in) begincase(i)0:beginled_sel<=6'b111110; i=1;end1:beginled_sel<=6'b111101; i=2;end2:beginled_sel<=6'b111011; i=3;end3:beginled_sel<=6'b110111; i=4;end4:beginled_sel<=6'b101111; i=5;end5:beginled_sel<=6'b011111; i=0;endendcaseendendmodulejyszz.vmodule jyszz(clk_in,clr,clr1,clr2,led_sel,led_dig);input clk_in,clr,clr1,clr2;output[5:0] led_sel;output[7:0] led_dig;wire clk_1Hz,clk_1KHz;wire[5:0] led_sel_temp;wire[3:0] secL,secH,minL,minH,houL,houH;freq_div freq_div0(clk_in,clk_1Hz,clk_1KHz);scanner scanner0(clk_1KHz,led_sel_temp);clock clock0(clk_1Hz,clr,clr1,clr2,secH,secL,minH,minL,houH,houL); display display0(led_sel_temp,secH,secL,minH,minL,houH,houL,led_dig,led_sel);endmodule。

相关主题