首页IT科技刷题神器有哪些(【HDLBits刷题笔记】09 Latches and Flip-Flops)

刷题神器有哪些(【HDLBits刷题笔记】09 Latches and Flip-Flops)

时间2025-05-05 03:53:34分类IT科技浏览5230
导读:Dff 这一节终于开始时序电路了。首先是一个用的最多的D触发器。...

Dff

这一节终于开始时序电路了           。首先是一个用的最多的D触发器                 。

Dff8

8位D触发器           ,写法和上一题是一样的      。

module top_module ( input clk, input [7:0] d, output [7:0] q ); always@(posedge clk) begin q <= d; end endmodule

Dff8r

带同步高电平复位的D触发器         。

module top_module ( input clk, input reset, // Synchronous reset input [7:0] d, output [7:0] q ); always@(posedge clk) begin if(reset) q <= d0; else q <= d; end endmodule

Dff8p

注意这道题触发器是下降沿触发                 。

module top_module ( input clk, input reset, input [7:0] d, output [7:0] q ); always@(negedge clk) begin if(reset) q <= h34; else q <= d; end endmodule

Dff8ar

这道题是异步复位                 ,把areset写在敏感事件列表即可         。

module top_module ( input clk, input areset, // active high asynchronous reset input [7:0] d, output [7:0] q ); always@(posedge clk or posedge areset) begin if(areset) q <= d0; else q <= d; end endmodule

Dff16e

这题多了一个字节使能信号      ,只有对应的字节使能才能写入         ,否则维持当前的值      。

module top_module ( input clk, input resetn, input [1:0] byteena, input [15:0] d, output [15:0] q ); always@(posedge clk) begin if(~resetn) q <= d0; else q <= {byteena[1]?d[15:8]:q[15:8],byteena[0]?d[7:0]:q[7:0]}; end endmodule

Exams/m2014 q4a

这题要求使用一个latch                 ,latch是电平触发的触发器         ,当ena信号为高电平时输入会传递给输出      ,这样的缺点是毛刺(glitch)会逐级传递                 ,所以应尽量避免综合出不必要的latch            ,这一点在前面if和case语句中提到过                 。

提示中告诉了这里应该使用非阻塞赋值   ,因为其仍然是时序电路            。

module top_module ( input d, input ena, output q); always@(*) begin if(ena) q<=d; end endmodule

Exams/m2014 q4b

module top_module ( input clk, input d, input ar, // asynchronous reset output q); always@(posedge clk or posedge ar) begin if(ar) q <= d0; else q <= d; end endmodule

Exams/m2014 q4c

总放些重复的题有点浪费时间   。                 。               。

module top_module ( input clk, input d, input r, // synchronous reset output q); always@(posedge clk) begin if(r) q <= d0; else q <= d; end endmodule

Exams/m2014 q4d

module top_module ( input clk, input in, output out); always@(posedge clk) begin out <= in^out; end endmodule

Mt2015 muxdff

这道题只要写出一个子模块即可。

module top_module ( input clk, input L, input r_in, input q_in, output reg Q); always@(posedge clk) begin Q <= L?r_in:q_in; end endmodule

Exams/2014 q4a

同样也是写一个子模块              。

module top_module ( input clk, input w, R, E, L, output Q ); always@(posedge clk) begin Q <= L?R:(E?w:Q); end endmodule

Exams/ece241 2014 q4

根据RTL视图直接写代码就可以了                  。

module top_module ( input clk, input x, output z ); reg [2:0]Q=3d0; always@(posedge clk) begin Q[0] <= x^Q[0]; Q[1] <= x&~Q[1]; Q[2] <= x|~Q[2]; end assign z=~|Q; endmodule

Exams/ece241 2013 q7

使用verilog实现一个JK触发器   。

module top_module ( input clk, input j, input k, output reg Q); always@(posedge clk) begin case({j,k}) 2b00:Q<=Q; 2b01:Q<=1b0; 2b10:Q<=1b1; 2b11:Q<=~Q; endcase end endmodule

Edgedetect

用了两个always                 ,其实和答案是一样的           。

module top_module ( input clk, input [7:0] in, output reg[7:0] pedge ); reg [7:0] in_r; always@(posedge clk) begin in_r <= in; end always@(posedge clk) pedge <= in&~in_r; endmodule

Edgedetect2

和上一题思路是一样的               ,区别是逻辑改为异或                 。

module top_module ( input clk, input [7:0] in, output reg[7:0] anyedge ); reg [7:0] in_r; always@(posedge clk) begin in_r <= in; anyedge <= in_r^in; end endmodule

Edgecapture

capture和detect区别:capture会保持1,直到reset      。

out <= (~in&in_r)|out;代表只有1会传递到out              ,从而达到保持的作用         。

module top_module ( input clk, input reset, input [31:0] in, output reg[31:0] out ); reg [31:0] in_r; always@(posedge clk) begin in_r <= in; if(reset) out <= d0; else if(~in&in_r) out <= (~in&in_r)|out; end endmodule

Dualedge

要求写一个双边沿触发器                  ,题目已经告诉了@(posedge clk or negedge clk)的写法是不被允许的                 。

这题确实没想到好的方法   ,我的写法可能会产生毛刺           ,因为在边沿的时候q_p和q_n需要时间跳变                 ,这个时候输出就可能有问题      ,当然         ,这样仿真还是能通过的                 ,但实际电路中不能这样写         。

题目给的答案非常巧妙         ,上升沿时p变为d^n      ,所以输出q = (p^n) = (d^n^n) = d                 ,下降沿同理      。

我的答案:

module top_module ( input clk, input d, output q ); reg q_p,q_n; always@(posedge clk) q_p <= d; always@(negedge clk) q_n <= d; assign q = clk?q_p:q_n; endmodule

标准答案:

module top_module( input clk, input d, output q); reg p, n; // A positive-edge triggered flip-flop always @(posedge clk) p <= d ^ n; // A negative-edge triggered flip-flop always @(negedge clk) n <= d ^ p; // Why does this work? // After posedge clk, p changes to d^n. Thus q = (p^n) = (d^n^n) = d. // After negedge clk, n changes to d^p. Thus q = (p^n) = (p^d^p) = d. // At each (positive or negative) clock edge, p and n FFs alternately // load a value that will cancel out the other and cause the new value of d to remain. assign q = p ^ n; // Cant synthesize this. /*always @(posedge clk, negedge clk) begin q <= d; end*/ endmodule
声明:本站所有文章            ,如无特殊说明或标注   ,均为本站原创发布                 。任何个人或组织                 ,在未征得本站同意时               ,禁止复制            、盗用                 、采集     、发布本站内容到任何网站         、书籍等各类媒体平台            。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理   。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
各大游戏论坛网站(什么论坛网站赚钱-重大新闻!nbe游戏工作室论坛已经改名为“nbe游赚网”)