HDLBits训练5

devtools/2024/12/26 1:28:42/

时间:2024.12.24

Count15

代码

module top_module (input clk,input reset,      // Synchronous active-high resetoutput [3:0] q);always@(posedge clk)beginif(reset) q<=4'b0;else if(q==4'b1111)q<=4'b0000;else q<=q+4'b0001;end
endmodule
module top_module (input clk,input reset,      // Synchronous active-high resetoutput [3:0] q);always@(posedge clk)beginq <= reset==1?4'd0:q+1'b1;end
endmodule

运行结果

Shift4

代码

module top_module(input clk,input areset,  // async active-high reset to zeroinput load,input ena,input [3:0] data,output reg [3:0] q); always@(posedge clk or posedge areset)beginif(areset)beginq<=4'd0;end else if(load)beginq<=data;end else if(ena)beginq<=q>>1;end else beginq<=q;endend
endmodule
module top_module(input clk,input areset,  // async active-high reset to zeroinput load,input ena,input [3:0] data,output reg [3:0] q); always@(posedge clk or posedge areset)beginif(areset)q<=4'd0;else if(load)q<=data;else if(ena)q<=q>>1;//else //   q<=q;end
endmodule

运行结果

Always if

代码

// synthesis verilog_input_version verilog_2001
module top_module(input a,input b,input sel_b1,input sel_b2,output wire out_assign,output reg out_always   ); assign out_assign=(sel_b1&sel_b2)?b:a;always@(*)out_always=(sel_b1&sel_b2)?b:a;
endmodule

运行结果

Always case(多路转换器)

 代码

// synthesis verilog_input_version verilog_2001
module top_module ( input [2:0] sel, input [3:0] data0,input [3:0] data1,input [3:0] data2,input [3:0] data3,input [3:0] data4,input [3:0] data5,output reg [3:0] out   );//always@(*) begin  // This is a combinational circuitcase(sel)3'd0:out=data0;3'd1:out=data1;3'd2:out=data2;3'd3:out=data3;3'd4:out=data4;3'd5:out=data5;default:out=4'b0000;endcaseendendmodule

 

运行结果

Always case2(优先级编码器)

 代码

// synthesis verilog_input_version verilog_2001
module top_module (input [3:0] in,output reg [1:0] pos  );always@(*)beginif(in[0]==1)pos = 2'd0;else if(in[1]==1)pos = 2'd1;else if(in[2]==1)pos = 2'd2;else if(in[3]==1)pos = 2'd3;elsepos = 2'd0;end
endmodule

运行结果

Count10

代码

module top_module (input clk,input reset,        // Synchronous active-high resetoutput [3:0] q);always@(posedge clk)beginif(reset) q<=4'd0;else beginif(q==4'd9) q<=4'd0;else q<=q+4'd1;endend
endmodule
module top_module (input clk,input reset,        // Synchronous active-high resetoutput [3:0] q);/*//方法一:三目运算符always@(posedge clk)beginq <= reset==1||q==4'd9 ? 4'd0 : q+1'b1;end*///方法二:if-else结构always@(posedge clk)beginif(reset)beginq <= 4'd0;end else beginif(q==4'd9)beginq <= 4'd0;end else beginq <= q + 1'b1;endendend
endmodule

运行结果

 

Count1to10

 

代码

module top_module (input clk,input reset,output [3:0] q);always@(posedge clk)beginif(reset) q<=4'd1;else beginif(q==4'd10) q<=4'd1;else q<=q+4'd1;endend
endmodule
module top_module (input clk,input reset,output [3:0] q);always@(posedge clk)beginq<=reset==1||q==10?4'd1:q+1'b1;end
endmodule

 

运行结果

Countslow

代码(可以用条件语句的嵌套)

module top_module (input clk,input slowena,input reset,output [3:0] q);always@(posedge clk)beginif(reset)beginq<=4'd0;end else beginif(slowena && q==9)beginq<=4'd0;end else if(slowena) beginq<=q+1'b1;end else beginq<=q;endendend
endmodule
module top_module (input clk,input slowena,input reset,output [3:0] q);always@(posedge clk)beginif(reset)q<=4'd0;else beginif(slowena )beginif(q==4'd9)beginq<=4'd0;end else  q<=q+1'b1;end   else  q<=q;endend
endmodule

 

运行结果

 

Exams/ece241 2014 q7a

 

代码

module top_module (input clk,input reset,input enable,output [3:0] Q,output c_enable,output c_load,output [3:0] c_d
);always@(*)beginif(reset)beginc_d<=4'd1;c_load<=1'b1;end else beginif(enable && Q==4'd12)beginc_d<=4'd1;c_load<=1'b1;end else beginc_d<=c_d; //此种写法有latch警告//c_d<=1'b0; //也可赋0c_load<=1'b0;endendendassign c_enable=enable;count4 count4_inst (.clk(clk),.enable(c_enable),.load(c_load),.d(c_d),.Q(Q));
endmodule

运行结果

 

Countbcd

错误代码

module top_module (input clk,input reset,   // Synchronous active-high resetoutput [3:1] ena,output [15:0] q);always@(posedge clk)beginena[1]<=1'b0;if(reset)beginq<=16'h0;endelse if(q[3:0]==4'd9) beginq[3:0]<=4'd0;ena[1]<=1'b1;endelse  beginq[3:0]<=q[3:0]+4'd1;endif(ena[1]==1)  q[7:4]<=q[7:4]+4'd1;else q[7:4]<=q[7:4];end
endmodule

错误分析

  1. 计数逻辑不完整
    • 原代码只处理了个位(q[3:0])和十位(q[7:4])部分的计数逻辑,没有对百位(q[11:8])以及千位(q[15:12])进行相应的处理,无法实现完整的 4 位 BCD 计数器功能,不符合题目要求的能从 0 计数到 9999 的需求。
    • 对于十位的计数逻辑虽然在ena[1]为 1 时进行了加 1 操作,但没有考虑十位计数满 9 后要清零以及向更高位进位等情况,同样百位和千位的相关逻辑缺失。
  2. 复位逻辑局限性
    • 原代码中reset信号只对整个计数器的初始值进行了简单的清零操作(将q赋值为16'h0),但在后续的计数过程中,没有针对复位情况对各个数位的计数状态进行完整的重置,例如当在计数过程中出现复位信号,所有数位都应该立即清零,而不仅仅是初始化那一次起作用。
  3. 组合逻辑使用不当(可能产生锁存器)
    • 在代码中对于ena[1]以及q[7:4]等的赋值逻辑存在一些问题,像else q[7:4]<=q[7:4]; 这样的语句其实是不必要的,并且在always块内这种不完全赋值的情况(不是在所有分支都对q[7:4]等信号进行明确赋值),可能会导致综合出锁存器,而不是期望的纯组合逻辑或者时序逻辑行为,这不符合良好的代码规范和设计意图。

 

运行结果

 

正确代码

module top_module (input clk,input reset,output [3:1] ena,output [15:0] q
);// 定义4个一位的BCD计数器reg [3:0] bcd0;reg [3:0] bcd1;reg [3:0] bcd2;reg [3:0] bcd3;// 个位计数器always @(posedge clk) beginif (reset)bcd0 <= 4'b0000;else if (bcd0 == 4'b1001)bcd0 <= 4'b0000;elsebcd0 <= bcd0 + 1;end// 十位计数器,当个位从9变为0时,十位加1always @(posedge clk) beginif (reset)bcd1 <= 4'b0000;else if (bcd0 == 4'b1001) beginif (bcd1 == 4'b1001)bcd1 <= 4'b0000;elsebcd1 <= bcd1 + 1;endend// 百位计数器,当十位从9变为0时,百位加1always @(posedge clk) beginif (reset)bcd2 <= 4'b0000;else if (bcd1 == 4'b1001 && bcd0 == 4'b1001) beginif (bcd2 == 4'b1001)bcd2 <= 4'b0000;elsebcd2 <= bcd2 + 1;endend// 千位计数器,当百位从9变为0时,千位加1always @(posedge clk) beginif (reset)bcd3 <= 4'b0000;else if (bcd2 == 4'b1001 && bcd1 == 4'b1001 && bcd0 == 4'b1001) beginif (bcd3 == 4'b1001)bcd3 <= 4'b0000;elsebcd3 <= bcd3 + 1;endend// 连接输出assign q[3:0] = bcd0;assign q[7:4] = bcd1;assign q[11:8] = bcd2;assign q[15:12] = bcd3;// 产生ena信号assign ena[1] = (bcd0 == 4'b1001);assign ena[2] = (bcd1 == 4'b1001) && (bcd0 == 4'b1001);assign ena[3] = (bcd2 == 4'b1001) && (bcd1 == 4'b1001) && (bcd0 == 4'b1001);endmodule

这段代码实现了一个 4 - 位 BCD 计数器。每个十进制数位由 4 位二进制数表示。代码中定义了 4 个一位的 BCD 计数器(bcd0bcd1bcd2bcd3)分别代表个位、十位、百位和千位。

  1. 个位计数器(bcd0:在每个时钟上升沿,如果reset信号为高电平,计数器清零;如果计数器达到 9(4'b1001),则在下一个时钟上升沿清零,否则计数器加 1。

  2. 十位计数器(bcd1:在每个时钟上升沿,如果reset信号为高电平,计数器清零;当个位计数器从 9 变为 0 时,十位计数器加 1;如果十位计数器达到 9,则在下一个时钟上升沿清零,否则计数器加 1。

  3. 百位计数器(bcd2:在每个时钟上升沿,如果reset信号为高电平,计数器清零;当十位和个位计数器都从 9 变为 0 时,百位计数器加 1;如果百位计数器达到 9,则在下一个时钟上升沿清零,否则计数器加 1。

  4. 千位计数器(bcd3:在每个时钟上升沿,如果reset信号为高电平,计数器清零;当百位、十位和个位计数器都从 9 变为 0 时,千位计数器加 1;如果千位计数器达到 9,则在下一个时钟上升沿清零,否则计数器加 1。

  5. 输出连接(assign:将各个 BCD 计数器的值连接到 16 位输出q上。

  6. ena信号产生ena信号用于指示何时高位计数器应该加 1。ena[1]在个位计数器达到 9 时为高电平,ena[2]在十位和个位计数器都达到 9 时为高电平,ena[3]在百位、十位和个位计数器都达到 9 时为高电平。

 

运行结果

 


http://www.ppmy.cn/devtools/145408.html

相关文章

重温设计模式--单例模式

文章目录 单例模式&#xff08;Singleton Pattern&#xff09;概述单例模式的实现方式及代码示例1. 饿汉式单例&#xff08;在程序启动时就创建实例&#xff09;2. 懒汉式单例&#xff08;在第一次使用时才创建实例&#xff09; 单例模式的注意事项应用场景 C代码懒汉模式-经典…

Nginx整合Lua脚本

Nginx-Lua Nginx整合Lua脚本 Lua环境搭建 下载地址 linux环境下 yum install lua安装后验证 lua -vLua脚本执行 lua xxx.luaNginx整合Lua nginx需要添加lua模块 嵌入内容 示例如下 修改nginx.conf如下 location /lua {default_type text/plain;content_by_lua ngx.sa…

如何使用C/C++语言编写GPIB协议控制程序呢?

使用C/C语言编写GPIB&#xff08;General Purpose Interface Bus&#xff0c;通用接口总线&#xff09;协议控制程序通常涉及与GPIB硬件接口的交互。以下是一个使用C/C编写GPIB控制程序的基本步骤和示例代码&#xff0c;但请注意&#xff0c;具体的实现细节可能会因你使用的GPI…

java反射详讲

好的&#xff01;以下是关于 Java 反射的详细讲解&#xff08;约5000字左右&#xff09;。内容包括基础概念、反射的优缺点、基本用法&#xff0c;以及典型案例。 Java 反射详解 反射是 Java 中的一项强大机制&#xff0c;允许程序在运行时动态获取类的相关信息&#xff0c;并…

vue3入门教程:reactive函数

基本用法 引入 reactive 首先&#xff0c;你需要从 vue 包中引入 reactive 函数&#xff1a; import { reactive } from vue;创建一个响应式对象 使用 reactive 函数来创建一个响应式对象&#xff1a; const state reactive({count: 0,name: Vue 3 });在这个例子中&#xff0c…

CSS @property 颜色过渡动画实例

CSS property 颜色过渡动画实例 基础知识 property 语法回顾 property --custom-color {syntax: <color>;inherits: false;initial-value: #ff0000; }颜色表示方式 在使用 property 进行颜色动画时&#xff0c;我们可以使用以下颜色格式&#xff1a; HEX: #RRGGBBRG…

Centos下的OpenSSH服务器和客户端

目录 1、在 IP地址为192.168.98.11的Linux主机上安装OpenSSH服务器&#xff1b; 2、激活OpenSSH服务&#xff0c;并设置开机启动&#xff1b; 3、在IP地址为192.168.98.33的Linux主机上安装OpenSSH客户端&#xff0c;使用客户端命令&#xff08;ssh、scp、sftp&#xff09;访…

负载均衡-lvs

负载均衡集群 1、集群是什么&#xff1f; 1 集群&#xff08;cluster&#xff09;技术是一种较新的技术&#xff0c;通过集群技术&#xff0c;可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益&#xff0c;其任务调度则是集群系统中的核心技术。 …