4位数码管动态扫描Verilog程序

合集下载

实验六 数码管的动态扫描显示--演示文稿

实验六 数码管的动态扫描显示--演示文稿
12
管脚排列示意图
1 2 3 4 5 6
四、实验平台
实验控制板: 21CONTROL 公司出品(广州康革科技生 产)以EP2C20Q240C8N为核心芯片的FPGA 产)以EP2C20Q240C8N为核心芯片的FPGA 开发板 注意:1 注意:1、编译未完成前不要给实验板上电; 2、下载前确认对未使用管脚配置为 “As input tri-stated”。 tri-stated”
三、实验原理
优点:节省大量的I/O端口,而且功耗更低。 优点:节省大量的I/O端口,而且功耗更低。 (静态显示则是每个数码管同时显示,每 个需要8 个需要8条引出端线。) 动态显示驱动电路:是将所有数码管的8 动态显示驱动电路:是将所有数码管的8个 显示笔划“ 显示笔划“a、b、c、d、e、f、g、dp”的同 dp” 名端连在一起,另外为每个数码管的公共 极增加位选通控制电路,位选通由各自独 立的I/O线控制 立的I/O线控制 。
四选 模块
同步的数 值信号
50M时钟 时钟
数码管译 码模块
数码管的 段选
五、实验编程方式
下载模式:JTAG; 下载模式:JTAG; 下载端口:LPT1(连到实验板JTAG口) 下载端口:LPT1(连到实验板JTAG口) 管教绑定说明 #Setup.tcl # Setup pin setting set_global_assignment -name RESERVE_ALL_UNUSED_PINS "As input tri-stated" triset_global_assignment -name ENABLE_INIT_DONE_OUTPUT OFF set_location_assignment PIN_116 -to rst set_location_assignment PIN_154 -to clk50M set_location_assignment PIN_6 -to led1 set_location_assignment PIN_7 -to led2

用verilog HDL设计的4位频率计

用verilog HDL设计的4位频率计

简单4位数字频率计设计一、 设计要求(1)、利用Verilog HDL 语言行为描述方法,设计一个简单的4位数字频率计; (2)、要求输入标准时钟信号频率为1MHz ,系统可计数频率范围为1Hz~9999Hz ; (3)、系统具有复位信号,且当计数频率发生溢出时能够给出指示信号,计数的频率通过4个共阴数码管进行显示(动态扫描显示)。

二、 系统结构框图4位数字频率计系统结构框图根据设计要求,输入系统的标准时钟信号要先经过分频后得到一个周期为2s 占空比50%的信号,用来对输入信号采样,得到采样信号GA TED_CLK ;为了能够控制计数模块对采样的信号进行正常计数及保存计数后的频率,这要求,要在计数器刚好完成计数后立即将数据输出给显示部分进行显示,并且要为下次计数做好准备,因此数据信号处理部分还要有产生控制计数器的两个信号LOAD 和COUNTER_CLR ,LOAD 信号控制计数完成后的数据及时输出给显示,COUNTER_CLR 信号控制计数器清零;计数模块就是完成对采样信号的计数,并当计数发生溢出时产生溢出信号FLOW_UP ;显示控制模块要完成将计数模块输入的信号进行译码显示。

三、 信号描述测试信号采样原理:Signal for testTo displaySignal for testGA TED_CLK 、LOAD 、COUNTER_CLR 信号的关系:COUNTER_CLRGATED_CLKLOAD四、 Verilog 程序各子模块verilog 程序:(1)信号处理模块_verilog : moduleFREQUENCY_COUNTROL_BLOCK(GATED_CLK,LOAD,COUNTER_CLR,CLK_IN,SIGNA L_TEST,RESET); output GATED_CLK; output LOAD; output COUNTER_CLR; input CLK_IN; input SIGNAL_TEST; input RESET; reg LOAD; reg COUNTER_CLR; reg DIVIDE_CLK; reg[19:0] cn; reg A1,A2;//信号分频:由CLK_IN 得到分频后的信号DIVIDE_CLK(0.5Hz) always @(posedge CLK_IN) begin if(RESET) begin DIVIDE_CLK<=0; cn<=0;endelse if(cn==1000000)begincn<=0;DIVIDE_CLK<=~DIVIDE_CLK;endelsecn<=cn+1;end//频率计数控制信号的产生:产生LOAD信号和COUNTER_CLR信号always @(posedge SIGNAL_TEST)beginA1<=~DIVIDE_CLK;endalways @(posedge SIGNAL_TEST)beginA2=A1;endalways @(A1 or A2)beginLOAD=A1&&(!A2);endalways @(posedge SIGNAL_TEST)COUNTER_CLR=LOAD;//产生驱动计数模块的信号GATED_CLK,也就是被计数模块检测的信号assign GATED_CLK=SIGNAL_TEST&DIVIDE_CLK;endmodule(2)、计数器模块:moduleFREQUENCY_COUNTER_BLOCK(COUT,FLOW_UP,CLOCK_IN,RESET,LOAD,COUNTER _CLR);output[15:0] COUT;output FLOW_UP;input CLOCK_IN;input LOAD;input COUNTER_CLR;input RESET;reg[15:0] TEMP;reg FLOW_UP;parameter B_SIZE=16; //二进制位宽,为便于移植,所有定义了成参数reg[B_SIZE+3:0] bcd; //转换后的BCD码的位数要比二进制多4位reg[B_SIZE-1:0] binary;reg[B_SIZE-1:0] bin;reg[B_SIZE+3:0] result;//计数器完成计数得到二进制表示的频率数值always @(CLOCK_IN or RESET or LOAD or COUNTER_CLR)beginif(RESET|COUNTER_CLR)beginTEMP<=0;FLOW_UP<=0;endelse if(LOAD)binary<=TEMP;else if(TEMP>9999)beginFLOW_UP<=1;binary<=9999;endelseif(CLOCK_IN)TEMP<=TEMP+1;end//将二进制表示(或十六进制表示)的数转换为BCD码的形式,便于数码管译码显示always @(binary or RESET)beginbin=binary;result=0;if(RESET)bcd<=0;elsebeginrepeat(B_SIZE-1)beginresult[0]=bin[B_SIZE-1];if(result[3:0]>4)result[3:0]=result[3:0]+4'd3;if(result[7:4]>4)result[7:4]=result[7:4]+4'd3;if(result[11:8]>4)result[11:8]=result[11:8]+4'd3;if(result[15:12]>4)result[15:12]=result[15:12]+4'd3;if(result[19:16]>4)result[19:16]=result[19:16]+4'd3;result=result<<1;bin=bin<<1;endresult[0]=bin[B_SIZE-1];bcd<=result;endendassign COUT=bcd[15:0];endmodule(3)信号显示处理:module FREQUENCY_DISPL Y_BLOCK(DOUT,DCLK_IN,RESET,CDIN);output[10:0] DOUT;input[15:0] CDIN;input DCLK_IN;input RESET;reg[10:0] DOUT;reg[3:0] Temp1;reg[1:0] cn;always @(posedge DCLK_IN) //设置成动态扫描beginif(RESET)cn<=0;elsebegincn<=cn+1;case(cn)2'b00: begin DOUT[10:7]<=4'b0001; Temp1<=CDIN[3:0];end2'b01: begin DOUT[10:7]<=4'b0010; Temp1<=CDIN[7:4];end2'b10: begin DOUT[10:7]<=4'b0100; Temp1<=CDIN[11:8];end2'b11: begin DOUT[10:7]<=4'b1000; Temp1<=CDIN[15:12];endendcaseendendalways @(Temp1) //译码显示begincase(Temp1)4'b0000: DOUT[6:0]<=7'b0111111; //3fh=04'b0001: DOUT[6:0]<=7'b0000110; //06h=14'b0010: DOUT[6:0]<=7'b1010110; //56h=24'b0011: DOUT[6:0]<=7'b1001111; //4fh=34'b0100: DOUT[6:0]<=7'b1100110; //66h=44'b0101: DOUT[6:0]<=7'b1101101; //6dh=54'b0110: DOUT[6:0]<=7'b1111101; //7dh=64'b0111: DOUT[6:0]<=7'b0000111; //07h=74'b1000: DOUT[6:0]<=7'b1111111; //7fh=84'b1001: DOUT[6:0]<=7'b1101111; //6fh=9default: DOUT[6:0]<=7'b0111111; //3fhendcaseendendmodule顶层verilog程序:moduleFREQUENCY_COUNTER_DISPL Y_BLOCK(DOUT,FLOW_UP,CLK,TEST_CLK_IN,RESET) ;output[10:0] DOUT;output FLOW_UP;input CLK;input TEST_CLK_IN;input RESET;wire gated_clk,load,counter_clr;wire[15:0] cout_cdin;FREQUENCY_COUNTROL_BLOCKu1(.GATED_CLK(gated_clk),.LOAD(load),.COUNTER_CLR(counter_clr),.CLK_IN(CLK),.SIG NAL_TEST(TEST_CLK_IN),.RESET(RESET));FREQUENCY_COUNTER_BLOCKu2(.COUT(cout_cdin),.FLOW_UP(FLOW_UP),.CLOCK_IN(gated_clk),.RESET(RESET),.LOA D(load),.COUNTER_CLR(counter_clr));FREQUENCY_DISPL Y_BLOCKu3(.DOUT(DOUT),.DCLK_IN(CLK),.RESET(RESET),.CDIN(cout_cdin));endmodule五、仿真结果分析仿真结果如图所示,输入标准时钟频率为1MHz,经过分频后变成频率为0.5Hz的信号,将其与测试信号相与得到采样信号GATED_CLK,同时利用测试信号和0.5Hz的分频信号可以产生LOAD信号和COUNTER_CLR信号,它们和采样信号的关系在图上可以清楚的看出。

C51四位数码管动态扫描让其中一位闪烁

C51四位数码管动态扫描让其中一位闪烁
break;
default:break;
}
if(flagtj!=0)
if((n==i)||(n+1==i))
{if(flag_1s==1)
P0=0xff;
else
P0=table[dula[i]];}
else
P0=table[dula[i]];
if(flagtj==0)
P0=table[dula[i]];
case 0xbe:outnum=11;break;
case 0x7e:outnum=15;break;
default:break;
}
}
}
}
}
}
/*if(!key1)
{
delayus(50);
if(!key1)
{
outnum=5;
while(!key1);
delayus(50);
}
} */
}
void main()
if(miao==60)
{miao=0,fen++;}
if(fen==60)
{fen=0,shi++;
if(shi>12)
shi=1;}
}
//====================
void disp()
{uchar i,n;
dula[7]=miao%10;
dula[6]=miao/10;
dula[5]=0x0a;
}
else {P0=num[dbuf[3]];}
P1=0x08;
delayus(20);
P1=0x00;
}
void keynum()
{
uchar temp;

Verilog程序3.1、数码管的动态扫描

Verilog程序3.1、数码管的动态扫描

`timescale 1ns / 1ps///////////////////////////////////////////////////////////////////// /////////////// Company:// Engineer://// Create Date: 10:49:16 11/14/2010// Design Name:// Module Name: mydigitron// Project Name:// Target Devices:// Tool versions:// Description://// Dependencies://// Revision:// Revision 0.01 - File Created// Additional Comments://///////////////////////////////////////////////////////////////////// /////////////module mydigitron(clk,rst_n,sm_cs1,sm_cs2,sm_cs3,sm_cs4,sm_db);input clk,rst_n;output sm_cs1,sm_cs2,sm_cs3,sm_cs4;output [6:0] sm_db;//计数,2^24=16*10^6;即16*10^6*20ns=0.32s=320msreg [24:0] cnt;always @(posedge clk or negedge rst_n)if(!rst_n) cnt<=25'b0;else cnt<=cnt+1'b1;reg [3:0] shi,ge;always @(posedge clk or negedge rst_n)if(!rst_n)beginshi <= 4'd9;ge <= 4'd8;endelse if(cnt==25'h1ff_ffff)beginshi <= shi-1;ge <= ge-1; endparameterseg0 = 7'hc0,seg1 = 7'hf9,seg2 = 7'ha4,seg3 = 7'hb0,seg4 = 7'h99,seg5 = 7'h92,seg6 = 7'h82,seg7 = 7'hf8,seg8 = 7'h80,seg9 =7'h90,sega =7'h88,segb =7'h83,segc =7'hc6,segd =7'ha1,sege =7'h86,segf =7'h8e;//segf =7'hff;reg [3:0] num;reg [6:0] sm_dbr;always @(num)case(num)4'h0:sm_dbr<=seg0; 4'h1:sm_dbr<=seg1; 4'h2:sm_dbr<=seg2; 4'h3:sm_dbr<=seg3; 4'h4:sm_dbr<=seg4; 4'h5:sm_dbr<=seg5; 4'h6:sm_dbr<=seg6; 4'h7:sm_dbr<=seg7; 4'h8:sm_dbr<=seg8; 4'h9:sm_dbr<=seg9; 4'hA:sm_dbr<=sega; 4'hB:sm_dbr<=segb; 4'hC:sm_dbr<=segc; 4'hD:sm_dbr<=segd; 4'hE:sm_dbr<=sege; 4'hF:sm_dbr<=segf; default:;endcaseassign sm_db = sm_dbr;reg sm_cs2_r,sm_cs1_r;always @(clk or shi or ge)beginif(cnt[20])beginsm_cs2_r = 0;sm_cs1_r = 1;num = shi;endelsebeginsm_cs2_r = 1;sm_cs1_r = 0; num = ge;endendassign sm_cs4 = 1;assign sm_cs3 = 1;assign sm_cs2 = sm_cs2_r;assign sm_cs1 = sm_cs1_r;endmoduleImplementation Constrants FlieNET "clk" LOC = P54;NET "rst_n" LOC = P38;NET "sm_cs1" LOC = P34;NET "sm_cs2" LOC = P33;NET "sm_cs3" LOC = P32;NET "sm_cs4" LOC = P26;NET "sm_db<0>" LOC = P25;NET "sm_db<1>" LOC = P16;NET "sm_db<2>" LOC = P23;NET "sm_db<3>" LOC = P21;NET "sm_db<4>" LOC = P20;NET "sm_db<5>" LOC = P17;NET "sm_db<6>" LOC = P83;。

4数码管动态扫描显示

4数码管动态扫描显示

1.利用动态扫描方法在六位数码管上显示出稳定的87654321.#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar code tabledu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x7 1};uchar code tablewe[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};uint numdu,numwe,a;/*用uint 或int时只能65536-(1000~5000),用uchar和char则不会*/ void main(){numdu=8;numwe=0;a=0;EA=1;ET1=1;TR1=1;TMOD=0x10;TH1=(65536-1000)/256;TL1=(65536-1000)%256;while(1){ if(a==1){a=0;P0=tabledu[numdu];numdu--;if(numdu==0)numdu=8;P2=tablewe[numwe];numwe++;if(numwe==8)numwe=0;}}}void time1() interrupt 3{TH1=(65536-1000)/256;TL1=(65536-1000)%256;a++;}2.用动态扫描方法和定时器0在数码管的前三位显示出秒表,精确到1%秒,即后两位显示1%秒,一直循环下去。

#include<reg52.h>#define uint unsigned int#define uchar unsigned charuint temp,aa=0,bai,shi,ge; /*不能用uchar或char,可用uint或int*/uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void display(uchar bai,uchar shi,uchar ge);void delay(uint z);void init();void main(){init();//初始化子程序while(1){display(bai,shi,ge);}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void display(uchar bai,uchar shi,uchar ge){P2=0x7f;P0=table[bai]+0x80;delay(5);P2=0xbf;P0=table[shi];delay(5);P2=0xdf;P0=table[ge];delay(5);}void init(){temp=0;TMOD=0x01;TH0=(65536-10000)/256;TL0=(65536-10000)%256;EA=1;ET0=1;TR0=1;}void timer0() interrupt 1{TH0=(65536-10000)/256;TL0=(65536-10000)%256;aa++;if(aa==1) /*放主函数中达不到此效果*/{aa=0;temp++;if(temp==1000){temp=0;}bai=temp/100;shi=temp%100/10;ge=temp%10;}}3、利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减直至765398并保持显示此数,与此同时利用定时器0以500MS速度进行流水灯从上至下移动,当数码管上数减到停止时,实验板上流水灯也停止然后全部开始闪烁,3秒后(用T0定时)流水灯全部关闭、数码管上显示出“HELLO”。

动态扫描数码管的veriloghdl程序

动态扫描数码管的veriloghdl程序

动态扫描数码管的verilog hdl 程序module led(seg,dig,clock,);//seg 段选,dig 位选,clock 时钟in put clock;output [7:0] seg; // 数码管段码输出output [7:0] dig; // 数码管位码输出reg [7:0] seg; //数码管段码输出寄存器reg [7:0] dig; //数码管位码输出寄存器reg [3:0] disp_dat; //显示数据寄存器reg [36:0] count; // 定义计数寄存器always @ (posedge clock )begincount = count + 1'b1;endalways @ (count[10])begindisp_dat = {count[13:11]};endalways @ (disp_dat)begincase (disp_dat)3'h0 :dig = 8'b11110; //显示第一个数码管,低电平有效3'h1 : dig = 8'b11101; // 显示第二个数码管,低电平有效3'h2 :dig = 8'b111011; // 显示第三个数码管,低电平有效 3'h3 : 3'h4 : dig= 8'b110111; // 显示第四个数码管,低电平有效 dig= 8'b111011; // 显示第五个数码管,低电平有效 3'h5 : dig= 8'b110111; // 显示第六个数码管,低电平有效 3'h6 : dig= 8'b10111; // 显示第七个数码管,低电平有效 3'h7 : dig= 8'b01111; // 显示第八个数码管,低电平有效 endcaseendalways @ (disp_dat) begin case (disp_dat)4'h0 :seg = 8'hc0; //显示 "0" 4'h1 :seg = 8'hf9; //显示 "1" 4'h2 :seg = 8'ha4; //显示 "2" 4'h3 :seg = 8'hb0; //显示 "3" 4'h4 :seg = 8'h99; //显示 "4" 4'h5 :seg = 8'h92; //显示 "5"4'h6 :seg = 8'h82; //显示"6" 4'h7 :seg = 8'hf8; //显示"7" 4'h8 :seg = 8'h80; //显示"8" 4'h9 :seg = 8'h90; //显示"9" 4'ha :seg = 8'h88; //显示"a" 4'hb :seg = 8'h83; //显示"b" 4'hc :seg = 8'hc6; //显示"c" 4'hd :seg = 8'ha1; //显示"d" 4'he :seg = 8'h86; //显示"e" 4'hf :seg = 8'h8e; //显示"f" endcase end endmodule。

数码管显示的Verilog代码

数码管显示的Verilog代码
2'b00: AN<=4'b0111;
2'b01: AN<=4'b1011;
2'b10: AN<=4'b1101;
2'b11: AN<=4'b1110;
default:AN<=4'b1111;
endcase
end
always @(*)
begin
case (Data[3:0])
0:seg[7:0]<=8'b00000011;
begin
case(BIT_SEL)
0: Data_4[3:0] <= Data[15:12];
1: Data_4[3:0] <= Data[11:8];
2: Data_4[3:0] <= Data[7:4];
3: Data_4[3:0] <= Data[3:0];
default:Data_4[3:0] <= Data[3:0];
output [7:0] SEG
);
reg[3:0] Data_4;
reg[1:0] BIT_SEL;
reg[15:0] cnt;
SMG_1 SMG_i(SEG,AN,BIT_SEL,Data_4);
always @(posedge CLK or posedge CLR)
if(CLR)
begin
cnt<=16'b0;
控制每个数码管显示对应位的数字begincase
数码管显示的Verilog代码
//用4个数码管显示一个16位二进制数据Data,每个数码管显示各自的数据0.2ms
module SMG_4(

(总)基于Verilog的4位计数器源程序与testbench测试程序

(总)基于Verilog的4位计数器源程序与testbench测试程序

1、简单4位计数器程序:module count4(clk,cnt);input clk;output reg[3:0]cnt=4'b0;always @(posedge clk)begincnt<=cnt+1;endendmodule测试程序:`timescale 1 ns/10 psmodule test_count4();reg clk=0;wire [3:0]cnt;count4 i1(.clk(clk),.cnt(cnt));always #10 clk=~clk;initialbegin$monitor($time,,,"clk=%d cnt=%d",clk,cnt); #400 $stop;endendmodule仿真波形:2、异步清零4位计数器源程序module count4_reset(clk,rst,cnt);input clk,rst;output reg[3:0]cnt=4'b0;always @(posedge clk or negedge rst)beginif(!rst) cnt<=4'b0;else cnt<=cnt+1;endendmodule测试程序`timescale 1 ns/10 psmodule test_count4_reset();reg clk=0;reg rst;wire [3:0]cnt;count4_reset i1(.clk(clk),.rst(rst),.cnt(cnt));always #10 clk=~clk;initialbeginrst=0;#20 rst=1;#45 rst=0;#10 rst=1;endinitialbegin$monitor($time,,,"clk=%d rst=%d cnt=%d",clk,rst,cnt);#800 $stop;endendmodule仿真波形3、异步清零、计数使能控制的4位计数器module count4_rst_en(clk,rst,en,cnt);input clk,rst,en;output [3:0]cnt;reg [3:0]cnt;always @(posedge clk or negedge rst)beginif(!rst) cnt<=0;else if(en==1) cnt<=cnt+1;endendmodule测试程序`timescale 1 ns/10 psmodule test_count4_rst_en();reg clk=0;reg rst,en;wire [3:0]cnt;count4_rst_en i1(.clk(clk),.rst(rst),.en(en),.cnt(cnt));always #10 clk=~clk;initialbeginrst=0;en=0;#15 en=1;#20 rst=1;#20 en=0;#20 en=1;rst=0;#20 rst=1;endinitialbegin$monitor($time,,,"clk=%d rst=%d en=%d cnt=%d",clk,rst,en,cnt);#800 $stop;endendmodule仿真波形:4、异步清零、计数使能、数据加载控制功能的4位计数器:module count4_rst_en_load(clk,rst,en,load,data,cnt);input clk,rst,en,load;input [3:0]data;output reg[3:0]cnt;always @(posedge clk or negedge rst)beginif(!rst) cnt<=0;else if(en==1)beginif(load) cnt<=data;else cnt<=cnt+1;endendendmodule测试程序:`timescale 1 ns/10 psmodule test_count4_rst_en_load();reg clk=0;reg rst,en,load;reg [3:0]data;wire [3:0]cnt;count4_rst_en_load i1(.clk(clk),.rst(rst),.en(en),.load(load),.data(data),.cnt(cnt));always #10 clk=~clk;initialbeginrst=0;en=0;load=0;data=4'd6;#20 en=1;#20 rst=1;#20 load=1;#20 rst=0;#20 rst=1;#20 load=0;endinitialbegin$monitor($time,,,"clk=%d rst=%d en=%d load=%d cnt=%d",clk,rst,en,load,data,cnt);#800 $stop;endendmodule仿真波形:。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档