基于SparkRoad的《Verilog数字系统设计教程·第三版(夏宇闻)》学习(14)——第13章
学习:
- 给状态机 case 语句补上 default,并将状态变量设为'bx,这就等于告知综合器:case 语句以及指定了所有的状态——P 177
- 目前大多数综合器往往不支持在一个 always 模块中由多个事件触发的状态机(即隐含状态机)
一文掌握马尔科夫链与隐马尔可夫模型 - 知乎 (zhihu.com)(是没有想到,状态机能和马尔科夫链相结合,《深度学习》那本书要推进了)
为了能综合出有效的电路,由 Verilog HDL 描述的状态机应明确地由唯一时钟触发。如果非要使用不同时钟触发的模块,可以使用几个 always,并在每一个 always 中赋予的时钟信号不同切有一定的关联性 - 状态必须明确赋值,通常使用参数(parameters)或宏定义(define)语句加上赋值语句来实现
- 异步置位与复位——P 189
- 三种比较常见的控制实例:异步、高电平有效、低电平有效、复位、置位——P 190
同步置位与复位是指只有在时钟的有效跳变沿时刻置位或复位,不需要把 reset 和 set 放入 always 的敏感列表中 - 沿关键词包括 posedge(用于高电平有效的 set、reset 或上升沿触发的时钟)和 negedge(用于低电平有效的 set、reset 或上升沿触发的时钟,比如说@(posedege clk or posedge set))
- 异步的说明方式
@(<沿关键词时钟信号
Or 沿关键词 复位信号
Or 沿关键词 置位信号>)
- 三种比较常见的控制实例:异步、高电平有效、低电平有效、复位、置位——P 190
- 预编译处理——P 182 例 13.2
宏定义 (33条消息) 21,verilog之宏define介绍_verilog 宏定义-CSDN博客
预编译处理更多用于代码块,宏定义处理更多用于某个全局参数
另外,见书 P 182 例 13.2,定义了`plus
,即指符合`plus
时就可以使用 case,`plus
具体的值可以在宏定义中方便更改 [[基于SparkRoad的《Verilog数字系统设计教程·第三版(夏宇闻)》学习(8)——第7章]]
但是要注意此处的 begin 后不用加;
块中定义了局部变量,所以这类 begin-end 要声明模块名例子见 P 184、P 182 - Task 的使用——P 182 例 13.3
任务的定义和调用——P 83 [[基于SparkRoad的《Verilog数字系统设计教程·第三版(夏宇闻)》学习(7)——第6章]]
此处的 task 定义后要加; - 3-8 译码器设计实例——P 183 例 13.5
这个题的 LED 是 0 为高电平,另外采用了书上的写法,避免了如此的 case 语句臃肿module cy4( input ext_clk_25m, //外部输入 25MHz 时钟信号 input ext_rst_n, //外部输入复位信号,低电平有效 input [3:0] switch, //4 个拨码开关接口,ON -- 低电平;OFF -- 高电平 output reg[7:0] led //8 个 LED 指示灯接口 ); Always @ (posedge ext_clk_25 m or negedge ext_rst_n) If (! Ext_rst_n) led <= 8'hff; //所有 LED 关闭 Else if (switch[0]) led <= 8'hff; //SW 3 处于 OFF 状态,所有 LED 关闭 Else begin //SW 3 处于 ON 状态,点亮的 LED 位由 SW 4/SW 5/SW 6 拨码开关的输入决定 case (switch[3:1]) 3'b 111: led <= 8'b 1111_1110; //D 2 点亮 3'b 110: led <= 8'b 1111_1101; //D 3 点亮 3'b 101: led <= 8'b 1111_1011; //D 4 点亮 3'b 100: led <= 8'b 1111_0111; //D 5 点亮 3'b 011: led <= 8'b 1110_1111; //D 6 点亮 3'b 010: led <= 8'b 1101_1111; //D 7 点亮 3'b 001: led <= 8'b 1011_1111; //D 8 点亮 3'b 000: led <= 8'b 0111_1111; //D 9 点亮 Default: ; Endcase End Endmodule
- 带置位和复位端的电平敏感型锁存器设计——P 187 例 13.13
module latch2(q,data,clk,set,reset); output q; input data,clk,set,reset; assign q=reset?0:(set?1:(clk?data:q)); endmodule
思考题:
- 是不是只要符合 Verilog 语法仿真行为正确的模块都可以综合成电路结构?
不是,异步状态机不能够综合成电路结构。 - 为什么在用 Verilog 设计方法时不采用异步的状态机,采用异步状态机有什么问题不好解决?
因为大多数综合器不能综合采用Verilog HDL描述的异步状态机转换为电路网表。异步状态机是没有确定时间的状态机,它的状态转移不是由唯一的时钟跳变沿所触发,采用异步状态机不容易判别触发脉冲是正常的触发还是冒险竞争产生的毛刺。 - 用 always 块语句如何编写纯组合逻辑电路?在哪些情况下会生成不想要的锁存器?
用always块设计纯组合逻辑电路时,在生成组合逻辑的always块中参与赋值的所有信号都必须有明确地值,然后只要在 always块中进行赋值就可以了。如果在赋值表达式右端引用了敏感电平列表中没有列出的信号,那么在综合时将会为该没有列出的信号隐含的产生一个透明锁存器。 - 请用清晰的语句把标准的可综合的带同步复位端的同步状态机的样板模块表达出来。
Always @ (posedge clk)
Begin
If (reset)
Begin
/置输出为 0/
End
Else
Begin
/与时钟同步的逻辑/
End
End - 请用清晰的语句把标准的可综合的带异步复位端的同步状态机的样板模块表达出来。
Always @ (posedge clk or posedge reset)
Begin
If (reset)
Begin
/置输出为 0/
End
Else
Begin
/与时钟同步的逻辑/
End
End - 这两种不同的同步状态机有什么不同?如果输入的复位脉冲很窄,哪种状态机不能可靠复位?
异步复位端的同步状态机的复位与时钟无关。当复位时他们立即置触发器的输出为0,不需要等到时钟沿到来才复位。带同步复位端的同步状态机的复位只有在时钟的有效跳变沿时刻复位,信号才能使触发器复位。如果输入的复位脉冲很窄,同步复位端的同步状态机不能可靠复位。 - 为什么说,掌握数字电路基础和计算机体系结构这两门学科的真谛是 Verilog 数字系统设计的基础?
当系统比较复杂时,需要通过仔细的分析,把一个具体的系统分解为数据流和控制流, 构想哪些部分用组合逻辑,哪些部分的资源可以共享而不影响系统的性能,需要设置哪些开关逻辑来控制数据的流动,需要一个或几个同步有限状态机来正确有序地控制这些开关逻辑,以便有效地利用有限的硬件资源,才能编写出真正有价值的 RTL 级源代码,从而综合出有实用价值的高性能的数字逻辑电路系统。因此,认真的学习并掌握数字电路基础和计算机体系结构这两门学科的真谛是 Verilog 数字系统设计的基础。 - 如果一定要设计异步触发的计数电路,用 Verilog 描述有什么办法?能否综合?仿具时安注息什么问题?
编写另一个模块,在那个模块中使用另外一个时钟:然后用实例引用的方法在另一个模块中把它连接起来。能够综合。仿真时应尽量使这两个状态机的时钟有一定的联系。 - 把本章中的例题编写完整。没有编写测试模块的编写相应的测试模块,并在 verilog 仿真环境下运行,以全面验证设计的正确。
- (33条消息) verilog学习|《Verilog数字系统设计教程》夏宇闻 第三版思考题答案(第十三章)_驚蟄_的博客-CSDN博客