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系统函数产⽣随机数。
- 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用四个数码管显示,该设计中需要八个同样的数码管显示器,即。