4位数码管动态扫描Verilog程序
- 格式:docx
- 大小:13.36 KB
- 文档页数:2
简单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信号,它们和采样信号的关系在图上可以清楚的看出。
`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;。
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”。
动态扫描数码管的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。
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仿真波形:。
《数字电路》课程设计四位LED动态扫描设计目录1前言(引言)随着计算机技术和电子技术的飞速发展和广泛应用,电器设备的输出显示技术也变得复杂多样,诸如CRT显示、LCD显示、多位LED显示及发光二极管显示等应运而生。
在这些显示当中,LED及发光二极管显示电路较为简单,成本也较低,在功能单一的仪器仪表与机电设备中应用较广。
但当设备显示的点或位较多时,就需要采用一定的驱动电路与相应的驱动方式。
通过我们所学的数字电路,模拟电路,设计一个电路,实现一些功能。
此次设计锻炼我们的动手能力,解决问题的能力!2设计任务及方案论证用四位编码开关编码,将编出来的数字(0~9)以动态扫描的形式显示在LED数码管上,并且能够调节扫描频率。
1.通过编码开关,编出0000~9999的数字。
2.通过两个四选一的选择开关(74LS153),选择输出位数。
3.将选择输出的四位进行排序,接入数码管译码器(C4511)。
4.将对应的编码通过译码器显示在数码管上。
5.由于要求动态扫描:接入一个时钟脉冲。
产生时钟脉冲需要接入555多些振荡器。
产生的CP脉冲,通过计数器产生00~11的二进制数。
两位二进制数与四选一选择开关和2—4的计数器同步,产生1110,1101,1011,0111的四位二进制数作为数码管的驱动电压。
将设计的电路,经过理论计算,做出电路板,进行调试,从而来验证试验设计的真确性。
3电路设计原理与实验电路3.1设计任务及要求利用数字集成电路(如:74LS353、48、139、393,NE555等)和分立元件设计一个四位LED显示器动态扫描驱动电路。
(1)基本要求①显示范围:0000~9999;②显示方式:LED显示;③扫描频率:1Hz~1000Hz连续可调;④可预置数:0000~9999。
(2)发挥部分①扫描频率:1Hz~1000Hz连续可调;②自制符合要求电源。
3.2 设计方案通过编码开关对0到9的数字进行编码,送入四选一的选择器(74LS153),通过由低位到高位的排序,将选择的数字传入到译码器(74HC4511)中,并通过输出中间级使其数据传送到LED七段数码显示管。
FPGA入门(一)---四位共阴数码管显示--2007。
4。
412--采用4X4键盘进行控制,并显示相应的数字。
3--选自AVR和CPLD的书4--串行联接的七段数码管驱动程序,用了4个数码管5--四位数码管动态显示。
6--高电平选通位选端。
共阴数码管78library i eee;9use i eee.std_logic_1164.all;10use i eee.std_logic_unsigned.all;11entity l ed_7com is12port(clock:in s td_logic;13key_num:IN integer range 0 to 9;14en:out s td_logic_vector(0 to 3);--分别接4个数码管的公共端15display:out s td_logic_vector(0 to 7 ));--接数码管的7 隹刂贫? abcdefgend;1617architecture light of l ed_7com issignal c ounter:integer range 0 to 3;1819begin20process(clock)21variable n um:integer range 0 to 9;22begin23--if rising_edge(clock) thenif c lock'event and c lock='1' then2425if c ounter =3 then26counter<=0;27else28counter<=counter+1;29end if;case counter is3031when 0 =>32en<="1000"; --点亮第一个数码管,屏蔽其它5个数码管33num:=key_num; --显示第一个数34when 1=>en<="0100";3536num:=key_num;37when 2=>38en<="0010";39num:=key_num;40when 3=>en<="0001";4142num:=key_num;43when others=>null;end case;44Page 1 of 2Revision: led_7comcase num is4546when 0=> display <="11111101";--0abcdefg段47when 1=> display <="01100000";--148when 2=> display <="11011011";49when 3=> display <="11110010";50when 4=> display <="01100111";51when 5=> display <="10110110";52when 6=> display <="00111111";53when 7=> display <="11100000";54when 8=> display <="11111111";55when 9=> display <="11100110";56when others => display <="00000000";57end case ;58end if ;59end process;60end ;6162Page 2 of 2Revision: led_7com。