← 数字IC设计经典笔试题

推荐答案 测试一下

用VERILOG或VHDL写一段代码,实现10进制计数器。(未知)

编程题 中等 笔试真题

参考答案

以下是用Verilog实现的10进制计数器(模10计数器)。采用同步复位,每次时钟上升沿判断复位信号;若复位有效则计数器归0,否则当计数到9时下一周期归0,否则加1。输出为4位二进制数,取值范围0-9。 ```verilog module counter10 ( input clk, input rst_n, output reg [3:0] count ); always @(posedge clk) begin if (!rst_n) count <= 4'b0; else if (count == 4'd9) count <= 4'b0; else count <= count + 1'b1; end endmodule ``` 解析: - 复位信号rst_n低电平有效,异步或同步均可,本代码采用同步复位(if (!rst_n)在always内)。实际工程中推荐同步复位以避免亚稳态,但也可用异步复位(敏感列表加入negedge rst_n)。 - 计数范围0-9,模10。判断条件count == 4'd9,注意比较用十进制格式9,加法用1位二进制加。 - 输出寄存器reg [3:0] count,最高位不会用到(最大9=1001),但宽度4位足够。 - 可增加使能信号en实现受控计数,但题目未要求。 若需VHDL实现,可用类似结构: ```vhdl library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity counter10 is Port ( clk : in STD_LOGIC; rst_n : in STD_LOGIC; count : out STD_LOGIC_VECTOR (3 downto 0)); end counter10; architecture Behavioral of counter10 is signal cnt : STD_LOGIC_VECTOR (3 downto 0) := (others => '0'); begin process(clk) begin if rising_edge(clk) then if rst_n = '0' then cnt <= (others => '0'); elsif cnt = "1001" then cnt <= (others => '0'); else cnt <= cnt + 1; end if; end if; end process; count <= cnt; end Behavioral; ```

涉及知识点

  • VERILOG
  • Verilog
  • 复位
  • 时钟
  • verilog
← 上一题
登录后反馈错题
下一题 →