2023.5.12
编写一个十六进制计数器模块,计数器输出信号递增每次到达0,给出指示信号zero,当置位信号set 有效时,将当前输出置为输入的数值set_num。
注意:这里zero=1和num=0是同一拍输出的,按道理如果根据num=0,然后去输出zero=1应该延迟一拍。所以这里考虑将number延迟一拍输出,就能和zero=1变化同步了。
module count_module(input clk,input rst_n,input set,input [3:0] set_num,output reg [3:0]number,output reg zero);reg [3:0] cnt;always@(posedge clk or negedge rst_n)beginif(!rst_n)cnt<=0;else if(set)cnt<=set_num;elsecnt<=(cnt==15)?0:cnt+1;endalways@(posedge clk or negedge rst_n)beginif(!rst_n)zero<=0;elsezero<=(cnt==0)?1:0;endalways@(posedge clk or negedge rst_n)beginif(!rst_n)number<=0;elsenumber<=cnt;end endmodule
1234567891011121314151617181920212223242526272829303132一个十进制计数器模块,当mode信号为1,计数器输出信号递增,当mode信号为0,计数器输出信号递减。每次到达0,给出指示信号zero。
module count_module(input clk,input rst_n,input mode,output reg [3:0]number,output reg zero); reg[3:0] number1; always@(posedge clk or negedge rst_n)begin if(!rst_n)begin number1<=0; end else if(mode)number1<=(number==9) ? 0 : number1+1; else if(~mode) number1<=(number==0) ? 9 : number1-1; else number1<=number1; end always@(posedge clk or negedge rst_n)begin if(!rst_n) number<=0; else number<=number1; end always@(posedge clk or negedge rst_n)begin if(!rst_n) zero<=0; else if(number1==0) zero<=1; else zero<=0; end endmodule
123456789101112131415161718192021222324252627282930313233343536370001-0010-0100-1000-0001
独热码,相邻两位之间会有两位不相同
优点:
状态译码简单,设计简单,修改灵活缺点:
有许多无限状态reg [3:0] count; always@(posedge clk or negedge rst_n)beginif(!rst_n)count <= 4‘b0001; //注意复位状态elsecount <= {count[2:0], count[3]}; //向左依次循环 end 1234567
这种电路的问题在于自锁,无法自启动。
对输出端进行反馈到输入,把Q2、Q1、Q0或非接到D0端,这样就能自启动了。
状态转移图如下所示。
1000-1100-1110-1111-0111-0011-0001-0000-1000
相邻两个数之间只有1bit位不同,比较可靠,不存在竞争冒险
reg [3:0] count; always@(posedge clk or negedge rst_n)beginif(!rst_n)count <= 0;elsecount <= {~count[0], count[3:1]}; //这里是往右循环的计数 end 1234567
分为三个部分:格雷码转二进制、二进制加法、二进制转格雷码。
module gray_counter( input clk, input rst_n, output reg [3:0] gray_out );reg [3:0] bin;wire [3:0] gray_r;reg [3:0] bin_add;always@(posedge clk or negedge rst_n)begin if(!rst_n) bin<=0; else begin bin[3]=gray_r[3]; bin[2]=gray_r[2]^bin[3]; bin[1]=gray_r[1]^bin[2]; bin[0]=gray_r[0]^bin[1]; endendalways@(posedge clk or negedge rst_n)begin if(!rst_n) bin_add<=0; else bin_add<=bin+1'b1;endassign gray_r = (bin_add>>1) ^ bin_add;always@(posedge clk or negedge rst_n)begin if(!rst_n) gray_out<=0; else gray_out<=gray_r;end endmodule
1234567891011121314151617181920212223242526272829303132333435363738相关知识
【fpga里Verilog语言的小知识点】
环形多孔节水花盆的制作方法
自动浇水系统设计说明
盆花自动浇水系统的设计.doc
智能花盆自动浇水系统的设计说明书
智能花盆自动浇水系统的设计
FPGA之蜂鸣器播放音乐《花海》
用功能指令改变计数器C0的设定值,当X1、X0=00时设定值为10,当X1、X0
彩灯控制电路设计
实数比较指令示例
网址: verilog手撕代码5——计数器(置位、加减、环形、扭环形、格雷码计数器实现) https://m.huajiangbk.com/newsview893380.html
上一篇: 实验六、移位寄存器逻辑功能和设计 |
下一篇: 数字电路基础 |