VerilogHDL简单计算器设计
【连载】FPGAVerilogHDL系列实例--------4位二进制加减法计数器
【连载】FPGAVerilogHDL系列实例--------4位⼆进制加减法计数器Verilog HDL 之 4位⼆进制加减法计数器⼀、原理 计数器是数字系统中⽤的较多的基本逻辑器件。
它不仅能记录输⼊时钟脉冲的个数,还可以实现分频、定时等功能。
计数器的种类很多。
按脉冲⽅式可以分为同步计数器和异步计数器;按进制可以分为⼆进制计数器和⾮⼆进制计数器;按计数过程数字的增减,可分为加计数器、减计数器和可逆计数器。
本实验就是设计⼀个4位⼆进制加减法计数器,该计数器可以通过⼀个控制信号决定计数器时加计数还是减计数,另外,该寄存器还有⼀个清零输⼊,低电平有效。
还有⼀个load装载数据的信号输⼊,⽤于预置数据;还有⼀个C的输出,⽤于计数器的级联。
其功能表如表1.1所⽰; 表1.1 4位⼆进制加减法计数器功能表⼆、实现在设计⽂件中输⼊Verilog代码1/****************************** 分频模块 *************************************/23 `timescale 1 ns / 1 ps4 module qu_dou ( clk ,rst , a ,b );56 input clk ;7 wire clk ;8 input rst ;9 input a ;10 wire a ;1112 output b ;13 reg b ;1415 reg [31:0] cnt ;16 reg clkout ;17 always @ ( posedge clk or negedge rst )18 begin19if ( rst == 1'b0 )20 cnt <= 0 ;21else begin if ( a==1'b1 ) begin22if ( cnt >= 32'd3000000 )23 b <= 1 ;24else25 cnt <= cnt + 1'b1 ;2627 end28else begin b <= 1'b0 ;29 cnt <= 0 ;30 end31 end32 end333435 endmodule功能实现1 `timescale 1 ns / 1 ps23 module counter4 ( load ,clr ,c ,DOUT ,clk, up_down ,DIN ,sysclk , rst );45 input load ;6 input clk;7 wire load ;8 input clr ;9 wire clr ;10 input up_down ;11 wire up_down ;12 input [3:0] DIN ;13 wire [3:0] DIN ;14 input sysclk ;15 input rst ;1617 output c ;18 reg c ;19 output [3:0] DOUT ;20 wire [3:0] DOUT ;21 reg [3:0] data_r;2223/***************** 例化去抖模块 *************************************/24 wire clk_r ;25 qu_dou qu_dou (26 .clk (sysclk) ,27 .rst (rst) ,28 .a (clk),29 .b (clk_r));3031//********************************************************************* 323334 assign DOUT = data_r;35 always @ ( posedge clk_r or posedge clr or posedge load)36 begin37if ( clr == 1) //同步清零38 data_r <= 0;39else if ( load == 1) //同步预置40 data_r <= DIN;41else begin if ( up_down ==1)42 begin43if ( data_r == 4'b1111) begin //加计数44 data_r <= 4'b0000;45 c = 1;46 end47else begin //减计数48 data_r <= data_r +1;49 c = 0 ;50 end51 end52else53 begin54if ( data_r == 4'b0000) begin //加计数55 data_r <= 4'b1111;56 c = 1;57 end58else begin //减计数59 data_r <= data_r -1;60 c = 0 ;61 end62 end63 end64 end65 endmodule。
用verilog HDL语言设计可逆计数器。
西安邮电学院
实验报告书
系部名称:电子工程学院学生姓名:xxx
专业名称:xxxx
班级:xxxx
实验时间:2011 年11月17日
1、掌握可逆计数器的工作原理。
2、学习用verilog HDL语言设计可逆计数器。
二、实验设备:
计算机一台,TD-EDA实验箱一台
三、实验内容:
用verilog HDL语言设计可逆计数器并进行仿真、引脚分配及下载到电路开发板进行功能验证。
四、实验程序:
module keni8(clk,enable,sum,col);
input clk,enable;
output[7:0] sum;
reg[7:0] sum;
output col;
reg col;
always @(posedge clk )
if(enable==1)
sum=sum+1;
else if(enable==0)
sum=sum-1;
else if(sum >= 8)
begin
sum=0;
col=1;
end
endmodule
五、运行结果:
1、在编程过程中,需小心谨慎,特别是注意标点符号的标注。
2、实验结果有一定的延时。
3、实验前需对TD-EDA实验箱进行了解,这样可以使实验更有效率。
verilog简单乘法器
verilog简单乘法器Verilog简单乘法器Verilog是一种硬件描述语言,用于描述数字系统的行为。
在数字电路设计中,乘法器是一个常见的电路组件,它用于执行乘法运算。
本文将介绍一个简单的Verilog乘法器的设计与实现。
乘法器是一种数字电路,用于计算两个数的乘积。
它接收两个输入数,将它们相乘得到一个输出。
在本文中,我们将实现一个4位乘法器,即输入和输出都是4位的二进制数。
我们需要定义输入和输出端口。
在Verilog中,我们可以使用“input”和“output”关键字来声明端口。
对于4位乘法器,我们可以声明两个4位的输入端口A和B,以及一个8位的输出端口P。
module simple_multiplier(input [3:0] A,input [3:0] B,output [7:0] P);接下来,我们需要实现乘法器的功能。
乘法器的实现可以通过多次执行加法运算来实现。
具体地,我们可以将输入的两个4位数逐位相乘,然后将得到的部分乘积相加得到最终的乘积。
在Verilog中,我们可以使用“assign”关键字来执行赋值操作。
我们可以定义一些临时变量,用于存储部分乘积和最终乘积的结果。
然后,通过多次执行加法运算,将部分乘积相加得到最终乘积。
下面是一个实现4位乘法器的简单示例代码:reg [7:0] temp;reg [7:0] result;always @(*) begintemp = A[0] * B;result = temp;temp = A[1] * B;result = result + (temp << 1);temp = A[2] * B;result = result + (temp << 2);temp = A[3] * B;result = result + (temp << 3);endassign P = result;在上述代码中,我们使用了一个“always”块来执行乘法器的功能。
Verilog HDL 乘法器
目录一、设计的性质、目的和任务 (2)二、设计课题要求 (2)1、基本要求 (2)2、设计内容 (2)三、总体设计 (3)1、输入模块 (3)2、乘法模块 (4)3、选择模块 (5)4、显示模块 (7)5、符号模块....................... 错误!未定义书签。
四、总体调试与仿真结果 (13)五、调试中遇到的问题及解决的方法 (13)六、课程设计过程中的体会和感想 (14)七、建议 (15)一、设计的性质、目的和任务熟悉EDA设计方法、设计语言和开发软件及设计实例,利用掌握的一种硬件描述语言(AHDL/VHDL/Verilog HDL)和EDA开发工具(MaxPlusⅡ)进行数字系统的设计开发及仿真。
通过课程设计的锻炼,要求学生掌握电路的一般设计方法,具备初步的独立设计能力,提高综合运用所学的理论知识独立分析和解决问题的能力,培养学生的创新精神。
二、设计课题要求(1)基本要求掌握现代大规模集成数字逻辑电路的应用设计方法,进一步掌握电子仪器的正确使用方法,以及掌握利用计算机进行电子设计自动化(EDA)的基本方法。
(2)设计内容设计一个两个5位数相乘的乘法器。
用发光二极管显示输入数值,用7段显示器显示十进制结果。
乘数和被乘数分两次输入。
在输入乘数和被乘数时,要求显示十进制输入数据。
输入显示和计算结果显示,采用分时显示方式进行,可参见计算器的显示功能。
注意,如果除法功能为引用功能模块,则难度系数将按照1到2.5计算。
#设计提示(仅供参考):通常表示带符号二进制数时,最高位为“0”表示“+”号,最高位为“1”表示“-”号,例如,01101表示“+1101”,而11101则表示“-1101”。
乘法运算通常采用移位相加方法实现,见简略示意图。
最终符号则用两个数的最高位采用“异或”逻辑得到。
三、 总体设计基于Verilog HDL 硬件语言的乘法器设计 (1) 输入模块该模块为乘数和被乘数输入,由ch (表示乘号)、rst (表示复位)控制。
verilog实现简易24小时计数器
verilog实现简易24⼩时计数器1.顶层数码管显⽰模块`timescale 1ns / 1ps//////////////////////////////////////////////////////////////////////////////////// Company:// Engineer://// Create Date: 18:57:45 08/18/2019// Design Name:// Module Name: dynamic_seg_top// Project Name:// Target Devices:// Tool versions:// Description: //实现简易时钟计数功能//// Dependencies://// Revision:// Revision 0.01 - File Created// Additional Comments://module dynamc_seg_top//---------------------<端⼝声明>---------------------------------------(input clk_50MHZ , //时钟,50Mhzinput rst_n , //复位,低电平有效output reg [ 7:0] seg_sel , //数码管位选output reg [ 7:0] seg_data //数码管段选,即内容显⽰);//---------------------<信号定义>---------------------------------------wire clk_1KHZ ;reg [3:0] data_tmp ;reg [7:0] cnt ;wire [23:0] data ;//----------------------------------------------------------------------// 1k分频例化,扫描⼀个数码管时间为1ms//----------------------------------------------------------------------CLK_DIV #(.width(16),.cnt(50_000))uut(.clk_50MHZ(clk_50MHZ),.rst_n(rst_n),.clk_out(clk_1KHZ));//======================================================================////时,分,秒计数例化////======================================================================clock_cntclk_cnt_uut(.clk_50MHZ(clk_50MHZ),.rst_n(rst_n),.data(data));//----------------------------------------------------------------------// 数码管扫描,8位循环扫描,频率为1k//----------------------------------------------------------------------always @(posedge clk_1KHZ or negedge rst_n)beginif(!rst_n)seg_sel <= 8'b0111_1111;else if(seg_sel==8'b1111_1110)seg_sel <= 8'b0111_1111;elseseg_sel <= ~(~seg_sel>>1);end//----------------------------------------------------------------------// 位选,不同计数对应不同位选编码,也对应分割的不同数据//----------------------------------------------------------------------always @(*)begincase(seg_sel)8'b0111_1111: data_tmp = data[ 3: 0] ; // 位18'b1011_1111: data_tmp = data[ 7: 4] ; // 位28'b1101_1111: data_tmp = 4'ha ; // 位38'b1110_1111: data_tmp = data[11:8] ; // 位48'b1111_0111: data_tmp = data[15:12] ; // 位58'b1111_1011: data_tmp = 4'hb ; // 位68'b1111_1101: data_tmp = data[19:16] ; // 位78'b1111_1110: data_tmp = data[23:20] ; // 位8default: data_tmp = 4'b0000 ;endcaseend//----------------------------------------------------------------------// 段选,将不同分割数据进⾏段选编码,实验平台为2个4位⼀体共阳数码管//----------------------------------------------------------------------always @(*)begincase(data_tmp)4'h0: seg_data = 9'hc0;4'h1: seg_data = 9'hf9;4'h2: seg_data = 9'ha4;4'h3: seg_data = 9'hb0;4'h4: seg_data = 9'h99;4'h5: seg_data = 9'h92;4'h6: seg_data = 9'h82;4'h7: seg_data = 9'hf8;4'h8: seg_data = 9'h80;4'h9: seg_data = 9'h90;4'ha: seg_data = 9'hbf;//4'hb: seg_data = 9'hbf;//第三位和第六位显⽰时钟的分隔线default:seg_data = 9'hc0;endcaseendendmodule2.时分秒计数模块`timescale 1ns / 1ps//////////////////////////////////////////////////////////////////////////////////// Company:// Engineer://// Create Date: 19:51:36 02/25/2020// Design Name:// Module Name: clock_cnt// Project Name:// Target Devices:// Tool versions:// Description://// Dependencies://// Revision:// Revision 0.01 - File Created// Additional Comments:////////////////////////////////////////////////////////////////////////////////////module clock_cnt(input clk_50MHZ,input rst_n,output [23:0]data);reg [7:0] second ;//时钟“秒”reg [7:0] minute ;//时钟“分”reg [7:0] hour ;//时钟“⼩时”wire clk_1HZ ;//----------------------------------------------------------------------//-- 例化计数分频产⽣1HZ时钟//----------------------------------------------------------------------CLK_DIV #(.width(28),.cnt(50_000_000))uut(.clk_50MHZ(clk_50MHZ),.rst_n(rst_n),.clk_out(clk_1HZ));//----------------------------------------------------------------------//-- 秒计数,从0-59计数,1秒加⼀,到59清零//----------------------------------------------------------------------always @(posedge clk_1HZ or negedge rst_n)beginif(!rst_n)second<=8'd0;else if (second[3:0]==4'd9)beginsecond[3:0]<=8'd0;if(second[7:4]==4'd5)second[7:4]<=4'd0;elsesecond[7:4]<=second[7:4]+4'd1;endelsesecond[3:0]<=second[3:0]+4'd1;end//----------------------------------------------------------------------//-- 分计数,从0-59计数,1分钟加⼀,到59清零//----------------------------------------------------------------------always @(posedge clk_1HZ or negedge rst_n)beginif(!rst_n)minute<=8'd0;else if ((second[3:0]==4'd9)&(second[7:4]==4'd5))beginif(minute[3:0]==4'd9)beginminute[3:0] <=4'd0;if(minute[7:4]==4'd5)minute[7:4] <=4'd0;elseminute[7:4] <=minute[7:4]+4'd1;endelsebeginminute[3:0]<=minute[3:0]+4'd1;endendelseminute<=minute;end//----------------------------------------------------------------------//-- ⼩时计数,从0-23计数,1⼩时加⼀,到23清零//----------------------------------------------------------------------always @(posedge clk_1HZ or negedge rst_n)beginif(!rst_n)hour<=8'd0;else if ((second[3:0]==4'd9)&(second[7:4]==4'd5)&(minute[3:0]==4'd9)&(minute[7:4]==4'd5)) beginif(hour[7:4]==4'd2)beginif(hour[3:0]==4'd3)beginhour[3:0] <=4'd0;hour[7:4]<=4'd0;endelsebeginhour[7:4]<=hour[7:4];hour[3:0] <=hour[3:0]+4'd1;endendelsebeginif(hour[3:0]==4'd9)beginhour[3:0] <=4'd0;hour[7:4] <=hour[7:4]+4'd1;endelsebeginhour[3:0] <=hour[3:0]+4'd1;hour[7:4] <=hour[7:4];endendendelsehour<=hour;endassign data[3:0] =second [3:0];//将“秒”的个位数送到数码管第⼀位assign data[7:4] =second [7:4];//将“秒”的⼗位数送到数码管第⼆位assign data[11:8] =minute [3:0];//将“分“的个位数送到数码管第四位assign data[15:12] =minute [7:4];//将”分”的⼗位数送到数码管第五位assign data[19:16] =hour [3:0];//将“时“的个位数送到数码管第七位assign data[23:20] =hour [7:4];//将”时”的个位数送到数码管第⼋位endmodule3.任意时钟分频模块`timescale 1ns / 1ps//////////////////////////////////////////////////////////////////////////////////// Company:// Engineer://// Create Date: 18:54:40 02/25/2020// Design Name:// Module Name: CLK_DIV// Project Name:// Target Devices:// Tool versions:// Description: //任意时钟分频模块//// Dependencies://// Revision:// Revision 0.01 - File Created// Additional Comments:////////////////////////////////////////////////////////////////////////////////////module CLK_DIV #(parameter width = 28,parameter cnt = 50_000_000)(input clk_50MHZ,input rst_n ,output clk_out);reg [width-1:0] cnt_p;reg cnt_n;reg clk_p;reg clk_n;//上升沿计数器,实现0-49_999_999计数always@(posedge clk_50MHZ or negedge rst_n)beginif(!rst_n)cnt_p <= 1'b0;else if(cnt_p == (cnt-1))cnt_p <= 1'b0;elsecnt_p <= cnt_p + 1'b1;end//上升沿触发时钟分频,实现1HZ时钟输出always@(posedge clk_50MHZ or negedge rst_n)beginif(!rst_n)clk_p<=1'b0;else if(cnt_p<(cnt>>1))clk_p<=1'b0;elseclk_p<=1'b1;endalways@(negedge clk_50MHZ or negedge rst_n)beginif(!rst_n)cnt_n <= 1'b0;else if(cnt_n == (cnt-1))cnt_n <= 1'b0;elsecnt_n <= cnt_n + 1'b1;endalways@(negedge clk_50MHZ or negedge rst_n)beginif(!rst_n)clk_n<=1'b0;else if(cnt_n<(cnt>>1))clk_n<=1'b0;elseclk_n<=1'b1;endwire clk1=clk_50MHZ; //当分频系数为1时,输出时钟wire clk2=clk_p; //当分频系数为偶数时,输出等于clk_pwire clk3=clk_p&clk_n;//当分频系数为奇数时,输出等于clk_p&clk_n assign clk_out=(cnt==1)?clk1:(cnt[0]? clk2:clk3);endmodule4.时分秒仿真testbench⽂件`timescale 100ps / 1ps////////////////////////////////////////////////////////////////////////////////// Company:// Engineer://// Create Date: 22:18:22 02/25/2020// Design Name: clock_cnt// Module Name: C:/mydesign/dybamic_seg1/clk_tb.v// Project Name: dybamic_seg// Target Device:// Tool versions:// Description://// Verilog Test Fixture created by ISE for module: clock_cnt//// Dependencies://// Revision:// Revision 0.01 - File Created// Additional Comments://////////////////////////////////////////////////////////////////////////////////module clk_tb;// Inputsreg clk_50MHZ;reg rst_n;// Outputswire [23:0] data;// Instantiate the Unit Under Test (UUT)clock_cnt uut (.clk_50MHZ(clk_50MHZ),.rst_n(rst_n),.data(data));initial begin// Initialize Inputsclk_50MHZ = 0;rst_n = 0;// Wait 100 ns for global reset to finish#10;rst_n = 1;#10;// Add stimulus hereendalways #1 clk_50MHZ=~clk_50MHZ;endmodule5.显⽰模块仿真testbench⽂件`timescale 1ns / 1ps////////////////////////////////////////////////////////////////////////////////// Company:// Engineer://// Create Date: 15:11:16 02/26/2020// Design Name: dynamc_seg_top// Module Name: C:/mydesign/dybamic_seg1/dy_segtb.v// Project Name: dybamic_seg// Target Device:// Tool versions:// Description://// Verilog Test Fixture created by ISE for module: dynamc_seg_top //// Dependencies://// Revision:// Revision 0.01 - File Created// Additional Comments://////////////////////////////////////////////////////////////////////////////////module dy_segtb;// Inputsreg clk_50MHZ;reg rst_n;// Outputswire [7:0] seg_sel;wire [7:0] seg_data;// Instantiate the Unit Under Test (UUT)dynamc_seg_top uut (.clk_50MHZ(clk_50MHZ),.rst_n(rst_n),.seg_sel(seg_sel),.seg_data(seg_data));initial begin// Initialize Inputsclk_50MHZ = 0;rst_n = 0;// Wait 100 ns for global reset to finish#10;rst_n = 1;#10;// Add stimulus hereendalways #1 clk_50MHZ=~clk_50MHZ;endmodule。
EDA大作业 课程设计 简易计算器
在掌握常用数字电路功能和原理的基础上,根据EDA技术课程所学知识,利用硬件描述语言Verilog HDL、EDA软件Quartus II和硬件平台Cyclone/Cyclone II FPGA进行电路系统的设计。
本次实验我完成的内容是简单计算器的设计,下面我简单的进行一下原理的阐述。
设计一个简单计算器,输入为8位二进制数,分别用两位数码管显示,输出的计算结果为16位二进制数,并用四位数码管显示,能够实现+、-、 *、/ 四种运算,其中除法的结果显示分为商和余数两部分,分别用两位数码管显示。
为了完成要求的效果显示,我先设计了一个简单的四则运算器,为了使其结果能清楚的看到,所以计算器模块和一个7段数码管模块连接。
实验要求,输入分别用两位数码管显示,输出用四位数码管显示,所以用一个3—8译码器和数码管连接,通过开关控制,形成动态显示。
从左向右,依次是第一位数码管显示a的高四位,第二位数码管显示a的低四位;第三位数码管显示b的高四位,第四位数码管显示b的低四位;第五位数码管到第八位数码管显示输出的结果。
通过改变时钟,使其看起来像同时显示在数码管上。
设计流程如下图,分别用两个数码管表示八位二进制数,用一个case 语句表示输入数值采用哪种运算方式,分别用00,01,10,11表示加,减,乘,除。
用3—8译码器选择从哪个数码管输出。
硬件流程图输出结果 A. B 的显示软件流程图LED 灯接线部分显示:中心控制 复位编码 数码管输出输入A 输入B 运算选择C 输出out L E D 8 L E D 7 L E D 6 L E D 5 L E D 4 L E D 3 L E D 2 L E D 1第三章程序简单计算器的程序如下:module jsq9(a,b,c,Dout,count,clk,rst);input[7:0]a,b;input clk,rst;input[1:0]c;output[6:0]Dout;output [2:0]count;reg[6:0]Dout;reg[2:0]count;reg[15:0]out;reg[6:0] LED7S1,LED7S2,LED7S3,LED7S4, LED7S5,LED7S6,LED7S7,LED7S8; DECL7S u1(.A(a[7:4]) , .LED7S(LED7S1));DECL7S u2(.A(a[3:0]) , .LED7S(LED7S2));DECL7S u3(.A(b[7:4]) , .LED7S(LED7S3));DECL7S u4(.A(b[3:0]) , .LED7S(LED7S4));DECL7S u5(.A(out[15:12]) , .LED7S(LED7S5));DECL7S u6(.A(out[11:8]) , .LED7S(LED7S6));DECL7S u7(.A(out[7:4]) , .LED7S(LED7S7));DECL7S u8(.A(out[3:0]) , .LED7S(LED7S8));reg[7:0]out1,out2;always@(a,b,c,Dout,count,clk,rst)case(c)2'b00:out=a+b;2'b01:out=a-b;2'b10:out=a*b;2'b11:beginout1=a/b;out2=a%b;out={out1,out2};enddefault:;endcasealways@(posedge clk or negedge rst)beginif(!rst)count<=3'b000;else if(count==3'b111)count<=3'b000;elsecount<=count+3'b001;endalways@(posedge clk)begincase(count)3'b000: Dout<=LED7S1;3'b001:Dout<=LED7S2;3'b010:Dout<=LED7S3;3'b011:Dout<=LED7S4;3'b100: Dout<=LED7S5;3'b101:Dout<=LED7S6;3'b110:Dout<=LED7S7;3'b111:Dout<=LED7S8;endcaseendendmodulemodule DECL7S (A, LED7S);input [3:0] A;output [6:0] LED7S;reg [6:0] LED7S;always @(A)begincase(A)4'b0000 : LED7S<=7'b0111111; 4'b0001: LED7S <= 7'b0000110 ; 4'b0010: LED7S <= 7'b1011011; 4'b0011: LED7S <= 7'b1001111; 4'b0100: LED7S <= 7'b1100110 ; 4'b0101: LED7S <= 7'b1101101; 4'b0110: LED7S <= 7'b1111101 ; 4'b0111: LED7S <= 7'b0000111 ; 4'b1000: LED7S <= 7'b1111111 ; 4'b1001: LED7S <= 7'b1101111 ; 4'b1010: LED7S <= 7'b1110111 ; 4'b1011: LED7S <= 7'b1111100 ; 4'b1100: LED7S <= 7'b0111001 ;4'b1101: LED7S <= 7'b1011110 ; 4'b1110: LED7S <= 7'b1111001 ; 4'b1111: LED7S <= 7'b1110001 ; endcaseendendmodule第四章模块连接在本程序中,共由三个模块组成,第一个模块是一个四选一多路器其仿真图为:第二个模块是7段数码管显示程序如下module DECL7S (A, LED7S);input [3:0] A;output [6:0] LED7S;reg [6:0] LED7S;always @(A)begincase(A)4'b0000 : LED7S<=7'b0111111;4'b0001: LED7S <= 7'b0000110 ;4'b0010: LED7S <= 7'b1011011;4'b0011: LED7S <= 7'b1001111;4'b0100: LED7S <= 7'b1100110 ;4'b0101: LED7S <= 7'b1101101;4'b0110: LED7S <= 7'b1111101 ;4'b0111: LED7S <= 7'b0000111 ;4'b1000: LED7S <= 7'b1111111 ;4'b1001: LED7S <= 7'b1101111 ;4'b1010: LED7S <= 7'b1110111 ;4'b1011: LED7S <= 7'b1111100 ;4'b1100: LED7S <= 7'b0111001 ;4'b1101: LED7S <= 7'b1011110 ;4'b1110: LED7S <= 7'b1111001 ;4'b1111: LED7S <= 7'b1110001 ;endcaseendendmodule仿真图如下:把这个两个模块用一个3—8译码器进行连接,使其达到实验的要求。
哈尔滨工业大学数字电子技术基础课程设计报告:基于Verilog HDL语言的计数器设计
H a r b i n I n s t i t u t e o f T e c h n o l o g y
数字电子技术基础大作业报告
课程名称:数字电子技术基础
设计题目:V erilog HDL 计数器编程
院系:航天学院控制科学与工程系班级:0904102班
姓名:某某某
学号:xxxxxxxxxx
指导教师:王淑娟
设计时间:2011年12月
哈尔滨工业大学
Verilog HDL计数器编程
1设计任务
利用Verilog HDL设计一个模为学号后三位的计数器,设计要求:
1)编写源程序;
2)给出仿真电路图和仿真波形图。
2设计步骤
1.安装Quartus II软件并破解。
2.根据设计要求编写程序代码。
3.生成仿真电路图和波形如图。
3程序代码
4仿真电路图和波形图
如下图所示。
Verilog实现加减乘除计算器
Verilog实现加减乘除计算器主要内容: 1. 按键按下后,进⾏加减乘除操作 2. Verilog往TXT⽂本⽂件中写⼊数据 3. 完成计算模块 4. 最终实现加减乘除计算器1. 实现按键按下后,选择option,进⾏加减乘除操作,除法计算结果为商&余数module jsq(clk,rst_n,key,option,x,y,result,quotient,remainder);parameter N = 16; // 输⼊数的位数input clk; // 输⼊时钟input rst_n; // 低电平有效的复位(清零)input key;input [1:0]option;input [N-1:0] x;input [N-1:0] y;output [2*N-1:0] result;output [N-1:0] quotient; //输出计算的商output [N-1:0] remainder; //输出计算的余数reg [2*N-1:0] result_r;reg [N-1:0] quotient_r,remainder_r;always @ (posedge clk or negedge rst_n)beginif (!rst_n)beginresult_r <= 1'b0;quotient_r <= 1'b0;remainder_r <= 1'b0;endelsebeginif (key == 1'b0)begin//按键按下case(option)2'b00: result_r = x + y;2'b01: result_r <= x + (~y + 1'b1);2'b10: result_r = x * y;2'b11: //result_r = x / y;beginquotient_r = x / y;remainder_r = x % y;endendcaseendelsebegin// 按键释放result_r <= 1'b0;quotient_r <= 1'b0;remainder_r <= 1'b0;endendendassign result = result_r ;assign quotient= quotient_r;assign remainder = remainder_r;endmoduleView Code`timescale 1ns/1ps`define clock_period 20module jsq_tb;reg clk;reg rst_n;reg key;reg [1:0]option;reg [15:0] x,y;wire [31:0] result;wire [15:0] quotient;wire [15:0] remainder;initial beginclk = 1'b1;rst_n = 1'b0;key = 1'b1; // 复位时,按键释放# 20//复位20nsrst_n = 1'b1;# 20key = 1'b0;option = 2'b10;# 100key = 1'b1;# 20key = 1'b0;option = 2'b11;# 100// key = 1'b1;// # 20$stop;endalways #(`clock_period/2) clk = ~clk; //50Mjsq #(.N(16)) jsq_0(.clk(clk),.rst_n(rst_n),.key(key),.option(option),.x(x),.y(y),.result(result),.quotient(quotient),.remainder(remainder));initial beginx = 0;repeat(20)#(`clock_period) x = {$random}%100; //通过位拼接操作{}产⽣0—59范围的随机数endinitial beginy = 0;repeat(20)#(`clock_period) y = {$random}%50;end/*integer i;initial beginx = 0;y = 0;for(i = 0; i < 20; i = i + 1)begin//利⽤$random系统函数产⽣随机数。
使用veriloghdl设计2位16进制计数器由de2的key0输入计数值在hex1hex0上显示计
FPGA实验实验二实验目的:学习计数器的设计、仿真和硬件测试方法。
实验内容及步骤:1.使用Verilog HDL设计2位 16进制计数器,由DE2的KEY0输入计数值,在HEX1,HEX0上显示计数值。
2.使用嵌入式逻辑分析仪进行仿真;3.将实验程序下载到DE2运行。
实验注意事项:去抖动程序:module jishu(clk,k,Rst,x0,x1,Clk,K,C,key);input clk,k,rst;output [6:0]x1;output [6:0]x0;reg [3:0]g1;reg [3:0]g0;reg [19:0]C;reg[9:0]K;always @(clk)if (C<20’d5000)C<=C+1,Clk<=0;else C<=0,Clk<=1;endalways @(Clk)if(K<10d20)K<=K+1,Key<=0;else K<=0,Key<=1;endalways @(posedge Clk ot negedge Rst)beginif(!Rst) g0<=0,g1<=0;else if(!Key)beginif(g0<4’d15)g0<=g0+1;else g0<=4’b0000;endendalways @(g0)if (g0==4’d15)if(g1<4’d15) g1<=g1+1;else g1<=4’b0000;endendalways @(g0)begincase (g0)4'b0000:x0<=7'b 1000000;4'b0001:x0<=7'b 1111001;4'b0010:x0<=7'b 0100100;4'b0011:x0<=7'b 0110000;4'b0100:x0<=7'b 0011001;4'b0101:x0<=7'b 0010010;4'b0110:x0<=7'b 0000010;4'b0111:x0<=7'b 1111000;4'b1000:x0<=7'b 0000000;4'b1001:x0<=7'b 0011000;4'b1010:x0<=7'b 0001000;4'b1011:x0<=7'b 0000011;4'b1100:x0<=7'b 1000110;4'b1101:x0<=7'b 0100001;4'b1110:x0<=7'b 0000110;4'b1111:x0<=7'b 0001110;endcaseendalways @(g1)begincase (g1)4'b0000:x1<=7'b 1000000;4'b0001:x1<=7'b 1111001;4'b0010:x1<=7'b 0100100;4'b0011:x1<=7'b 0110000;4'b0100:x1<=7'b 0011001;4'b0101:x1<=7'b 0010010;4'b0110:x1<=7'b 0000010;4'b0111:x1<=7'b 1111000;4'b1000:x1<=7'b 0000000; 4'b1001:x1<=7'b 0011000;4'b1010:x1<=7'b 0001000;4'b1011:x1<=7'b 0000011;4'b1100:x1<=7'b 1000110;4'b1101:x1<=7'b 0100001;4'b1110:x1<=7'b 0000110; 4'b1111:x1<=7'b 0001110; endcaseendend module实验结果:。
Verilog HDL加法计数器的设计
H a r b i n I n s t i t u t e o f T e c h n o l o g yV e r i l o g H D L加法计数器的设计课程名称:数字电子技术基础院系:航天学院班级:1121101班姓名:学号:指导教师:哈尔滨工业大学1 设计要求利用Verilog HDL设计一个以自己学号后三位(107)为模的计数器。
2 设计内容2.1 所使用的软件Quartus II 11.0 (32-Bit)和ModelSim-Altera 6.6d (Quartus II 11.0)。
2.2 设计思想从0计数到106,到106之后同步清零,实现以107为模的计数器。
2.3 源程序module count_107(out,reset,clk);output[7:0] out;input clk,reset;reg[7:0] out;always@(posedge clk )beginif((!reset)||(out==8'h6A))out<=8'h00;elseout<=out+8'h01;endendmodule2.4 仿真电路图RTL Viewer仿真电路如图1所示:图1 计数器的RTL Viewer仿真电路图Technology Map Viewer仿真电路如图2所示:图2 计数器的Technology Map Viewer仿真电路图2.5 Test Benches程序// Generated on "12/20/2013 11:57:54"// Verilog Test Bench template for design : count_107// Simulation tool : ModelSim-Altera (Verilog)`timescale 1 ps/ 1 psmodule count_107_vlg_tst();reg eachvec;reg clk;reg reset;wire [7:0] out;count_107 i1 (.clk(clk),.out(out),.reset(reset));initialbegin#1 clk=0;#2 reset=0;#3 reset=1;$display("Running testbench");endalways#5 clk=~clk;beginendendmodule2.6 仿真波形图仿真波形图如图3所示,可以看出计数周期为0~106,实现了以107为模的计数器。
基于verilog语言的可预置加减计数器的设计
/ / 使能信号有效
beg in
CO U T < = DI N;
/ / 从预置位开始计数
end
els e
beg in
if( U PCN T CT RL )
beg in
CO U T < = CO U T + 1;
/ / 加法计数
end
else if( DOW NCN T CT RL )
beg in
CO U T < = CO U T - 1;
在目前流行的各种数字电路教材 中, 均分别给出 了加 法计数器和减法计数器, 但没有给出既 能完成加法计 数又 能完成减法计 数的逻 辑电 路, 为 此本 文通 过 使用 V erilog HDL 硬件描述语言设 计出 了一 种可进 行加、减计 数的 可 逆计数器, 并运用 M ent or 公司的 M odelSim 验证工具对其 进行仿真验证。
图 5 实用新型 RC 充电电 路
5结语
本文是在理想二极管及无限长时间的前提下导出的结 果, 实际二极管 的正 向压降、反 向电 流以及 有限 的充 电时 间, 对结果都有影 响, 因此, 实际 RC 电 路的结 果与 理论计 算有一定的差别, 延长了充电时间是这种方法的主要缺点。 但总的来说, 采用这种方法, 可以有效地减少能量损失。
图 4 新型 n 阶 RC 充电电路
在实际中, 设: E= 400 V, C= 0. 02 F; R1 = 0. 5 , R2 = 12. 5 , 则: 1 = 0. 01 s, t= 1. 25 s; W C( t) = 1 600 J, W E ( t) = 2 560 J; 而 W R ( t) = 960 J, 能量损失减少 40% 。 4. 2 实用电路 2 如图 5 所示, 开关 K 闭合后, 首先是电源 E/ 3 经 D 1 和 R1 对 C 充电, 当充电至 uC = E/ 3 后, D1 截止, 电源 2E/ 3 经
用VerilogHDL设计2位16进制计数器
基于FPGA的系统设计与应用实验二计数器设计实验一、实验目的:学习计数器的设计、仿真和硬件测试方法。
二、实验内容及步骤:1.用Verilog HDL设计2位16进制计数器,由DE2的KEY0输入计数值,在HEX1,HEX0上显示计数值。
2.使用嵌入式逻辑分析仪进行仿真;3.将实验程序下载到DE2运行。
实验注意事项:去抖动三、程序代码module lib22(out1,out2,clk,rst,key);output [6:0] out1,out2;input clk,rst;input key;reg [19:0]count;reg [7:0]in;reg [6:0]out1,out2;reg C,K;reg [9:0] r1;always@(posedge clk)if(count==20'd5000)beginC=~C;count<=1'b0;endelsecount=count+1'b1;always @ (posedge C)beginif(r1<10'd1000)beginK<=1'b0;r1<=r1+1'b1;endelsebeginK<=1'b1;r1<=1'b0;endendalways @ (posedge C,negedge rst) if(!rst)in<=1'b0;else if(!K)beginin=in+8'b1;endalways @ (in[3:0])case(in[3:0])4'b0000:out1=7'b1000000;4'b0001:out1=7'b1111001;4'b0010:out1=7'b0100100;4'b0011:out1=7'b0110000;4'b0100:out1=7'b0011001;4'b0101:out1=7'b0010010;4'b0110:out1=7'b0000010;4'b0111:out1=7'b1011000;4'b1000:out1=7'b0000000;4'b1001:out1=7'b0010000;4'b1010:out1=7'b0001000;4'b1011:out1=7'b0000011;4'b1100:out1=7'b1000110;4'b1101:out1=7'b1100001;4'b1110:out1=7'b0000110;4'b1111:out1=7'b0001110;default:out1=7'b1111111; endcasealways @ (in[7:4])case(in[7:4])4'b0000:out2=7'b1000000;4'b0001:out2=7'b1111001;4'b0010:out2=7'b0100100;4'b0011:out2=7'b0110000;4'b0100:out2=7'b0011001;4'b0101:out2=7'b0010010;4'b0110:out2=7'b0000010;4'b0111:out2=7'b1011000;4'b1000:out2=7'b0000000;4'b1001:out2=7'b0010000;4'b1010:out2=7'b0001000;4'b1011:out2=7'b0000011;4'b1100:out2=7'b1000110;4'b1101:out2=7'b1100001;4'b1110:out2=7'b0000110;4'b1111:out2=7'b0001110;default:out2=7'b1111111; endcaseendmodule四、实验原理图:DE2按键电路图五、实验总结与分析:1.不加去斗时,出现的结果不稳定,不同的DE2板子结果不一样,在加上去斗时,实验结果很稳定;2.去斗可以是检测抖动阶段也可以是不抖动阶段;3.实验二包含了实验一的一些内容,例如数码管的显示,但是加了去抖动程序,使结果更加的稳定。
用Verilog HDL编写乘法器
Multiplier
2. Combinational Array Multiplier
3) Critical Path in a MxN array multiplier
Multiplier
2. Combinational Array Multiplier
3) Critical Path in a MxN array multiplier
3) Types :
(1) parallel: a) combinational array b) pulse array c) Boltz code d) Wallace Tree e) Pipeline (2) Serials (3) Serials-Parallel
4) The principle of choosing multiplier
(1) speed (2) throughput( the amount of data processing) (3) area
Multiplier
2. Combinational Array Multiplier
1) Techniques:
Multiplier
2. Combinational Array Multiplier
module cam(a, b, z); input[3:0] a, b; output[7:0] z; reg[3:0] g0,g1,g2,g3; wire[3:0] s1, s2, s3; wire c1, c2, c; always @( a or b ) begin for(i=0;i<4;i=i+1) begin g0[i]=a[i]&b[0]; g1[i]=a[i]&b[1]; g2[i]=a[i]&b[2]; g3[i]=a[i]&b[3]; end end FA4 u1( {1’b0,g0[3:1]} , g1, 1’b0 , s1, c1); FA4 u2( {c1, s1[3:1]}, g2, 1’b0, s2, c2); FA4 u3( {c2, s2[3:1]}, g3, 1’b0, s3, c3); assign z = {c3, s3, s2[0], s1[0], g0[0]}; endmodule
基于Verilog的简单计算器设计
module alu4(input wire [3:0]alusel,input wire [3:0]a,input wire [3:0]b,output reg nf, //令标志位output reg zf, //负标志位output reg cf, //进位标志output reg ovf, //溢出位标志output reg [7:0]y,output reg [3:0]rem //余数);reg [4:0]temp;reg [7:0]pv;reg [7:0]dp;integer i;reg [1:0]remL;reg [1:0]quotL;always@(*)beginy=0;rem=0;cf=0;ovf=0;nf=0;temp=5'b00000;case(alusel)4'b0001:y=a; //传递4'b0010: //加法begintemp={1'b0,a}+{1'b0,b};y=temp[3:0];cf=temp[4];ovf=y[3]^a[3]^b[3]^cf;end4'b0011: //减法1begintemp={1'b0,a}-{1'b0,b};y=temp[3:0];cf=temp[4];ovf=y[3]^a[3]^b[3]^cf;end4'b0100: //减法二begintemp={1'b0,b}-{1'b0,a};y=temp[3:0];cf=temp[4];ovf=y[3]^a[3]^b[3]^cf;end4'b0101: //乘法beginpv=8'b00000000;dp={4'b0000,b};for (i=0;i<=3;i=i+1)beginif(a[i]==1)pv=pv+dp;dp={dp[6:0],1'b0};endy=pv;end4'b0110:div({1'b0,b[3:0]},a,y,rem); //除法14'b0111:div({1'b0,a[3:0]},b,y,rem); //除法24'b1000:y=~a; //非4'b1001:y=a&b; //与4'b1010:y=a|b; //或4'b1011:y=a^b; //异或4'b1100:y={a[2:0],1'b0}; //左移1位4'b1101:y={a[2:0],a[3]}; //循环左移1位4'b1110:y={a[0],a[3:1]}; //循环右移1位4'b1111:y={a[3],a[3:1]}; //算数右移1位default:y=a;endcasenf=y[3];if(y==4'b0000)zf=1;elsezf=0;if(y>=10)cf=1;elsecf=0;if(y>99)ovf=1;elseovf=0;endtask div( //定义除法input wire[3:0]numerator,input [3:0]denom,output [3:0]y,output [3:0]rem);beginreg [7:0]numer;reg [4:0]d;reg [4:0]n1;reg [3:0]n2;beginnumer={4'b0000,numerator};d={1'b0,denom};n2=b;n1={1'b0,numer[7:4]};repeat(4)beginn1={n1[3:0],n2[3]};n2={n2[2:0],1'b0};if(n1>=d)beginn1=n1-d;n2[0]=1;endendy=n2;rem=n1[3:0];endendendtaskbinbcd B(.a(a), //调用BCD码模块,元件例化.b(b),.y(y),.rem(rem),);Endmodulemodule binbcd( //将二进制转换成BCD码input wire [3:0]a,input wire [3:0]b,input wire [3:0]rem,input wire [3:0]y,output reg [7:0]p,output wire [4:0]q,output wire [4:0]n,output wire [4:0]m);assign n[4]=a[3]&a[2]|a[3]&a[1];assign n[3]=a[3]&~a[2]&~a[1];assign n[2]=~a[3]&a[2]|a[2]&a[1];assign n[1]=a[3]&a[2]&~y[1]|~y[3]&y[1];assign n[0]=a[0];assign m[4]=b[3]&b[2]|b[3]&b[1];assign m[3]=b[3]&~b[2]&~b[1];assign m[2]=~b[3]&b[2]|b[2]&b[1];assign m[1]=b[3]&b[2]&~b[1]|~b[3]&b[1];assign m[0]=b[0];assign q[4]=rem[3]&rem[2]|rem[3]&rem[1];assign q[3]=rem[3]&~rem[2]&~rem[1];assign q[2]=~rem[3]&rem[2]|rem[2]&rem[1]; assign q[1]=rem[3]&rem[2]&~rem[1]|~rem[3]&rem[1]; assign q[0]=rem[0];reg[17:0]z;integer j;always @(*)beginfor (j=0;j<=17;j=j+1)z[j]=0;z[10:3]=y;repeat(5)beginif(z[11:8]>4)z[11:8]=z[11:8]+3;if(z[15:12]>4)z[15:12]=z[15:12]+3;z[17:1]=z[16:0];endp=z[17:0];endendmodule。
用verilog HDL输入法设计十进制计数器 实验报告
实验名称:实验四:用verilog HDL输入法设计十进制计数器实验目的:硬件描述语言(HDL)就是可以描述硬件电路的功能、信号连接关系及定时(时序)关系的语言,也是一种用形式化方法来描述数字电路和设计数字系统的。
通过十进制计数器的设计,熟练掌握硬件描述语言的编程方法。
实验原理:module cout(clk,clear,qd,EN);input clk,clear,EN;output[3:0] qd;reg[3:0] cnt;assign qd=cnt;always @(posedge clk )begin if(clear ) cnt<=4'h0;//同步清0,高电平有效else if(EN)begin if(cnt==9) cnt<=4'h0;else cnt<=cnt+1; //加法计数endendEndmodule实验内容:为了能对此计数器进行硬件测试,应将其输入输出信号锁定在芯片确定的引脚上,编译后下载。
(1)选择Tools菜单中的Assignments项,即进入如图2-23所示的Assignment Editor编辑器窗。
在Category栏中选择Pin,或直接单击右上侧的Pin按钮。
(2)双击“TO”栏的《new》,在出现的如图2-24所示的下拉栏中分别选择本工程要锁定的端口信号名;然后双击对应的Location栏的《new》,在出现的下拉栏中选择对应端口信号名的器件引脚号,如对应CQ[3],选择42脚。
在此选择GW48-EDA系统的电路模式No.5,通过查阅附录有关”芯片引脚对照表”,GWAC3板确定引脚分别为:主频时钟clk接Clock0(第93脚,可接在4Hz上);计数使能EN可接电路模式No.5的键1(PIO0对应第1脚);复位clear则接电路模式No.5的键2(PIO1对应第2脚,注意键序与引脚号码并无对应关系);4位输出数据总线CQ[3..0]可由数码1来显示,通过分别接PIO19、PIO18、PIO17、PIO16(它们对应的引脚编号分别为42、41、40、39)。
VerilogHDL简单计算器设计-文档
目录第一章设计目的及任务要求 (1)1.1 设计目的 (1)1.2 设计任务 (1)1.3 课设要求 (1)第二章设计思路 (1)2.1 设计总体框图 (1)2.2 设计原理 (1)2.2.1 计算其原理 (1)2.2.2 数码显示原理 (2)2.2.3 八位数码管扫描的原理 (2)第三章设计源程序及分析 (2)3.1 计算器模块 (2)3.1.1 计算器源程序 (2)3.1.2 计算器程序分析 (2)3.2 数码管显示部分 (3)3.2.1 数码管显示源程序 (3)3.2.2 数码管显示程序分析 (4)3.3 循环扫描模块 (4)3.3.1 循环扫描程序 (4)3.3.2 循环程序分析 (5)3.4 总程序及其分析 (5)第四章时序仿真和结果验证 (8)4.1 计算器时序仿真及其分析 (8)4.2 数码管时序仿真及分析 (8)4.3 总体时序仿真图 (8)4.4 结果验证 (8)第五章心得体会 (9)第一章设计目的及任务要求1.1 设计目的(1)进一步加强熟练EDA基础知识。
(2)熟练掌握Quartus 6.0软件的使用以及用该软件编程和仿真的全过程。
(3)培养独立思考问题,解决问题的能力以及查阅相关资料和资料的正确使用能力,为明年的毕业设计打下良好的设计基础。
1.2 设计任务设计一个简单计算器,输入为8位二进制数,分别用两位数码管显示,输出的计算结果为16位二进制数,并用四位数码管显示,能够实现+、-、 *、/ 四种运算,其中除法的结果显示分为商和余数两部分,分别用两位数码管显示。
1.3 课设要求(1)说明题目的设计原理和思路、采用方法及设计流程。
(2)系统框图、Verilog语言设计程序或原理图。
(3)对各子模块的功能以及各子模块之间的关系做较详细的描述。
(4)详细说明调试方法和调试过程。
(5)说明测试结果:仿真时序图和结果显示图,并对其进行说明和分析。
第二章设计思路2.1 设计总体框图有分析可知,本次课程设计可以分成五个木块来实现相应的功能,分别是输入模块,计算模块,扫描模块,输出模块以及显示模块。
用verilog语言设计四位简单计算器
用verilog语言设计四位简单计算器module jsq(clk,keyin,keyout,leda,ledb,num3);input clk;input [3:0]keyin;output [3:0]keyout;reg [3:0]keyout;output [3:0]leda;reg [3:0]leda;output [3:0]ledb;reg [3:0]ledb;integer clk_klv;output [31:0]num3;always @(posedge clk) //分频clk_klv=clk_klv+1;reg [1:0]keyhang=0; //按键扫描reg [3:0]keynum=0; //最近按键的值reg keyen=0; //按键锁定作用,每次都必须重新按下才有效reg keysign=0; //当前按键的属性,0代表数字,1代表 +-*/=复位reg [7:0]delay=0; //按键消抖reg order2=0; //作用:延迟一个时钟,keyen跳变输出,确保keynum 被赋值always @(posedge clk_klv[10])beginif(order2==0)begincase({keyhang,keyin})6'b00_1110: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h0;order2=1;end endkeysign=0;keynum=4'h1;order2=1;end end6'b00_1011: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h2;order2=1;end end6'b00_0111: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h3;order2=1;end end6'b01_1110: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h4;order2=1;end end6'b01_1101: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h5;order2=1;end end6'b01_1011: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h6;order2=1;end end6'b01_0111: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h7;order2=1;end end6'b10_1110: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h8;order2=1;end end6'b10_1101: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h9;order2=1;end end6'b10_1011: begin delay=0;if(keyen==0)begin keysign=1;keynum=4'ha;order2=1;end endkeysign=1;keynum=4'hb;order2=1;end end6'b11_1110: begin delay=0;if(keyen==0)begin keysign=1;keynum=4'hc;order2=1;end end6'b11_1101: begin delay=0;if(keyen==0)begin keysign=1;keynum=4'hd;order2=1;end end6'b11_1011: begin delay=0;if(keyen==0)begin keysign=1;keynum=4'he;order2=1;end end6'b11_0111: begin delay=0;if(keyen==0)begin keysign=1;keynum=4'hf;order2=1;end enddefault: beginkeyhang=keyhang+1;delay=delay+1;if(delay>=100)keyen= 0;endendcasecase(keyhang)0:keyout=4'b1110;1:keyout=4'b1101;2:keyout=4'b1011;3:keyout=4'b0111;endcaseendelsebegin keyen=1;order2=0;endendreg [2:0]order=0; //当前状态integer num1=0,num2=0,num3=0; //第一个,第二个,结果reg [3:0]sign; //+-*/reg [7:0]lednum=100; //显示的数字reg [3:0]in_num=0; //限制显示的数字位,限制在2为:0~99 always @(posedge keyen)begincase(order)0: if(keysign) begin sign[3:0]=keynum[3:0];order=order+1; in_num=0;end //在没有按下+-*/之前会存储数字elseif(num1<10000)begin num1=num1*10+keynum;lednum=num1;in_num=in_num+1; end1: if(keysign) begincase(sign)//在没有按下=号之前会存储数字4'ha:num3=num1+num2;4'hb:num3=num1-num2;4'hc:num3=num1*num2;4'hd:num3=num1/num2;endcaselednum=num3+0;order=order+1;endelse if(num2<10000)begin num2=num2*10;num2=num2+keynum;lednum=num2;in_num=in_num+1; endendcaseif(keynum==4'hf)beginorder=0;num1=0;num2=0;num3=0;lednum=100;end //复位endalways @(*) //显示函数if(lednum<=99)beginleda=lednum/10;ledb=lednum%10;endelsebeginleda=15;ledb=15;endendmodule。
用VerilogHDL设计计数器
⽤VerilogHDL设计计数器⽤Verilog HDL设计计数器⼀、实验⽬的1. 学习使⽤Verilog HDL语⾔,并学会使⽤进⾏QuartusⅡ软件编程和仿真;2. 掌握数字电路的设计⽅法,熟悉设计过程及其步骤;3. 培养学⽣的动⼿能⼒,能学以致⽤,为今后从事电⼦线路设计打下良好基础;4. 巩固加深对数电知识的理解,在仿真调试过程中,能结合原理来分析实验现象;⼆、实验内容1.设计内容及要求1)利⽤Verilog HDL设计⼀个以⾃⼰学号后三位为模的计数器;2)编写源程序;3)给出仿真电路图和仿真波形图;2.需求分析:由于本⼈的学号后3位为212,所以应编⼀个以212为模的加法计数器。
若采⽤同步清零的⽅法,则计数为0~211,化为⼆进制数即为0 0000 0000计到0 1101 0011。
3.编写源代码:module count_212(out,data,load,reset,clk);output [8:0] out;input [8:0] data;inputload,reset,clk;reg [8:0] out;always @(posedgeclk)//clk上升沿触发beginif(!reset)out=9'h000; //同步清零,低电平有效else if (load)out=data; //同步预置else if (out>=211)out=9'h000; //计数最⼤值为211,超过清零else out=out+1; //计数endendmodule程序说明:该计数器为⼀个9位计数器,计数范围0~211,具有同步同步置数和同步清零功能。
时钟的上升沿有效,当clk信号的上升沿到来时,如果清零信号为0,则清零;若不为0,计数器进⾏计数,计⾄211处同步清零。
4.画出仿真电路图:图1为同步置数、同步清零加法计数器的仿真电路图图1 仿真电路图5.画出仿真波形先对逻辑波形进⾏初始化设置,将清零信号‘restest’置1,置数信号‘load’置0,得到的仿真波形图2所⽰,波形终⽌处如图3所⽰,图4为计数到211后⾃动清零。
基于 Verilog语言的可预置加减计数器的设计
基于Verilog 语言的可预置加减计数器的设计胡 滨(西安邮电学院 陕西西安 710061)摘 要:计数器是大规模集成电路中运用最广泛的结构之一。
在模拟及数字集成电路设计当中,灵活地选择与使用计数器可以实现很多复杂的功能,可以大量减少电路设计的复杂度和工作量。
讨论了一种可预置加减计数器的设计,运用Verilog HDL 语言设计出了一种同步的可预置加减计数器,该计数器可以根据控制信号分别实现加法计数和减法计数,从给定的预置位开始计数,并给出详细的Verilog HDL 源代码。
最后,设计出了激励代码对其进行仿真验证,实验结果证明该设计符合功能要求,可以实现预定的功能。
关键词:Verilog HDL ;可逆计数器;ModelSim ;可预置加减计数器中图分类号:TN47 文献标识码:B 文章编号:1004373X (2007)1617702Design of R eversible Counter B ased on V erilog H DLHU Bin(Xi ′an University of Post &Telecommunications ,Xi ′an ,710061,China )Abstract :Counter is one of the elements most in use in VL SI design.It has been proved that choosing and using counter properly can solve many complex problems.Discussing the design of a kind of reversible counter ,the study devises a synchro 2nous reversible counter by applying Verilog HDL.The reversible counter can count f rom the given preset data ,the detailed Veriog HDL source code has been given .The counter can add and subtract according to control signals.Finally ,the study devi 2ses stimulate code to its simulation certification.The certification result testifies that the design accord with the f unctional re 2quirements can realize the preconcerted f unction.K eywords :Verilog HDL ;reversible counter ;ModelSim ;preset modified counter收稿日期:20070116 计数器对时钟脉冲进行计数,还被广泛用于定时、分频、以及各种复杂的数字电路中,是计算机中的一个重要器件,是应用最广泛的一种典型的时序电路。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录第一章设计目的及任务要求..................................................................................... 错误!未定义书签。
设计目的................................................... 错误!未定义书签。
设计任务................................................... 错误!未定义书签。
课设要求................................................... 错误!未定义书签。
第二章设计思路............................................... 错误!未定义书签。
设计总体框图............................................... 错误!未定义书签。
设计原理................................................... 错误!未定义书签。
计算其原理............................................. 错误!未定义书签。
数码显示原理........................................... 错误!未定义书签。
八位数码管扫描的原理................................... 错误!未定义书签。
第三章设计源程序及分析....................................... 错误!未定义书签。
计算器模块................................................. 错误!未定义书签。
计算器源程序........................................... 错误!未定义书签。
计算器程序分析......................................... 错误!未定义书签。
数码管显示部分...................................................................................................... 错误!未定义书签。
数码管显示源程序.......................................................................................... 错误!未定义书签。
数码管显示程序分析..................................................................................... 错误!未定义书签。
循环扫描模块........................................................................................................... 错误!未定义书签。
循环扫描程序................................................................................................... 错误!未定义书签。
循环程序分析................................................................................................... 错误!未定义书签。
总程序及其分析...................................................................................................... 错误!未定义书签。
第四章时序仿真和结果验证..................................................................................... 错误!未定义书签。
计算器时序仿真及其分析.................................................................................... 错误!未定义书签。
数码管时序仿真及分析 ........................................................................................ 错误!未定义书签。
总体时序仿真图...................................................................................................... 错误!未定义书签。
结果验证.................................................................................................................... 错误!未定义书签。
第五章心得体会............................................................................................................ 错误!未定义书签。
第一章设计目的及任务要求设计目的(1)进一步加强熟练EDA基础知识。
(2)熟练掌握Quartus 软件的使用以及用该软件编程和仿真的全过程。
(3)培养独立思考问题,解决问题的能力以及查阅相关资料和资料的正确使用能力,为明年的毕业设计打下良好的设计基础。
设计任务设计一个简单计算器,输入为8位二进制数,分别用两位数码管显示,输出的计算结果为16位二进制数,并用四位数码管显示,能够实现+、-、*、/ 四种运算,其中除法的结果显示分为商和余数两部分,分别用两位数码管显示。
课设要求(1)说明题目的设计原理和思路、采用方法及设计流程。
(2)系统框图、Verilog语言设计程序或原理图。
(3)对各子模块的功能以及各子模块之间的关系做较详细的描述。
(4)详细说明调试方法和调试过程。
(5)说明测试结果:仿真时序图和结果显示图,并对其进行说明和分析。
第二章设计思路设计总体框图有分析可知,本次课程设计可以分成五个木块来实现相应的功能,分别是输入模块,计算模块,扫描模块,输出模块以及显示模块。
图一设计总体框图设计原理计算其原理Verilog语言中可直接用运算符+、-、*、/、%来实现四则运算,系统会根据程序自动综合出相应的计算器。
分别是加法器模块,减法器模块,乘法器模块和除法器模块,当程序变得正确的话则各个程序会按照一定的步骤一步步的往下执行的。
数码显示原理7段数码是纯组合电路,通常的小规模专用IC,如74或4000系列的器件只能作十进制BCD码译码,然而数字系统中的数据处理和运算都是2进制的,所以输出表达都是16进制的,为了满足16进制数的译码显示,最方便的方法就是利用译码程序在FPGA/CPLD中来实现。
设计7段译码器,输出信号LED7S的7位分别接如图一数码管的7个段,高位在左,低位在右。
例如当LED7S输出为“1101101”时,数码管的7个段:g、f、e、d、c、b、a分别接1、1、0、1、1、0、1;接有高电平的段发亮,于是数码管显示“5”。
注意,这里没有考虑表示小数点的发光管,如果要考虑,需要增加段h。
共阴极七段数码管的原理图如下图二所示。
图二共阴极七段数码管八位数码管扫描的原理图三所示的是8位数码扫描显示电路,其中每个数码管的7个段:g、f、e、d、c、b、a都分别连在一起,8个数码管分别由8个选通信号k1、k2、…k8来选择。
被选通的数码管显示数据,其余关闭。
如在某一时刻,k3为高电平,其余选通信号为低电平,这时仅k3对应的数码管显示来自段信号端的数据,而其它7个数码管呈现关闭状态。
根据这种电路状况,如果希望在8个数码管显示希望的数据,就必须使得8个选通信号k1、k2、…k8分别被单独选通,并在此同时,在段信号输入口加上希望在该对应数码管上显示的数据,于是随着选通信号的扫变,就能实现扫描显示的目的。
图三8位数码管显示驱动电路扫描电路通过可调时钟输出片选地址SEL[2..0]。
由SEL[2..0] 通过3-8译码器决定了8位中的哪一位显示,SEL[2..0]变化的快慢决定了扫描频率f扫描的快慢。
扫描频率大于人眼的分辨率时,呈现出八个数码管同时点亮。
第三章设计源程序及分析计算器模块计算器源程序mdule jsq(a,b,c,out);input[7:0]a,b;input[1:0]c;otput[15:0]out;reg [15:0]outreg[7:0]out1,out2;always@(a,b,c,out)case(c)2'b00:out=a+b;2'b01:out=a-b;2'b10:out=a*b;2'b11:beginout1=a/b;out2=a%b;out={out1,out2};enddefault:;endcaseendmodule计算器程序分析该模块是本次设计的核心部分,用于实现四则运算,两位八位二进制数a、b作为待计算的输入,并输入两位二进制数c作为计算功能选择,00代表加法运算、01代表减法运算、10代表乘法运算、11代表除法运算。
输出16位二进制数out位运算结果。
并在总体设计中把输入、输出端接到数码管上。
数码管显示部分数码管显示源程序module DECL7S (A, LED7S);input [3:0] A;output [6:0] LED7S;reg [6:0] LED7S;always @(A)begincase(A)4'b0000 : LED7S<=7'b0111111;4'b0001: LED7S <= 7'b0000110 ;4'b0010: LED7S <= 7'b1011011;4'b0011: LED7S <= 7'b1001111;4'b0100: LED7S <= 7'b1100110 ;4'b0101: LED7S <= 7'b1101101;4'b0110: LED7S <= 7'b1111101 ;4'b0111: LED7S <= 7'b0000111 ;4'b1000: LED7S <= 7'b1111111 ;4'b1001: LED7S <= 7'b1101111 ;4'b1010: LED7S <= 7'b1110111 ;4'b1011: LED7S <= 7'b1111100 ;4'b1100: LED7S <= 7'b0111001 ;4'b1101: LED7S <= 7'b1011110 ;4'b1110: LED7S <= 7'b1111001 ;4'b1111: LED7S <= 7'b1110001 ;endcaseendendmodule数码管显示程序分析该模块是整个设计中的显示部分,是一个编码器组合逻辑设计,每个数码管可显示十六进制0至F,对应4位二进制数,因此输入端a、b分别用两个数码管显示,输出out用四个数码管显示,该设计中需要八个同样的数码管显示器,即。