独热码状态机、SR锁存器延迟模型、移位除法器模型
用modelsim仿真基本流程:
一、独热码状态机
代码以及测试代码如下:
module ex8_1(clock,reset, x,y1,y2);
input clock,reset;
input x;
output y1,y2;
reg y1,y2;
reg[3:0] cstate, nstate;
parameter
s0=4’b0001,
s1=4’b0010,
s2=4’b0100,
s3=4’b1000;
always @(posedge clock or posedge reset)
begin
if(reset)
cstate<=s0;
else
cstate<=nstate;
end
always @(cstate or x)
begin
case(cstate)
s0 : begin
if(x0)
nstate=s1;
else
nstate=s3;
end
s1:begin
if(x0)
nstate=s2;
else
nstate=s0;
end
s2 : begin
if(x0)
nstate=s3;
else
nstate=s1;
end
s3 :begin
if(x0)
nstate=s0;
else
nstate=s2;
end
default:nstate=s0;
endcase
end
always @(cstate or x)
begin
case(cstate)
s0 : begin
if(x0)
y1=1;
else
y1=0;
end
s1 :begin
if(x0)
y1=0;
else
y1=0;
end
s2 : begin
if(x0)
y1=0;
else
y1=0;
end
s3 : begin
if(x0)
y1=0;
else
y1=1;
end
default:y1=0;
endcase
end
always @(cstate or x)
begin
if(cstates0 &&x0)
y2=1;
else if(cstates3 && x1)
y2=1;
else
y2=0;
end
endmodule
测试代码:
第一个测试代码tb_ex81;
reg x,clock, reset;
wire yl, y2;
initial clock=0;
always #5clock=~clock;
initial
begin
reset=0;
#15 reset=1;
#15 reset=0;
#10000 $stop;
end
initial
begin
#10 x=1;
#500 x=0;
end
ex8_1 myex81(clock, reset,x,yl,y2);
endmodule
1.创建两个测文件,并编写代码。
2.进行编译:
点击compile,编译完成在文件后会有✔提示。
3.点击work,只需编译测试文件,如图:
4.将sim中的测试代码加入到wave:
5.点击run,开始测试
6.测试结果如图:
二:SR锁存器延迟模型
代码以及测试代码如下:
module my_rs(reset,set,q,qbar);
input reset, set;
output q, qbar;
nor #(1) nl(g, reset, gbar);
nor #(1) n2 (qbar, set, a);
endmodule
测试代码:
module tb_71;
reg set, reset;
wire q, qbar;
initial
begin
set<=0;reset<=1;
#10 set<=0;reset<=0;
#10 set<=1;reset<=0;
#10 set<=1;reset<=1;
end
my_rs rsl(reset, set,q,qbar);
initial
monitor(monitor(monitor(time, “set= %b, reset= %b,q= %b,qbar= %b”,set,reset, g, qbar);
endmodule
3.重复上诉步骤
4.结果如图:
三、移位除法器模型
代码及测试代码:
源代码 : module div2(clk, reset, start, A, B, D, R, ok, err);
parameter n = 32;
parameter m = 16;
input clk, reset, start;
input [n-1:0] A, B;
output [n+m-1:0] D;
output [n-1:0] R;
output ok, err;
wire invalid, carry, load, run;
div_ctl UCTL(clk, reset, start, invalid, carry, load, run, err, ok);
div_datapath UDATAPATH(clk, reset, A, B, load, run, invalid, carry, D, R);
endmodule
module div_ctl(clk, reset, start, invalid, carry, load, run, err, ok);
parameter n = 32;
parameter m = 16;
parameter STATE_INIT = 3’b001;
parameter STATE_RUN = 3’b010;
parameter STATE_FINISH = 3’b100;
input clk, reset, start, invalid, carry;
output load, run, err, ok;
reg [2:0] current_state, next_state;
reg [5:0] cnt;
reg load, run, err, ok;
always @(posedge clk or negedge reset)
begin
if(!reset) begin
current_state <= STATE_INIT;
cnt <= 0;
end else begin
current_state <= next_state;
if(run) cnt <= cnt + 1’b1;
end
end
always @(posedge clk or negedge reset)
begin
if(!reset) begin
err <= 0;
end else if(next_state==STATE_RUN) begin
if(invalid) err <= 1;
end
end
always @(current_state or start or invalid or carry or cnt)
begin
load <= 1’b0;
ok <= 1’b0;
run <= 1’b0;
case(current_state)STATE_INIT: beginif(start) next_state <= STATE_RUN;else next_state <= STATE_INIT;load <= 1;endSTATE_RUN : beginrun <= 1;if(invalid) beginnext_state <= STATE_FINISH; end else if(cnt==(n+m-1)) beginnext_state <= STATE_FINISH; end else beginnext_state <= STATE_RUN;endendSTATE_FINISH : beginok <= 1;next_state <= STATE_FINISH; enddefault : beginnext_state <= STATE_INIT; endendcase
end
endmodule
module div_datapath(clk, reset, A, B, load, run, invalid, carry, D, R);
parameter n = 32;
parameter m = 16;
input clk, reset;
input [n-1:0] A, B;
input load, run;
output invalid, carry;
output [n+m-1:0] D;
output [n-1:0] R;
reg [n+n+m-2:0] R0;
reg [n+m-1:0] D;
reg [n-1:0] B0;
reg carry;
wire invalid;
wire [n-1:0] DIFF, R;
wire CO;
assign R = {carry, R0[n+n+m-2:n+m]};
assign invalid = (B0==0);
sub sub(R0[n+n+m-2:n+m-1], B0, 1’b0, DIFF, CO);
always @(posedge clk)
begin
if(load) begin
R0 <= {{(n-1){1’b0}}, A, {m{1’b0}}};
B0 <= B;
carry <= 1’b0;
end
else if(run) begin
if(CO && !carry) begin
R0 <= { R0, 1’b0 };
D <= { D[n+m-2:0], 1’b0 };
carry <= R0[n+n+m-2];
end else begin
R0 <= { DIFF, R0[n+m-2:0], 1’b0 };
D <= { D[n+m-2:0], 1’b1 };
carry <= DIFF[n-1];
end
end
end
endmodule
module sub(A, B, CI, DIFF, CO);
parameter n = 32;
input [n-1:0] A, B;
input CI;
output [n-1:0] DIFF;
output CO;
assign {CO, DIFF} = {1’b0, A} - {1’b0, B} - {{n{1’b0}}, CI};
endmodule
测试代码:
测试代码: `timescale 1ns/10ps
module tb_div2;
parameter n = 32;
parameter m = 16;
reg clk, reset;
reg start;
wire [n+m-1:0] D;
wire [n-1:0] R;
wire err, ok;
integer i;
reg [n-1:0] dividend;
reg [n-1:0] divisor;
reg [n+m-1:0] quotient;
reg [n-1:0] remainder;
div2 UDIV(clk, reset, start, dividend, divisor, D, R, ok, err);
function [n+n+(n+m)+(n)-1:0] gen_rand_data;
input integer i;reg [n+m-1:0] dividend;reg [n+m-1:0] divisor;reg [n+m-1:0] quotient;reg [n+m-1:0] remainder;integer k;integer flag;begink = (i/4) % 32 + 1;flag = 1; while(flag)begindividend = {{$random}, {m{1'b0}}}; divisor = {{m{1'b0}}, {$random}}; divisor = divisor % ( 2 << k); if(divisor == {(n+m){1'b0}})begin$display("Divisor is zero!!!");end else beginflag = 0;endquotient = dividend / divisor;remainder = dividend % divisor; if(remainder > divisor) begin$display("Bad remainder!!!"); $stop;endif(quotient * divisor + remainder != dividend) begin$display("bad values!!!");$stop;endendgen_rand_data = {dividend[n+m-1:m], divisor[n-1:0], quotient, remainder[n-1:0]};end
endfunction
initial
begin
clk=0;
forever
#10 clk=~clk;
end
initial
begin
reset = 0;
start = 0;
for(i=1; i<=1000; i=i+1)
begin
{dividend, divisor, quotient, remainder} = gen_rand_data(i);
@(posedge clk);
reset = 0;
@(posedge clk);
reset = 1;
start = 1;
@(posedge ok);
if(quotient!=D || remainder!=R)
begin
$display(“BAD RESULT!!!”);
$display(“result: quotient=48’d%d, remainder=32’d%d”, D, R);
$stop;
end
end
$stop;
end
endmodule
结果如图:
独热码状态机、SR锁存器延迟模型、移位除法器模型相关推荐
- Verilog中状态机编码方式的选择:二进制编码(Binary)、格雷码(Gray-code)编码、独热码(One-hot)编码
一般的,在Verilog中最常用的编码方式有二进制编码(Binary).格雷码(Gray-code)编码.独热码(One-hot)编码. 二进制码和格雷码是压缩状态编码. 若使用格雷编码,则相邻状态转 ...
- 状态机与独热码、格雷码、二进制码
状态机 简称FSM,也叫同步有限状态机 同步:同步的意思就是在系统时钟的作用下 有限:有限代表状态机中的状态是有限的 根据影响输出分为两大类,一为Moore.二为Mealy Moore:若最后的输出只 ...
- 【Verilog基础】为什么状态机中多使用独热码,而不是二进制码或者格雷码?
为什么例子中我们使用的是独热码而非二进制码或格雷码呢? 那就要从每种编码的特性上说起了,首先独热码因为每个状态只有 1bit 是不同的,例如在执行到(state== TWO)这条语句时,综合器会识别出 ...
- verilog中状态机的三种编码方式的比较(二进制码、独热码、格雷码)
最近做了一个小项目,是关于状态机中三种编码方式的比较,总结了一下三种编码方式的不同,可以会在以后IC笔试面试过程中用到,简单记录一下三种编码方式的优缺点. 三种编码方式如下图所示:其中独热码只有一位为 ...
- HDLBits(十 三)学习笔记——Building Lager Circuits (1000计数器 —— FSM:One-hot logic equations独热码)
文章目录 1.Counter with period 1000 2.4-bit shift register and down counter(移位寄存器) 3.fsmseq 序列1101识别器 4. ...
- HDLBits 系列(37)此系列关于独热码的题目的疑问?
目录 背景 我的做法 第一题 第二题 第三题 解决办法 第一题 第二题 第三题 推荐 背景 目前为止,关于状态机独热码的题目,几乎没一个题目能做对,这令我疑惑?是不是题目的答案有问题?在此请大家一试? ...
- HDLBits 系列(25)独热码有限状态机实现的简单方式
目录 原题重现 一点解释 最终实现 原题重现 The following is the state transition table for a Moore state machine with on ...
- FPGA中有限状态机的状态编码采用格雷码还是独热码?
今天看<从算法设计到硬件逻辑的实现>这本电子书时,遇到了一个问题,就是有限状态机的编写中,状态编码是采用格雷码还是独热码呢?究竟采用哪一种编码呢? 采用独热码为什么节省许多组合电路? 等等 ...
- FPGA学习笔记---二进制码、独热码、格雷码分析对比
在Verilog学习中常用的编码方式有二进制编码(Binary).格雷码(Gray-code)编码.独热码(One-hot)编码,对于新手来说,搞不清楚编码为什么要分这么多格式?统一用一种格式不好吗? ...
最新文章
- _捷豹F-pace汽车音响改装黄金声学,中道隔音——哈尔滨小蒋
- 大家都纷纷指出了 wp7 的优点 …
- Windows服务器上Mqtt服务器EMQX的安装使用
- ae这样设置导出比较快 480p比较适合快速看看demo的样子,注意tradeoff
- DM8168_ETV_V1.1开发板mount主机常见问题
- [待解决]自定义头像时使用vue-cropper进行图片裁剪,得到的是base64格式的图片,如何对接file类型的api接口
- 2016-12-17 新浪博客服务器挂掉了,所有博客页面都无法打开
- usb转并口支持linux,使用PCI转并口实现SJF刷写嵌入式开发板
- Google搜索正在“死亡”
- 【BZOJ2659】算不出的算式,打表找规律
- 力学,软体和刚体碰撞响应 以及 层次KDOP_OBB包围盒技术
- epic关于win7报错缺失api-ms-win-downlevel-kernel32-l2-1-0.dll
- JS小技巧 ----- 在onmousedown事件下避免文本选取
- 自定义JSON配置器
- MFC(VS2010)编程实例之一(Edit Control控件)
- 自制的基Ogre的场景编辑器—OgreSE
- 2022年MySQL8 OCP最新题库整理,传授有缘人
- 【AD15绘制原理图编译的一些警告的处理】
- No Target connected Target DLL has been cancelled(电压问题记录)
- revit二开之关联族参数的实现