学习目标:
计数器反转10次,实现led点亮。
预备知识:
–
CLR是清零端,进行十次计数0000 0001 0010 0011…,使得led点亮
信号放大作用
万能模块,理解为非…等门。
学习内容:
在这里插入代码片
—
在这里插入代码片module count_module#(
parameter P_CNT_WIDTH = 4 //顶端参数可以修改
)(
input i_clk , //时钟
input i_rst , //清零
input i_en , //使能端
output [P_CNT_WIDTH - 1 : 0] o_cnt , //计数的大小 目的是技术到10
output o_led //让led反转
);
reg [P_CNT_WIDTH - 1 : 0] ro_cnt; //这里使用寄存器变量,目的要用D触发器实现161芯片
reg ro_led; //同上
assign o_cnt = ro_cnt; //组合逻辑赋值的形式
assign o_led = ro_led; //组合逻辑赋值的形式
always@(posedge i_clk , posedge i_rst) //这里是上升沿触发分别是时钟和清零
begin
if(i_rst) begin
ro_cnt <= 'd0;//d-十进制 h-八进制 b-二进制 大位宽赋值为小位宽是允许的(自动截低位),小位宽赋值给大位宽不允许(不会自动补位),/进行清零
end else begin
ro_cnt <= ro_cnt + 1;//计数器是怎么实现的
end
end
//上述实现计数 下面实现led反转
always@(posedge i_clk,posedge i_rst)
begin
if(i_rst) begin//上电复位初值,默认led是灭。
ro_led <= 'd0;
end else if(ro_cnt == 'd10) begin
ro_led <= 'd1; //计数为10,进行反转
end else begin
ro_led <= 'd0; //其他情况都为0
end
end
难点:
(1 计数10是怎么实现的
0000 0001 0010 0011 0100 0101 0110 0111
最低位一直在反转
输出Q原来是0,每次取非,来实现反转
(2 再理解第二位 先观察00 01 10 11 发现是异或(不同为1,相同为0),下图第一个D触发器的输出和第二个D触发器的输出连接经过异或门,也就是为什么称为万能模块。