通辽做家教的网站,阜阳室内设计学校,广州建网站的公司有哪些,网站空间送域名价格表1.1 语法
1、赋值语句 和 为阻塞赋值#xff0c;当该语句结束时#xff0c;下一个语句才开始执行#xff0c;串行执行 为非阻塞幅值#xff0c;该语句和整个语句块同时执行#xff0c;并行执行
1.2 ModelSim使用
1、修改源文件路径#xff1a;File - …1.1 语法
1、赋值语句 和 为阻塞赋值当该语句结束时下一个语句才开始执行串行执行 为非阻塞幅值该语句和整个语句块同时执行并行执行
1.2 ModelSim使用
1、修改源文件路径File - Source Directory/Change Directory
2、查看窗口View - Transcript/Project/Library
3、新建工程File-New-Project 添加文件夹名称
4、添加源文件和TB文件Project 右键- Add to Project. Existing File
5、编译Project 右键 - Compile All 如果出现黄色三角形的警告查看相关文件并修改重新编译 双击红色的警告可以看到.v文件哪里出现问题
6、仿真Simulate - Start Simulate - Design - work - 选择TB文件关闭Enable optimization
7、Libraries、SDF标准延迟文件
8、添加信号到波形图内sim-Default 右键添加Add Wave 某些信号看不到no data就重新仿真最好先添加信号再进行仿真。 修改Run Length 到适合的时长例如1usrun运行设置时长 左侧Restart重置信号。
9、命令行操作 .main clear 清空命令行 run 1us 波形运行1us
10、ctrlA全选信号 ctrlG:信号排序
1.3 Verilog
1、逻辑值
01X未知可能是1/0Z高阻态外部没有激励信号是一个悬空状态
2、进制二进制d、八进制o、十进制d和十六进制h
3、数值表示[数据位宽][进制][数] 例子1’b0 8’d255 16b’1001_1010_0000_1111下划线不影响程序读取
4、标识符定义模块名、端口名、信号名 任意一组字母、数字、$符号和_下划线 标识符第一个字符必须是字母或下划线区分大小写。 不建议大小写混合使用普通信号建议全部小写信号命名最好体现信号的含义简洁清晰易懂 例子sum、cpu_addr、clk_50、clk_cpu
5、数据类型寄存器、线网、参数前两个是真正在数字电路中起作用的 1寄存器类型reg默认初始值为X 例子 reg [31:0] delay_cnt; reg key_reg; 注reg类型只能在always和initial语句中被幅值。 时序逻辑always语句带有时钟信号则该寄存器变量对应为触发器 组合逻辑always语句不带有时钟信号则该寄存器变量对应为硬件连线 2线网类型表示结构实体之间的物理连线此变量不能存储值它的值由驱动它的元件所决定。 驱动线网类型变量的元件有门、连续幅值语句、assign。 如果没有驱动元件连接到线网上线网为高阻态z。 例子 wire key_flag; 3参数类型常量用parameter定义常量。 例子 parameter H_SYNC 11’d41; //行同步 parameter H_BACK 11’b2; //行显示后沿 parameter H_DISP 11’d480; //行有效数据 parameter H_FRONT 11’d2; //行显示前沿 parameter H_TOTAL 11’d525; //行扫描周期
参数型数据常用于定义状态机的状态、数据的位宽和延迟大小。 标识符、参数传递
6、运算符算数运算符 - * / %、关系运算符 !、逻辑运算符 ||、 条件运算符? : 例子a?b:ca为真选择b否则选择c、位运算符~ | ^、 移位运算符 例子8’b11110000 2 2’b00111100,0填充、拼接运算符{} 有优先级用括号
7、注释方式 // 和 /* */
8、关键字 变量名不能与关键字同名
9、框架 1模块block包括接口和逻辑功能 例子
module block(a,b,c,d);input a,b;output c,d;assign c a | b;assign d a b;
endmodule每个verilog程序包括端口定义、IO说明、内部信号声明、功能定义。
注意有可以综合的语句和不可综合的语句仿真
2可综合的语句 assign、always、例化实例元件这三种逻辑功能是并行的。 2-1在always块中逻辑是顺序执行的。 而多个always块之间是并行的。 2-2模块调用:信号通过模块端口在模块之间传递。 例子 文件seg_led_static_top.v:
module seg_led_static_top(input sys_clk,input sys_rst_n,output [5:0] sel,output [7:0] seg_led
);parameter TIME_SHOW 25d25000_000;wire add_flag;//模块调用1time_count #(.MAX_NUM (TIME_SHOW) //参数传递) u_time_count(.clk (sys_clk),.rst_n (sys_rst_n),.flag (add_flag));//模块调用2必须按照模块定义顺序列写不推荐time_count #(.MAX_NUM (TIME_SHOW) //参数传递) u_time_count(sys_clk,sys_rst_n,add_flag);
endmodule其他文件 time_cout.v
module time_count(input clk,input rst_n,output reg flag
);parameter MAX_NUM 50000_00;
reg [24:0] cnt;10、结构语句 1initial在模块中只执行一次。常用来写测试文件产生仿真测试信号激励信号和对存储器赋初始值。 例子
initial beginsys_clk 1b0;sys_rst_n 1b0;touch_key 1b0;#20 sys_rst_n 1b0;
end2always不断重复活动但是只有和一定的时间控制结合在一起才有作用。 例子
always #10 sys_clk ~sys_clk;always的时间控制有边沿触发电平触发 可以是单个信号也可以是多个信号用or连接 例子
always (posedge sys_clk or negedge sys_rst_n) begin //敏感列表if (!sys_rst_n)counter 24d0;else if(counter 24d1000_0000)counter counter 1b1;elsecounter 24d0;
end边沿触发posedgenegedge的always常常描述时序逻辑行为。使用非阻塞幅值 电平触达的always常常描述组合逻辑行为。使用阻塞幅值 例子
always (a or b or c or d or e) beginout a ?(bc):(d e);
end可以用*代表所有变量(*)对后面语句块所有输入变量的变化都是敏感的
always (*) beginout a ?(bc):(d e);
end组合逻辑没有CLK信号时序逻辑有CLK信号具备记忆功能。 注意 1不允许在多各always块中对同一个变量进行幅值 2在同一个always块中不要既用非阻塞幅值又用阻塞赋值
11、条件语句 1if
if (a b)out data_1;2if else
if (a b)out data_1;
elseout data_2;3if else嵌套
if (fx1)out data_1;
else if(fx2)out data_2;
else if(fx3)out data_3;
elseout data_4;4使用begin和end包含多个语句
if (a) begin语句1语句2
end
else begin语句1语句2
end判断表达式的值若为0xz按照假进行处理若为1按照真处理。
5case语句 casez比较时不考虑表达式中的高阻态z。 casex比较时不考虑高阻态z和不定值x 例子
case(num)4h0 : seg_led 8b1111_0000;4h1 : seg_led 8b0000_0000;default : seg_led 8b1111_1111;
endcase注意num和n’hx必须位宽相等。
casex(sel)8b1100_zzzz : 语句1;8b1100_xxzz : 语句2;
endcase1.4 状态机
例子利用FPGA实现电子门锁。 序列检测器 1、状态机FSM在有限个状态之间按一定规律转换的时序电路
2、模型 1mealy状态机输出与输入信号和当前状态有关。 组合逻辑F-状态寄存器-组合逻辑G 2moore状态机输出只与当前状态有关。
3、状态机设计 1步骤状态空间定义状态跳转下个状态判断各个状态下的动作。 例子
/* part1:状态空间定义 */
//define state space
parameter SLEEP 2b00;
parameter STUDY 2b01;
parameter EAT 2b10;
parameter AMUSE 2b11;
//internal variable
reg [1:0] current_state;
reg [1:0] next_state;//独热码每个状态只有一个寄存器置位译码逻辑简单生成的电路简单。
parameter SLEEP 4b0001;
parameter STUDY 4b0010;
parameter EAT 4b0100;
parameter AMUSE 4b1000;
//internal variable
reg [3:0] current_state;
reg [3:0] next_state;/* part2:状态跳转 */
//transition
always (posedge clk or negedge rst_n) begin //敏感列表时钟信号以及复位信号边沿的组合if(!rst_n)current_state SLEEP;elsecurrent_state next_state; //使用非阻塞赋值
end/* part3:下个状态判断组合逻辑 */
//next state decision
always (current_state or input_signals) begincase (current_state)SLEEP :beginif (clock_alarm)next_state STUDY;elsenext_state SLEEP;endSTUDY :beginif (lunch_time)next_state EAT;elsenext_state STUDY;endEAT :beginif (lunch_time)next_state EAT;elsenext_state STUDY;endAMUSE :beginif (lunch_time)next_state EAT;elsenext_state STUDY;enddefault:beginif (lunch_time)next_state EAT;elsenext_state STUDY;endendcase
end注意 1组合逻辑使用阻塞赋值 2if/else要配对以免产生latch锁存器case的状态如果没有给完全必须要给default否则也会生成latch
/* part4各个状态下的动作组合逻辑 */
//action
wire read_book;
assign read_book (current_state STUDY) ? 1b1 : 1b0;always (current_state) beginif(current_state STUDY)read_book 1b1;elseread_book 1b0;
end注意组合逻辑使用阻塞赋值
一个三段式状态机例子divider7_fsm.v 三段式可以在组合逻辑后再增加一级寄存器时序逻辑有clk信号输入来实现时序逻辑输出 1可以有效滤除组合逻辑输出的毛刺 2可以有效地进行时序计算和约束 3对总线形式的输出信号来说容易使总线数据对齐从而减小总线数据间的偏移减小接收端数据采样出错的频率。