verilog HDL十进制加减法计数器报告
VerilogHDL十进制计数器实验Quartus非常详细的步骤
![VerilogHDL十进制计数器实验Quartus非常详细的步骤](https://img.taocdn.com/s3/m/dbe4fc6703d8ce2f006623d7.png)
实验二十进制计数器实验该实验将使用Verilog 硬件描述语言在DE2-70 开发平台上设计一个基本时序逻辑电路——1 位十进制计数器。
通过这个实验,读者可以了解使用Quartus 工具设计硬件的基本流程以及使用Quartus II 内置的工具进行仿真的基本方法和使用SignalTap II 实际观察电路运行输出情况。
SignalTap II 是Quartus 工具的一个组件,是一个片上的逻辑分析仪,可以通过JTAG 电缆将电路运行的实际输出传回Quartus 进行观察,从而省去了外界逻辑分析仪时的很多麻烦。
实验步骤3.1建立工程并完成硬件描述设计1. 打开Quartus II 工作环境,如图3-1 所示。
图3-1 Quartus II工作环境界面2. 点击菜单项File->New Project Wizard 帮助新建工程。
参看图3-2。
图3-2 选择New Project Wizard打开Wizard 之后,界面如图3-3 所示。
点击Next,如图3-3。
第23 页共208 页图3-3 New Project Wizard界面3. 输入工程工作路径、工程文件名以及顶层实体名。
这次实验会帮助读者理解顶层实体名和工程名的关系,记住目前指定的工程名与顶层实体名都是Counter10,输入结束后,如图3-4 所示。
点击Next。
图3-4输入设计工程信息4. 添加设计文件。
界面如图3-5 所示。
如果用户之前已经有设计文件(比如.v 文件)。
第24 页共208 页那么再次添加相应文件,如果没有完成的设计文件,点击Next 之后添加并且编辑设计文件。
图3-5添加设计文件5. 选择设计所用器件。
由于本次实验使用Altera 公司提供的DE2-70 开发板,用户必须选择与DE2-70 开发板相对应的FPGA 器件型号。
在Family 菜单中选择Cyclone II,Package 选FBGA,Pin Count 选896,Speed grade 选6,确认Available devices 中选中EP2C70F896C6,如图3-6。
verilog计数器实验报告
![verilog计数器实验报告](https://img.taocdn.com/s3/m/770515fd1eb91a37f1115cdd.png)
计数器1、实现目标及介绍实验实现了一个简易的计数器,计数范围可达899(0~899),通过key4按键计数,每按下一次,计数加一,百位数显示在led上,个位与十位显示在数码管上。
为十进制计数,数码管1计数到九后置零。
数码管2获得进位加一,数码管2到9后当再次获得个位进位时再次向百位进一,点亮led1,每百位点亮一个led。
此外key4为清零键,可随时按键清零。
2、效果展示计数99清零计数100视频展示(双击观看)3、代码实现与模块分析1.顶层模块module jishuqi(input wire clk,rst, //时钟和复位输入input wire key1, //拨码计output wire [7:0]led,output wire [8:0] segment_led_1,segment_led_2 //数码管输出);wire key_pulse;reg [7:0] cnt; //计时计数器reg [7:0] hud; //百位计数initial hud[7:0] <= 8'b11111111;always @(posedge clk or negedge rst)begin //数码管显示要按照十进制的方式显示if(!rst)begin cnt <= 8'h00;hud [7:0] <= 8'b11111111;endelse if(key_pulse)beginif(cnt[3:0] == 4'd9) //个位进位判断begincnt[3:0] <= 4'd0;if(cnt[7:4] == 4'd9 ) //十位进位判断begincnt[7:4] <= 4'd0;hud[7:0] <= hud[7:0] - 1'b1;endelsecnt[7:4] <= cnt[7:4] + 1'b1;endelse cnt[3:0] <= cnt[3:0] + 1'b1;endelsecnt <= cnt;endassign led = hud;//例化调用数码管显示模块segment u2(.seg_data_1 (cnt[7:4]), //g_data input.seg_data_2 (cnt[3:0]), //g_data input.seg_led_1 (segment_led_1), //MSB~LSB = SEG,DP,G,F,E,D,C,B,A.seg_led_2 (segment_led_2) //MSB~LSB = SEG,DP,G,F,E,D,C,B,A);//例化调用消抖模块debounce u1 (.clk (clk),.rst (rst),.key (key1),.key_pulse (key_pulse));endmodule2.数码管显示模块module segment(seg_data_1,seg_data_2,seg_led_1,seg_led_2);input [3:0] seg_data_1;//数码管需要显示0~9十个数字,所以最少需要4位输入做译码input [3:0] seg_data_2; //小脚丫上第二个数码管output [8:0] seg_led_1;//在小脚丫上控制一个数码管需要9个信号MSB~LSB=DIG、DP、G、F、E、D、C、B、A output [8:0] seg_led_2;//在小脚丫上第二个数码管的控制信号MSB~LSB=DIG、DP、G、F、E、D、C、B、Areg [8:0] seg [9:0];//定义了一个reg型的数组变量,相当于一个10*9的存储器,存储器一共有10个数,每个数有9位宽initial//在过程块中只能给reg型变量赋值,Verilog中有两种过程块always和initial//initial和always不同,其中语句只执行一次beginseg[0] = 9'h3f; //对存储器中第一个数赋值9'b00_0011_1111,相当于共阴极接地,DP点变低不亮,7段显示数字0seg[1] = 9'h06; //7段显示数字 1seg[2] = 9'h5b; //7段显示数字 2seg[3] = 9'h4f; //7段显示数字 3seg[4] = 9'h66; //7段显示数字 4seg[5] = 9'h6d; //7段显示数字 5seg[6] = 9'h7d; //7段显示数字 6seg[7] = 9'h07; //7段显示数字7seg[8] = 9'h7f; //7段显示数字8seg[9] = 9'h6f; //7段显示数字9endassign seg_led_1 = seg[seg_data_1]; //连续赋值,这样输入不同四位数,就能输出对于译码的9位输出assign seg_led_2 = seg[seg_data_2]; endmodule3.按键消抖模块//按键消抖module debounce (clk,rst,key,key_pulse);parameter N = 2; //要消除的按键的数量input clk;input rst;input [N-1:0] key; //输入的按键output [N-1:0] key_pulse; //按键动作产生的脉冲reg [N-1:0] key_rst_pre; //定义一个寄存器型变量存储上一个触发时的按键值reg [N-1:0] key_rst; //定义一个寄存器变量储存储当前时刻触发的按键值wire [N-1:0] key_edge; //检测到按键由高到低变化是产生一个高脉冲//利用非阻塞赋值特点,将两个时钟触发时按键状态存储在两个寄存器变量中always @(posedge clk or negedge rst)beginif (!rst)beginkey_rst <= {N{1'b1}}; //初始化时给key_rst赋值全为1,{}中表示N个1key_rst_pre <= {N{1'b1}};endelsebeginkey_rst <= key; //第一个时钟上升沿触发之后key的值赋给key_rst,同时key_rst的值赋给key_rst_prekey_rst_pre <= key_rst; //非阻塞赋值。
verilog hdl 十进制计算
![verilog hdl 十进制计算](https://img.taocdn.com/s3/m/d6e5abae846a561252d380eb6294dd88d1d23d58.png)
Verilog HDL是一种硬件描述语言,常用于数字电路设计和仿真。
在Verilog HDL中,我们经常需要进行十进制计算,因此熟练掌握Verilog HDL中的十进制计算方法对于数字电路设计工程师来说非常重要。
本文将介绍Verilog HDL中的十进制计算方法,并结合实例进行详细说明。
一、Verilog HDL中的十进制计算在Verilog HDL中,可以使用十进制数进行计算和赋值。
十进制数可以用整数和实数表示。
1. 整数表示:可以直接使用十进制数来表示整数,例如:```verilogint a = 10; // 整数a赋值为10```2. 实数表示:可以使用科学计数法来表示实数,例如:```verilogreal b = 1.5e3; // 实数b赋值为1500```二、十进制计算实例演示下面通过实例来演示Verilog HDL中的十进制计算方法。
实例1:整数计算假设我们需要设计一个模块,实现两个整数之和的计算。
我们可以使用Verilog HDL来实现这一功能。
```verilogmodule adder (input int a,input int b,output int sum);assign sum = a + b; // 计算a和b的和并赋值给sumendmodule```在这个实例中,我们定义了一个add模块,其中有两个输入a和b,一个输出sum。
我们使用assign关键字进行赋值操作,计算a和b 的和并将结果赋值给sum。
这样,我们就实现了两个整数之和的计算功能。
实例2:实数计算接下来,我们再演示一个实数计算的例子。
假设我们需要设计一个模块,实现两个实数相乘的计算。
我们同样可以使用Verilog HDL来实现这一功能。
```verilogmodule multiplier (input real x,input real y,output real product);assign product = x * y; // 计算x和y的积并赋值给productendmodule```在这个实例中,我们定义了一个multiplier模块,其中有两个输入x和y,一个输出product。
Verilog HDL 实验报告
![Verilog HDL 实验报告](https://img.taocdn.com/s3/m/b0440990a48da0116c175f0e7cd184254b351be7.png)
Verilog实验报告班级:学号:姓名:实验1 :用 Verilog HDL 程序实现直通线1 实验要求:(1) 编写一位直通线的 Veirlog HDL 程序.(2) 编写配套的测试基准.(3) 通过 QuartusII 编译下载到目标 FPGA器件中进行验证.(4) 建议用模式 52 试验程序:module wl(in,out);input in;output out;wire out;assign out=in;endmodule3 测试基准:`include “wl.v”module wl_tb;reg in_tb;wire out_tb;initialbeginin_tb =0;#100 in_tb =1;#130 in_tb =0;endendmodule4 仿真图形:实验2 :用 Verilog HDL 程序实现一位四选一多路选择器1实验要求:(1) 编写一位四选一多路选择器的 Veirlog HDL 程序.(2) 编写配套的测试基准.(3) 通过 QuartusII 编译下载到目标 FPGA器件中进行验证.(4)建议用模式 52 试验程序:module mux4_to_1 (out,i0,i1,i2,i3,s1,s0);output out;input i0,i1,i2,i3;input s1, s0;reg out;always @ (s1 or s0 or i0 or i1 or i2 or i3)begincase ({s1, s0})2'b00: out=i0;2'b01: out=i1;2'b10: out=i2;2'b11: out=i3;default: out=1'bx;endcaseendendmodule3 测试基准:`include "mux4_to_1.v"module mux4_to_1_tb1;reg ain,bin,cin,din;reg[1:0] select;reg clock;wire outw;initialbeginain=0;bin=0;cin=0;din=0;select=2'b00;clock=0;endalways #50 clock=~clock;always @(posedge clock)begin#1 ain={$random} %2;#3 bin={$random} %2;#5 cin={$random} %2;#7 din={$random} %2;endalways #1000 select[0]=!select[0];always #2000 select[1]=!select[1];mux4_to_1 m(.out(outw),.i0(ain),.i1(bin),.i2(cin),.i3(din),.s1(select[1]),.s0(select[0])); endmodule4 仿真图形:实验3:用 Verilog HDL 程序实现十进制计数器1实验要求:(1) 编写十进制计数器的 Veirlog HDL 程序. 有清零端与进位端, 进位端出在输出为 9 时为高电平.(2) 编写配套的测试基准.(3) 通过 QuartusII 编译下载到目标 FPGA器件中进行验证.(4) 自行选择合适的模式2 实验程序:module counter_10c (Q, clock, clear, ov);output [3:0] Q;output ov;input clock, clear;reg [3:0] Q;reg ov;initial Q=4'b0000;always @ (posedge clear or negedge clock)beginif (clear)Q<=4'b0;else if (Q==8)beginQ<=Q+1;ov<=1'b1;endelse if (Q==9)beginQ<=4'b0000;ov<=1'b0;endelsebeginQ<=Q+1;ov<=1'b0;endendendmodule3 测试基准:`include"./counter_10c.v"module counter_10c_tb;wire[3:0] D_out;reg clk,clr;wire c_out;reg[3:0] temp;initialbeginclk=0;clr=0;#100 clr=1;#20 clr=0;endalways #20 clk=~clk;counter_10c m_1(.Q(D_out),.clear(clr),.clock(clk),.ov(c_out)); endmodule4 仿真波形:实验4 :用 Verilog HDL 程序实现序列检测器1 实验要求:、(1) 编写序列检测器的 Veirlog HDL 程序. 检测串行输入的数据序列中是否有目标序列5'b10010, 检测到指定序列后, 用一个端口输出高电平表示.(2) 编写配套的测试基准.(3) 通过 QuartusII 编译下载到目标 FPGA器件中进行验证.(4) 自行选择合适的模式2试验程序:module e15d1_seqdet( x, z, clk, rst);input x,clk, rst;output z;reg [2:0] state;wire z;parameter IDLE = 3 'd0,A = 3'd1,B = 3'd2,C = 3'd3,D = 3'd4,E = 3'd5,F = 3'd6,G = 3'd7;assign z =(state==D && x==0)?1:0;always @(posedge clk or negedge rst)if(!rst)beginstate<=IDLE;endelsecasex(state)IDLE: if(x==1)state<=A;else state<=IDLE;A: if (x==0)state<=B;else state<=A;B: if (x==0)state<=C;else state<=F;C: if(x==1)state<=D;else state<=G;D: if(x==0)state<=E;else state<=A;E: if(x==0)state<=C;else state<=A;F: if(x==1)state<=A;else state<=B;G: if(x==1)state<=F;else state <=G;default: state<=IDLE;endcaseendmodule3测试基准:`include"e15d1_seqdet.v"`timescale 1ns/1ns`define halfperiod 20module e15d1_seqdet_tb;reg clk, rst;reg [23:0] data;wire z;reg x;initialbeginclk =0;rst =1;#2 rst =0;#30 rst =1;data= 20 'b1100_1001_0000_1001_0100;#(`halfperiod*1000) $stop;endalways #(`halfperiod) clk=~clk;always @ (posedge clk)begin#2 data={data[22:0],data[23]};x=data[23];ende15d1_seqdet m(.x(x),.z(z),.clk(clk),.rst(rst)); endmodule4仿真波形:。
十进制计数器实验报告
![十进制计数器实验报告](https://img.taocdn.com/s3/m/a3886a265901020207409c4a.png)
when 4=>seg7<="1100110";
when 5=>seg7<="1101101";
when 6=>seg7<="1111101";
when 7=>seg7<="0000111";
when 8=>seg7<="1111111";
when 9=>seg7<="1100111";
2,建完工程后,再建一个VHDL FILE,打开VHDL编辑器对话框.
3,按照实验原理和自己的想法,在VHDL编辑窗口编写Verilog程序.
4,编写完Verilog程序后,保存起来.注意顶体名跟程序实体名要一致.
5,对自己编写的Verilog程序进行编译并仿真,对程序的错误进行修改.
6,编译仿真无误后,进行管脚分配.分配完成后,再进行全编译一次,以使管脚分配生效.
signal seg7:std_logic_vector(6 downto 0);
signal countnum: integer range 0 to 9;
signal clk_1k: std_logic;
begin
r<="011111";
process(clk)
variable cnt1:integer range 0 to 5000;
end if;
else
cnt1:=cnt1+1;
end if;
end if;
end process;
verilog HDL十进制加减法计数器报告
![verilog HDL十进制加减法计数器报告](https://img.taocdn.com/s3/m/1a48c78471fe910ef12df822.png)
十进制加减法计数器1.实验要求(1)在Modelsim环境中编写十进制加减法计数器程序;(2)编译无误后编写配套的测试程序;(3)仿真后添加信号,观察输出结果。
2.设计程序如下module decade_counter#(parameter SIZE=4)(input clock,load_n,clear_n,updown,input [SIZE-1:0]load_data,output reg [SIZE-1:0]q);always@(negedge load_n,negedge clear_n,posedge clock)if (!load_n)q<=load_data;else if (!clear_n)q<=0;else //clockif(updown)q<=(q+1)%10;elsebeginif(q==0)q<=9;elseq<=q-1;endendmodule3.测试程序如下`timescale 1ns/1nsmodule test_decade_counte;reg clock,load_n,clear_n,updown;reg [3:0]load_data;wire [3:0]q;decade_counter T1(clock,load_n,clear_n,updown,load_data,q);initialbeginclock=0;clear_n=0;#30 clear_n=1;load_n=0;load_data=7;#30 load_n=1;updown=0;#300 updown=1;#300 updown=0;#300 updown=1;#300 $stop;endalways#10 clock=~clock;always@(q)$display("At time%t,q=%d",$time,q);endmodule4.波形如下5.测试结果如下# At time 0,q= 0# At time 30,q= 7# At time 70,q= 6# At time 90,q= 5# At time 110,q= 4# At time 130,q= 3# At time 150,q= 2# At time 170,q= 1# At time 190,q= 0# At time 210,q= 9# At time 230,q= 8# At time 250,q= 7# At time 270,q= 6# At time 290,q= 5# At time 310,q= 4# At time 330,q= 3# At time 370,q= 3 # At time 390,q= 4 # At time 410,q= 5 # At time 430,q= 6 # At time 450,q= 7 # At time 470,q= 8 # At time 490,q= 9 # At time 510,q= 0 # At time 530,q= 1 # At time 550,q= 2 # At time 570,q= 3 # At time 590,q= 4 # At time 610,q= 5 # At time 630,q= 6 # At time 650,q= 7 # At time 670,q= 6 # At time 690,q= 5 # At time 710,q= 4 # At time 730,q= 3 # At time 750,q= 2 # At time 770,q= 1 # At time 790,q= 0 # At time 810,q= 9 # At time 830,q= 8 # At time 850,q= 7 # At time 870,q= 6 # At time 890,q= 5 # At time 910,q= 4 # At time 930,q= 3 # At time 950,q= 2 # At time 970,q= 3 # At time 990,q= 4 # At time 1010,q= 5 # At time 1030,q= 6 # At time 1050,q= 7 # At time 1070,q= 8 # At time 1090,q= 9 # At time 1110,q= 0 # At time 1130,q= 1 # At time 1150,q= 2 # At time 1170,q= 3 # At time 1190,q= 4 # At time 1210,q= 5# At time 1250,q= 7。
Verilog实现加减乘除计算器
![Verilog实现加减乘除计算器](https://img.taocdn.com/s3/m/75ab13bbd0f34693daef5ef7ba0d4a7302766c07.png)
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系统函数产⽣随机数。
数字系统设计实验报告计数器、累加器
![数字系统设计实验报告计数器、累加器](https://img.taocdn.com/s3/m/86b214b44bfe04a1b0717fd5360cba1aa9118c06.png)
实验五计数器设计一、实验目的:1)复习计数器的结构组成及工作原理。
2)掌握图形法设计计数器的方法。
3)掌握Verilog HDL语言设计计数器的方法。
4)进一步熟悉设计流程、熟悉数字系统实验开发箱的使用。
二、实验器材:数字系统设计试验箱、导线、计算机、USB接口线三、实验内容:1)用图形法设计一个十进制计数器, 仿真设计结果。
下载, 进行在线测试。
用Verilog HDL语言设计一个十进制的计数器(要求加法计数;时钟上升沿触发;异步清零, 低电平有效;同步置数, 高电平有效), 仿真设计结果。
下载, 进行在线测试。
四、实验截图1)原理图:2)仿真波形:3)文本程序:5)波形仿真:五、实验结果分析、体会:这次实验, , 由于试验箱有抖动, 故在原理图上加了去抖电路, 但是在波形仿真的时候无需考虑抖动, 所以我在波形仿真的时候将去抖电路消除了, 方便观察实验六累加器设计一、实验目的:1)学习了解累加器工作原理;2)了解多层次结构的设计思路;3)学会综合应用原理图和文本相结合的设计方法。
实验器材:数字系统设计试验箱、导线、计算机、USB接口线三、实验内容:1)在文本输入方式下设计分别设计出8位的全加器和8位的寄存器, 并分别存为add8_8.v和reg8.v;3) 2)在原理图输入方式下通过调用两个模块设计出累加器电路, 并存为add8.bdf, 进行功能仿真;下载, 进行在线测试。
四、实验截图1)8位累加器原理图:2)波形仿真:3)文本输入8位加法器语言及符号:生成元器件:4)文本输入8位寄存器:生成图元:五、实验总结:通过本次实验, 学习了解累加器工作原理, 了解多层次结构的设计思路, 学会综合应用原理图和文本相结合的设计方法。
verilog实验-计数器实验报告
![verilog实验-计数器实验报告](https://img.taocdn.com/s3/m/30e9a47fdd3383c4ba4cd258.png)
v e r i l o g实验-计数器实验报告-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN计数器1、实现目标及介绍实验实现了一个简易的计数器,计数范围可达899(0~899),通过key4按键计数,每按下一次,计数加一,百位数显示在led上,个位与十位显示在数码管上。
为十进制计数,数码管1计数到九后置零。
数码管2获得进位加一,数码管2到9后当再次获得个位进位时再次向百位进一,点亮led1,每百位点亮一个led。
此外key4为清零键,可随时按键清零。
2、效果展示计数99清零计数100视频展示(双击观看)3、代码实现与模块分析1.顶层模块module jishuqi(input wire clk,rst, eg_data_1 (cnt[7:4]), eg_data_2 (cnt[3:0]), eg_led_1 (segment_led_1), eg_led_2 (segment_led_2) lk (clk),.rst (rst),.key (key1),.key_pulse (key_pulse));endmodule2.数码管显示模块module segment (seg_data_1,seg_data_2,seg_led_1,seg_led_2);input [3:0] seg_data_1;键消抖模块eg_data_1 (cnt[7:4]), eg_data_2 (cnt[3:0]), eg_led_1 (segment_led_1), eg_led_2 (segment_led_2) lk (clk),.rst (rst),.key (key1),.key_pulse (key_pulse));endmodule//按键消抖module debounce (clk,rst,key,key_pulse);parameter N = 2; //要消除的按键的数量input clk;input rst;input [N-1:0] key; //输入的按键output [N-1:0] key_pulse; //按键动作产生的脉冲reg [N-1:0] key_rst_pre; //定义一个寄存器型变量存储上一个触发时的按键值reg [N-1:0] key_rst; //定义一个寄存器变量储存储当前时刻触发的按键值wire [N-1:0] key_edge; //检测到按键由高到低变化是产生一个高脉冲//利用非阻塞赋值特点,将两个时钟触发时按键状态存储在两个寄存器变量中always @(posedge clk or negedge rst)beginif (!rst)beginkey_rst <= {N{1'b1}}; //初始化时给key_rst赋值全为1,{}中表示N个1key_rst_pre <= {N{1'b1}};endelsebeginkey_rst <= key; //第一个时钟上升沿触发之后key 的值赋给key_rst,同时key_rst的值赋给key_rst_prekey_rst_pre <= key_rst; //非阻塞赋值。
verilog八位十进制计数器实验报告附源代码修订版
![verilog八位十进制计数器实验报告附源代码修订版](https://img.taocdn.com/s3/m/2eabd9150029bd64793e2c35.png)
v e r i l o g八位十进制计数器实验报告附源代码修订版IBMT standardization office【IBMT5AB-IBMT08-IBMT2C-ZZT18】8位10进制计数器实验报告一、实验目的学习时序逻辑电路学会用verilog语言设计时序逻辑电路掌握计数器的电路结构掌握数码管动态扫描显示原理二、实验内容实现一个8bit十进制(BCD码)计数器端口设置:用拨动开关实现复位和使能LED灯来表示8位数据用数码管显示16进制的八位数据1.复位时计数值为8‘h02.复位后,计数器实现累加操作,步长为1,逢9进1,,计数值达到8‘h99后,从0开始继续计数3.使能信号为1时正常计数,为0时暂停计数,为1时可继续计数。
4.每0.5s计数值加15.8位的结果显示在LED灯上,其中LED灯亮表示对应的位为1,LED灯灭表示对应的灯为06.用isim进行仿真,用forever语句模拟时钟信号输入,并给变量赋值仿真initial语句。
7.用7段数码管的后两位显示16进制下8位结果。
三、实验结果烧写结果:拨动reset开关到1时,LED灯显示10010000,7段数码管显示“90”。
之后拨动WE开关呢,开始计数,LED开始变化并且7段数码管开始计数。
从99后到达00,LED重新开始从00000000开始亮,且数码管重新从00开始计数。
之后拨动WE开关,暂停计数,LED暂停亮灭,七段数码管暂停变化,WE拨回1,继续计数。
拨动复位信号时,无视WE信号,直接复位。
仿真结果:当输入reset信号时波形变化如下当达到一个扫描信号的周期时的波形如下当达到一个以上计数信号的周期时的波形实验分析:实验总体结构和模块间关系如图所示:(其中还需要补上使能信号)实验原理:由于要求实现数码管和LED灯的显示,先考虑LED灯,可以直接由8位输出信号控制,而数码管需要同时显示两个不同的数字,需要时分复用,即快速的交替显示十位和个位,利用人眼的视觉暂留来达到同时显示。
VHDL双向十进制加减法计数器(代码和截图)
![VHDL双向十进制加减法计数器(代码和截图)](https://img.taocdn.com/s3/m/134559dcce2f0066f533224e.png)
);
end entity;
architecture rtl of vh is
SIGNAL temp:std_logic_vector(3 downto 0);
begin
process (clk)
begin
if(we='1')then
temp<=d;
elsif(clk'event and clk='1')then
if(dir='0')then
if(temp<9)then
temp<=temp+'1';
co<=ห้องสมุดไป่ตู้0';
else
temp<="0000";
co<='1';
end if;
elsif(dir='1')then
if(temp>0)then
temp<=temp-'1';
co<='0';
else
temp<="1001";
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
entity vh is
port
(
clk: in std_logic;
dir: in std_logic;
we: in std_logic;
d : in std_logic_vector(3 downto 0);
co<='1';
verilog设计十进制计数器(含进位位)
![verilog设计十进制计数器(含进位位)](https://img.taocdn.com/s3/m/0538e49985868762caaedd3383c4bb4cf7ecb702.png)
verilog设计⼗进制计数器(含进位位)⼗进制计数器:设计要求:1、每当计数器值为4’b001时,⾃动回到4’b00002、每个时钟沿计数器值加13、进位输出carry应该与4'b1001同周期输出4、异步复位module cnt10 ( clk, rst_n, carry, cnt );input clk, rst_n;output carry;output [3:0] cnt;reg carry;reg [3:0] cnt;always @( posedge clk or negedge rst_n )beginif ( ~rst_n )begincnt <= 4'b0000;endelse if ( cnt == 4'b1001 )begincnt <= 4'b0000;endelsebegincnt <= cnt + 4'b0001;endendalways @(posedge clk or negedge rst_n)beginif(!rst_n)begincarry <= 1'b0;endelse if(cnt == 4'b1000)begincarry <= 1'b1;endelsecarry<= 1'b0;endendmoduleView Code测试程序:`timescale 1ns/1psmodule cnt10_tb();reg clk, rst_n;wire carry;wire [3:0] cnt;always #10 clk = ~clk;cnt10 cnt10_tb(.clk(clk),.rst_n(rst_n),.carry(carry),.cnt(cnt));initialbeginclk = 1'b0;rst_n = 1'b1;#10 rst_n = 1'b0;#10 rst_n = 1'b1;endendmodule波形图:在这个⼗进制计数器中,唯⼀要注意的⼀点就是进位位carry变化的时刻,如果是为了使下⼀级能正确接收到前⼀级的进位位标识,要在计数到九时使进位位有效;如上图波形所⽰。
10进制计数器verilog代码
![10进制计数器verilog代码](https://img.taocdn.com/s3/m/e201bf42e97101f69e3143323968011ca300f7d8.png)
以下是一个简单的10进制计数器的Verilog代码。
这个计数器在每个时钟周期内递增,并在计数到10后回滚到0。
verilog复制代码
module counter_10 (
input wire clk,
input wire reset,
output reg [3:0] count
);
always @(posedge clk or posedge reset) begin
if (reset) begin
count <= 4'b0000;
end else begin
count <= count + 1;
end
end
endmodule
在这个模块中,clk是时钟输入,reset是复位输入,count是4位的输出,表示当前的计数值。
在每个时钟上升沿,count都会递增。
当count达到10(即二进制的1010)时,它会被复位回0。
如果复位信号被激活,无论时钟状态如何,count都会被立即复位。
请注意,这是一个非常基础的计数器设计,没有包括一些更复杂的功能,比如预置值、异步/同步复位等。
如果你需要这些功能,你可能需要修改或扩展这个设计。
十进制减法计数器verilog代码
![十进制减法计数器verilog代码](https://img.taocdn.com/s3/m/2578457a0812a21614791711cc7931b765ce7b31.png)
十进制减法计数器verilog代码以下是一个十进制减法计数器的Verilog代码示例:```verilogmodule Decimal_Subtractor(input wire clk,input wire rst,input wire enable,input wire [3:0] subtrahend,input wire [3:0] minuend,output wire [3:0] difference,output wire borrow);reg [3:0] difference_reg;reg borrow_reg;always @(posedge clk or posedge rst) beginif (rst) begindifference_reg <= 0;borrow_reg <= 0;end else if (enable) begindifference_reg <= minuend - subtrahend;borrow_reg <= minuend < subtrahend;endendassign difference = difference_reg;assign borrow = borrow_reg;endmodule```该代码定义了一个具有四位输入和输出的十进制减法计数器模块。
输入包括时钟信号(clk)、复位信号(rst)、使能信号(enable)、被减数(subtrahend)和减数(minuend)。
输出包括差值(difference)和借位(borrow)。
计数器在时钟上升沿时更新。
在复位信号为高电平时,计数器被重置为零。
当使能信号为高电平时,计数器将被减数减去减数,并且根据减法的结果设置差值和借位。
对于四位的十进制数减法,减法的结果是一个四位的差值和一个借位。
在减法计算完成之前,借位输出将保持不变。
差值输出将根据减法的结果更新。
verilog八位十进制计数器实验报告
![verilog八位十进制计数器实验报告](https://img.taocdn.com/s3/m/d04cfc517f1922791688e8e5.png)
8位10进制计数器实验报告一、实验目的●学习时序逻辑电路●学会用verilog语言设计时序逻辑电路●掌握计数器的电路结构●掌握数码管动态扫描显示原理二、实验内容实现一个8bit十进制(BCD码)计数器端口设置:用拨动开关实现复位和使能LED灯来表示8位数据用数码管显示16进制的八位数据1.复位时计数值为8‘h02.复位后,计数器实现累加操作,步长为1,逢9进1,,计数值达到8‘h99后,从0开始继续计数3.使能信号为1时正常计数,为0时暂停计数,为1时可继续计数。
4.每计数值加15.8位的结果显示在LED灯上,其中LED灯亮表示对应的位为1,LED灯灭表示对应的灯为06.用isim进行仿真,用forever语句模拟时钟信号输入,并给变量赋值仿真initial语句。
7.用7段数码管的后两位显示16进制下8位结果。
三、实验结果烧写结果:拨动reset开关到1时,LED灯显示,7段数码管显示“90”。
之后拨动WE开关呢,开始计数,LED开始变化并且7段数码管开始计数。
从99后到达00,LED重新开始从00000000开始亮,且数码管重新从00开始计数。
之后拨动WE开关,暂停计数,LED暂停亮灭,七段数码管暂停变化,WE拨回1,继续计数。
拨动复位信号时,无视WE信号,直接复位。
仿真结果:当输入reset信号时波形变化如下当达到一个扫描信号的周期时的波形如下当达到一个以上计数信号的周期时的波形实验分析:实验总体结构和模块间关系如图所示:(其中还需要补上使能信号)实验原理:由于要求实现数码管和LED灯的显示,先考虑LED灯,可以直接由8位输出信号控制,而数码管需要同时显示两个不同的数字,需要时分复用,即快速的交替显示十位和个位,利用人眼的视觉暂留来达到同时显示。
这样就需要两种不同的频率信号。
一种是每一次,作为计数信号,用脉冲生成器生成,另一种是1ms一次的扫描信号,用降频器生成,将计数信号输入计数器来计数,并将计数的值和扫描信号同时输入扫描显示模块。
用verilog HDL输入法设计十进制计数器 实验报告
![用verilog HDL输入法设计十进制计数器 实验报告](https://img.taocdn.com/s3/m/ef69a8fd172ded630b1cb6c1.png)
实验名称:实验四:用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)。
Verilog 4—2线优先编码器和十进制加减计数器
![Verilog 4—2线优先编码器和十进制加减计数器](https://img.taocdn.com/s3/m/35d57b0fe87101f69e31959c.png)
Verilog 4—2线优先编码器和十进制加减计数器4—2线优先编码器:根据4线—2线优先编码器的逻辑表:输入输出I0 I1 I2 I3 Y1 Y21 0 0 0 0 0× 1 0 0 0 1 ×× 1 0 1 0 ××× 1 1 1可以得出输入与输出的逻辑表达式为:Y0=I2+I3Y1=I1(~I2)+I3根据此逻辑关系,写出verilog代码:module _4to2(I,Y0,Y1);input [3:0]I;output Y0,Y1;wire no1,no2;not (no1,I[2]); //对I2取反and (no2,I[1],no1); // I1&&(~I2)assign Y1=(no2|I[3]); // Y1=I1(~I2)+I3assign Y0=(I[2]|I[3]); // Y0=I2+I3endmodule仿真波形:十进制加减计数器:代码:module ten_2(rst,initial_value,clk,choose,oSEG,count);input clk,rst,choose; //50MHZ,复位按钮,加减选择档input[3:0]initial_value; //初值置数output[7:0]oSEG //数码管显示;output[3:0]count; //LED灯显示wire[3:0]count1;wire cp; //1HZdevide_f u1(cp,rst,clk); //分频ADD_SUB u2( cp,rst,choose,initial_value,count); //加减计数display_LUT u3(oSEG,count1); //数码管译码显示assign count1=count;endmodulemodule display_LUT (oSEG,count1);input [3:0]count1;output[7:0]oSEG;reg [7:0]oSEG1;always @(count1)begincase(count1)4'h0: oSEG1 = 8'b00111111; //对应译码4'h1: oSEG1= 8'b00000110;4'h2: oSEG1 = 8'b01011011;4'h3: oSEG1 = 8'b01001111;4'h4: oSEG1 = 8'b01100110;4'h5: oSEG1 = 8'b01101101;4'h6: oSEG1 = 8'b01111101;4'h7: oSEG1 = 8'b00000111;4'h8: oSEG1 = 8'b01111111;4'h9: oSEG1 = 8'b01101111;4'ha: oSEG1 = 8'b01110111;4'hb: oSEG1 = 8'b01111100;4'hc: oSEG1 = 8'b00111001;4'hd: oSEG1 = 8'b01011110;4'he: oSEG1 = 8'b01111001;4'hf: oSEG1 = 8'b01110001;endcaseendassign oSEG=~oSEG1; //低电平显示有效,所以取反endmodulemodule ADD_SUB( cp,rst,choose,initial_value,count);input [3:0]initial_value; //初值置数,通过拨码开关得到input cp,rst,choose;output[3:0]count;reg [3:0]count;always@(posedge cp or negedge rst )begin //检测时钟或者是否复位if(~rst)beginif(choose) count<=4'b0000; //加计数复位为0else count<=initial_value;end //减计数复位为初值elsebeginif(choose)beginif(count==initial_value) count<=4'b0000; //加计数到置数后,从0开始else count<=count+4'b0001; endelse beginif(count==4'b0000) count<=initial_value; //减计数从置数值减到0 else count<=count-4'b0001;endendendendmodulemodule devide_f(_1HZ,nCR,_50MHZ); //分频函数input _50MHZ,nCR;output _1HZ;reg _1HZ;reg[31:0]Q;always@(posedge _50MHZ )beginif(~nCR)Q=32'd0;if(Q>=32'd2*******)begin // 加到24 999999后取反一次,这样每5M刚好为1HZ Q<=32'd0;_1HZ=~_1HZ;endelseQ<=Q+1'd1;endendmodule。
Verilog HDL《数字加法器》报告
![Verilog HDL《数字加法器》报告](https://img.taocdn.com/s3/m/91bff231f8c75fbfc67db286.png)
实验三数字加法器的设计一、实验目的1. 掌握数字加法器的工作原理和逻辑功能。
2. 熟悉ISE集成开发环境。
3. 熟悉ISE中进行开发设计的流程。
二、实验环境1. 装有ModelSim和ISE的计算机。
2. Sword实验系统。
三、实验任务1. 用VerilogHDL语言设计实现4位串行数字加法器和4位并行加法器,在ModelSim上仿真实现。
2. 生成FPGA设计文件,下载到Sword实验系统上验证电路功能。
四、实验原理与实验步骤1. 实验原理数字加法器是一种较为常用的逻辑运算器件,被广泛用于计算机、通信和多媒体数字集成电路中。
广义的加法器包括加法器和减法器,在实际系统中加法器输入通常采用补码形式。
此次实验仅考虑加法运算,分别完成4位的串行进位加法器设计和4位的并行进位加法器设计。
(1) 1 bit全加器最简单的一位全加器的结构,设定两个二进制数字Ai ,Bi和一个进位输入C i 相加,产生一个和输出Si,以及一个进位输出Ci+1。
Si= Ai⊕Bi⊕CiCi+1= AiBi+BiCi+CiAi= AiBi+﹙Ai⊕Bi﹚Ci(2) 4位串行进位加法器n位串行进位全加器原理示意图(3) 4位并行进位加法器超前进位加法器是一种高速加法器,每级进位由附加的组合电路产生,高位的运算不需等待低位运算完成,因此可以提高运算速度。
各级进位信号表达式的推导过程Ci+1 = AiBi+(Ai⊕Bi)Ci设: Gi = AiBiPi= Ai⊕Bi则有: Si = Pi⊕CiCi+1= Gi+PiCi4位并行进位的逻辑表达式为: CC 1= G+PCC 2= G1+P1C1= G1+ P1(G+PC)= G1+ GP1+PP1CC 3= G2+P2C2= G2+ P2(G1+GP1+PP1C)= G2+ G1P2+GP1P2+PP1P2CC 4= G3+P3C3=G3+ P3(G2+…+PP1P2C)= G3+G2P3+G1P2P3+GP1P2P3+PP1P2P3C2. 实验步骤(1)用连续赋值语句实现4位串行进位的全加器,并完成modelsim下的功能仿真。
verilog八位十进制计数器实验报告[附源代码]
![verilog八位十进制计数器实验报告[附源代码]](https://img.taocdn.com/s3/m/00632cfe195f312b3169a5ad.png)
8位10进制计数器实验报告一、实验目的●学习时序逻辑电路●学会用verilog语言设计时序逻辑电路●掌握计数器的电路结构●掌握数码管动态扫描显示原理二、实验内容实现一个8bit十进制(BCD码)计数器端口设置:用拨动开关实现复位和使能LED灯来表示8位数据用数码管显示16进制的八位数据1.复位时计数值为8‘h02.复位后,计数器实现累加操作,步长为1,逢9进1,,计数值达到8‘h99后,从0开始继续计数3.使能信号为1时正常计数,为0时暂停计数,为1时可继续计数。
4.每0.5s计数值加15.8位的结果显示在LED灯上,其中LED灯亮表示对应的位为1,LED灯灭表示对应的灯为06.用isim进行仿真,用forever语句模拟时钟信号输入,并给变量赋值仿真initial语句。
7.用7段数码管的后两位显示16进制下8位结果。
三、实验结果烧写结果:拨动reset开关到1时,LED灯显示10010000,7段数码管显示“90”。
之后拨动WE开关呢,开始计数,LED开始变化并且7段数码管开始计数。
从99后到达00,LED重新开始从00000000开始亮,且数码管重新从00开始计数。
之后拨动WE开关,暂停计数,LED暂停亮灭,七段数码管暂停变化,WE拨回1,继续计数。
拨动复位信号时,无视WE信号,直接复位。
仿真结果:当输入reset信号时波形变化如下当达到一个扫描信号的周期时的波形如下当达到一个以上计数信号的周期时的波形实验分析:实验总体结构和模块间关系如图所示:(其中还需要补上使能信号)实验原理:由于要求实现数码管和LED灯的显示,先考虑LED灯,可以直接由8位输出信号控制,而数码管需要同时显示两个不同的数字,需要时分复用,即快速的交替显示十位和个位,利用人眼的视觉暂留来达到同时显示。
这样就需要两种不同的频率信号。
一种是每0.5s一次,作为计数信号,用脉冲生成器生成,另一种是1ms一次的扫描信号,用降频器生成,将计数信号输入计数器来计数,并将计数的值和扫描信号同时输入扫描显示模块。
FPGA实验二:基于HDL的十进制计数器
![FPGA实验二:基于HDL的十进制计数器](https://img.taocdn.com/s3/m/351014573b3567ec102d8a63.png)
《FPGA》课程报告设计题目:基于HDL的十进制计数器学生班级:学生学号:学生姓名:指导教师:时间:成绩:一、实验目的:1.掌握基于语言的ISE设计全流程;2.熟悉、应用VerilogHDL描述数字电路;3.掌握基于Verilog的组合和时序逻辑电路的设计方法。
二、实验原理:本次实验是使用Verilog HDL进行编写十进制计数器与显示器代码而进行的实验,实验原理图如下:本次实验的内容包括十进制计数器模块,七段译码显示器模块,以及消抖模块。
十进制计数器:对输入时钟进行计数输入:CLK -------待计数的时钟CLR ---------异步清零信号,当CLR =1,输出复位为0,当CLR =0,正常计数ENA---------使能控制信号,当ENA=1,电路正常累加计数,否则电路不工作输出:SUM[3:0]---------- 计数值的个位。
即,在CLK上升沿检测到SUM=9时,SUM将被置0,开始新一轮的计数。
COUT ------------计数值的十位进位,即:只有在时钟CLK上升沿检测到SUM=9时,COUT将被置1,其余情况下COUT=0;LED显示驱动模块:输入:sum[3:0] -------待显示的数值out[6:0] ----------驱动数码管的七位数值七段数码管的字符显示真值表如下:消抖模块:三、实验过程:1.首先建立一个新的工程,添加一个新的Verilog Module,在其中编写十进制计数模块的代码,如下:module liao1(CLR,CLK,ENA,SUM,COUT);input CLR,CLK,ENA;output[3:0] SUM;output COUT;reg[3:0] SUM;reg COUT;always@(posedge CLK or posedge CLR)if(CLR)beginSUM<=4'b0000;COUT<=1'b0;endelseif(ENA)beginif(SUM==9)beginSUM<=4'b0000;COUT<=1'b1;endelsebeginSUM<=SUM+1'b1;COUT<=1'b0;endendendmodule然后执行综合,确认无误后,新建一个Test Bench WaveForm文件,进行仿真,仿真图如下:2.再新建一个Verilog Module,在其中编写七段数码显示模块的代码,如下:module liao2(SUM,out);input[3:0] SUM;output[6:0] out;reg [6:0] out;always @(SUM)begincase(SUM)4'b0000: out<=7'b0000001;4'b0001: out<=7'b1001111;4'b0010: out<=7'b0010010;4'b0011: out<=7'b0000110;4'b0100: out<=7'b1001100;4'b0101: out<=7'b0100100;4'b0110: out<=7'b0100000;4'b0111: out<=7'b0001111;4'b1000: out<=7'b0000000;4'b1001: out<=7'b0000100;default :out<=7'b0000001;endcaseendendmodule执行综合,确认无误后新建一个Test Bench WaveForm文件,进行仿真,仿真图如下:3.添加消抖模块,然后再新建一个Verilog Module,编写例化文件,制成顶层文件,其例化文件代码如下:module liao(CLK_50M,CLK,CLR,ENA,COUT,out);input CLR,CLK,ENA;input CLK_50M;output[6:0] out;output COUT;wire[3:0] SUM;debounce_module u1(CLK_50M,CLR,CLK,clk_out);liao1 u2(CLR,clk_out,ENA,SUM,COUT);liao2 u3(SUM,out);endmodule保存之后形成顶层文件:4.执行综合,确认无误后,根据实验指导书进行锁引脚操作:锁引脚完成后,修改、编辑约束文件:5.生成下载配置文件,下载到开发板进行经行验证。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
十进制加减法计数器
1.实验要求
(1)在Modelsim环境中编写十进制加减法计数器程序;
(2)编译无误后编写配套的测试程序;
(3)仿真后添加信号,观察输出结果。
2.设计程序如下
module decade_counter
#(parameter SIZE=4)
(input clock,load_n,clear_n,updown,
input [SIZE-1:0]load_data,
output reg [SIZE-1:0]q
);
always
@(negedge load_n,negedge clear_n,posedge clock)
if (!load_n)
q<=load_data;
else if (!clear_n)
q<=0;
else //clock
if(updown)
q<=(q+1)%10;
else
begin
if(q==0)
q<=9;
else
q<=q-1;
end
endmodule
3.测试程序如下
`timescale 1ns/1ns
module test_decade_counte;
reg clock,load_n,clear_n,updown;
reg [3:0]load_data;
wire [3:0]q;
decade_counter T1(clock,load_n,clear_n,updown,load_data,q);
initial
begin
clock=0;clear_n=0;
#30 clear_n=1;load_n=0;load_data=7;
#30 load_n=1;updown=0;
#300 updown=1;
#300 updown=0;
#300 updown=1;
#300 $stop;
end
always
#10 clock=~clock;
always
@(q)
$display("At time%t,q=%d",$time,q);
endmodule
4.波形如下
5.测试结果如下
# At time 0,q= 0
# At time 30,q= 7
# At time 70,q= 6
# At time 90,q= 5
# At time 110,q= 4
# At time 130,q= 3
# At time 150,q= 2
# At time 170,q= 1
# At time 190,q= 0
# At time 210,q= 9
# At time 230,q= 8
# At time 250,q= 7
# At time 270,q= 6
# At time 290,q= 5
# At time 310,q= 4
# At time 330,q= 3
# At time 370,q= 3 # At time 390,q= 4 # At time 410,q= 5 # At time 430,q= 6 # At time 450,q= 7 # At time 470,q= 8 # At time 490,q= 9 # At time 510,q= 0 # At time 530,q= 1 # At time 550,q= 2 # At time 570,q= 3 # At time 590,q= 4 # At time 610,q= 5 # At time 630,q= 6 # At time 650,q= 7 # At time 670,q= 6 # At time 690,q= 5 # At time 710,q= 4 # At time 730,q= 3 # At time 750,q= 2 # At time 770,q= 1 # At time 790,q= 0 # At time 810,q= 9 # At time 830,q= 8 # At time 850,q= 7 # At time 870,q= 6 # At time 890,q= 5 # At time 910,q= 4 # At time 930,q= 3 # At time 950,q= 2 # At time 970,q= 3 # At time 990,q= 4 # At time 1010,q= 5 # At time 1030,q= 6 # At time 1050,q= 7 # At time 1070,q= 8 # At time 1090,q= 9 # At time 1110,q= 0 # At time 1130,q= 1 # At time 1150,q= 2 # At time 1170,q= 3 # At time 1190,q= 4 # At time 1210,q= 5
# At time 1250,q= 7。